Skip to content

Commit ba367b6

Browse files
authored
Merge pull request #505 from ShubhamMewara/main
added section for Cohort 3
2 parents b7b68a9 + c0f0567 commit ba367b6

File tree

13 files changed

+314
-61
lines changed

13 files changed

+314
-61
lines changed

apps/web/components/ModeToggle.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { MoonIcon, SunIcon } from "@radix-ui/react-icons";
33
import { useTheme } from "next-themes";
44
import { Button } from "@repo/ui";
55

6-
76
export function ModeToggle() {
87
const { theme,setTheme } = useTheme();
98

apps/web/components/Tracks.tsx

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { category } from "@repo/store";
55
import { Track, Problem } from "@prisma/client";
66
import { useRecoilValue } from "recoil";
77
import { useEffect, useState } from "react";
8-
import { Select, SelectTrigger, SelectValue, SelectContent, SelectGroup, SelectItem } from "@repo/ui";
8+
import { Select, SelectTrigger, SelectValue, SelectContent, SelectGroup, SelectItem, Switch, Label } from "@repo/ui";
99

1010
interface TrackPros extends Track {
1111
problems: Problem[];
@@ -21,9 +21,13 @@ export const Tracks = ({ tracks }: { tracks: TrackPros[] }) => {
2121
const selectedCategory = useRecoilValue(category);
2222
const [filteredTracks, setFilteredTracks] = useState<TrackPros[]>(tracks);
2323
const [sortBy, setSortBy] = useState<string>("");
24-
24+
const [cohort3, setCohort3] = useState<boolean>(false);
25+
2526
const filterTracks = () => {
2627
let filteredTracks = tracks;
28+
if (cohort3) {
29+
filteredTracks = filteredTracks.filter((t) => t.cohort === 3);
30+
}
2731
if (selectedCategory.length > 0) {
2832
filteredTracks = filteredTracks.filter((t) => t.categories.some((c) => c.category.category === selectedCategory));
2933
}
@@ -44,39 +48,46 @@ export const Tracks = ({ tracks }: { tracks: TrackPros[] }) => {
4448
};
4549
useEffect(() => {
4650
filterTracks();
47-
}, [selectedCategory]);
51+
}, [selectedCategory,cohort3]);
4852
useEffect(() => {
4953
sortTracks(sortBy);
5054
}, [sortBy]);
5155
return (
5256
<div>
53-
<Select
54-
onValueChange={(e) => {
55-
setSortBy(e);
56-
}}
57-
>
58-
<SelectTrigger className="w-[250px] mx-auto mt-6">
59-
<SelectValue placeholder="Sort by" />
60-
</SelectTrigger>
61-
<SelectContent
62-
ref={(ref)=>{
63-
if(!ref) return;
64-
ref.ontouchstart = (e)=>{
65-
e.preventDefault();
66-
}
67-
}}>
68-
<SelectGroup>
69-
<SelectItem value="ascending">Ascending (A to Z)</SelectItem>
70-
<SelectItem value="descending">Descending (Z to A)</SelectItem>
71-
<SelectItem value="new">Newest first</SelectItem>
72-
<SelectItem value="old">Oldest first</SelectItem>
73-
</SelectGroup>
74-
</SelectContent>
75-
</Select>
57+
<div className="flex flex-col gap-4 md:flex-row items-center justify-evenly mt-6">
58+
<Select
59+
onValueChange={(e) => {
60+
setSortBy(e);
61+
}}
62+
>
63+
<SelectTrigger className="max-w-[250px]">
64+
<SelectValue placeholder="Sort by" />
65+
</SelectTrigger>
66+
<SelectContent
67+
ref={(ref) => {
68+
if (!ref) return;
69+
ref.ontouchstart = (e) => {
70+
e.preventDefault();
71+
};
72+
}}
73+
>
74+
<SelectGroup>
75+
<SelectItem value="ascending">Ascending (A to Z)</SelectItem>
76+
<SelectItem value="descending">Descending (Z to A)</SelectItem>
77+
<SelectItem value="new">Newest first</SelectItem>
78+
<SelectItem value="old">Oldest first</SelectItem>
79+
</SelectGroup>
80+
</SelectContent>
81+
</Select>
82+
<div className="flex items-center space-x-2">
83+
<Switch id="cohort 3" checked={cohort3} onCheckedChange={(e)=>setCohort3(e.valueOf())} />
84+
<Label htmlFor="cohort-3">Cohort 3 Only</Label>
85+
</div>
86+
</div>
7687
<ul className="p-8 md:20 grid grid-cols-1 gap-x-6 gap-y-8 place-items-center lg:grid-cols-2 w-full">
7788
{filteredTracks.map((t) => (
7889
<li key={t.id} className="max-w-screen-md w-full">
79-
<TrackCard track={t} />
90+
<TrackCard track={t} />
8091
</li>
8192
))}
8293
</ul>

apps/web/components/admin/CompleteAddTracks.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import { useEffect, useState } from "react";
33
import { Input, Button } from "@repo/ui";
44
import { Categories } from "@prisma/client";
55
import CompleteTrackCard from "./CompleteTrackCard";
6+
import EditCategories from "./EditCategories";
67

78
export interface CompleteTrack {
89
trackId: string;
910
trackTitle: string;
1011
trackDescription: string;
1112
trackImage: string;
1213
selectedCategory: string[];
14+
cohort: string;
1315
}
1416

1517
const CompleteAddTracks = ({ categories }: { categories: Categories[] }) => {
@@ -18,6 +20,7 @@ const CompleteAddTracks = ({ categories }: { categories: Categories[] }) => {
1820
const [trackTitle, setTrackTitle] = useState("");
1921
const [trackDescription, setTrackDescription] = useState("");
2022
const [trackImage, setTrackImage] = useState("");
23+
const [cohort, setCohort] = useState<string>("3");
2124
const [selectedCategory, setSelectedCategory] = useState<string[]>([]);
2225
const [trackData, setTrackData] = useState<CompleteTrack>({} as CompleteTrack);
2326

@@ -30,7 +33,7 @@ const CompleteAddTracks = ({ categories }: { categories: Categories[] }) => {
3033
}
3134

3235
useEffect(() => {
33-
setTrackData({ trackId, trackDescription, trackTitle, trackImage, selectedCategory });
36+
setTrackData({ trackId, trackDescription, trackTitle, trackImage, selectedCategory, cohort });
3437
}, [trackId, trackDescription, trackTitle, trackImage,selectedCategory]);
3538
return (
3639
<div className="flex flex-col justify-center">
@@ -60,6 +63,10 @@ const CompleteAddTracks = ({ categories }: { categories: Categories[] }) => {
6063
<div className="mr-3">{"NotionId: "}</div>
6164
<Input className="w-1/3 mr-3" onChange={(e) => setNotionId(e.target.value)} placeholder="NotionId" />
6265
</div>
66+
<div className="flex justify-center">
67+
<div className="mr-3">{"Cohort: "}</div>
68+
<Input className="w-1/3 mr-3" type="number" value={cohort} onChange={(e) => setCohort(e.target.value)} placeholder="3" />
69+
</div>
6370
<div className="flex lg:flex-row justify-evenly mx-auto py-1">
6471
{categories.map((category, i) => (
6572
<Button
@@ -71,6 +78,7 @@ const CompleteAddTracks = ({ categories }: { categories: Categories[] }) => {
7178
{category.category}
7279
</Button>
7380
))}
81+
<EditCategories categories={categories} />
7482
</div>
7583
<div className="flex justify-center">
7684
<CompleteTrackCard notionId={notionId} TrackData={trackData} />

apps/web/components/admin/CompleteTrackCard.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ interface CompleteTrackCardProps {
1111
trackDescription: string;
1212
trackImage: string;
1313
selectedCategory: string[];
14+
cohort: string;
1415
}
1516

1617
export interface Problem {
@@ -32,6 +33,7 @@ const CompleteTrackCard = ({ notionId, TrackData }: { notionId: string; TrackDat
3233
hidden: false,
3334
problems: problems,
3435
selectedCategory: TrackData.selectedCategory,
36+
cohort: parseInt(TrackData.cohort),
3537
});
3638
await insertData(TrackData.trackId);
3739
setIsSubmitting(true);
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
"use client";
2+
import { Button, toast } from "@repo/ui";
3+
import {
4+
Dialog,
5+
DialogContent,
6+
DialogDescription,
7+
DialogFooter,
8+
DialogHeader,
9+
DialogTitle,
10+
DialogTrigger,
11+
} from "@repo/ui";
12+
import { Input } from "@repo/ui";
13+
import { Label } from "@repo/ui";
14+
import { Trash2 } from "lucide-react";
15+
import { useState } from "react";
16+
import { addCategory, deleteCategory } from "../utils";
17+
import { useRouter } from "next/navigation";
18+
19+
const EditCategories = ({
20+
categories,
21+
}: {
22+
categories: {
23+
id: string;
24+
category: string;
25+
}[];
26+
}) => {
27+
const router = useRouter();
28+
const [newCategory, setNewCategory] = useState<string>("");
29+
async function handleAddCategory() {
30+
if (!newCategory) {
31+
toast({
32+
title: "Category cannot be empty",
33+
description: "Please enter a category",
34+
});
35+
return;
36+
}
37+
toast({
38+
title: "Adding category",
39+
});
40+
try {
41+
await addCategory(newCategory);
42+
router.refresh();
43+
toast({
44+
title: "Category added",
45+
description: `Category ${newCategory} added`,
46+
});
47+
} catch (error) {
48+
toast({
49+
title: "Error adding category",
50+
});
51+
}
52+
}
53+
async function handleDeleteCategory(categoryId: string) {
54+
toast({
55+
title: "Deleting category",
56+
});
57+
try {
58+
await deleteCategory(categoryId);
59+
router.refresh();
60+
toast({
61+
title: "Category deleted",
62+
});
63+
} catch (error) {
64+
toast({
65+
title: "Error deleting category",
66+
});
67+
}
68+
}
69+
return (
70+
<Dialog>
71+
<DialogTrigger asChild>
72+
<Button variant="outline">Edit categories</Button>
73+
</DialogTrigger>
74+
<DialogContent className="sm:max-w-[425px]">
75+
<div className="grid gap-4 py-4">
76+
{categories.map((category) => (
77+
<div key={category.id} className="flex justify-between">
78+
<Label>{category.category}</Label>
79+
<Button onClick={() =>handleDeleteCategory(category.id)} variant={"outline"} size={"sm"}>
80+
<Trash2 size={16} />
81+
</Button>
82+
</div>
83+
))}
84+
</div>
85+
<Input value={newCategory} onChange={(e) => setNewCategory(e.target.value)} placeholder="Add new category" />
86+
<DialogFooter>
87+
<Button onClick={handleAddCategory}>Add</Button>
88+
</DialogFooter>
89+
</DialogContent>
90+
</Dialog>
91+
);
92+
};
93+
94+
export default EditCategories;

0 commit comments

Comments
 (0)