Skip to content

Commit bbba0dc

Browse files
authored
Merge pull request #70 from CS3219-AY2425S1/ms3-frontend
MS3 Frontend features
2 parents 6cbcdc3 + c275ad0 commit bbba0dc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+2908
-101
lines changed

frontend/package-lock.json

Lines changed: 108 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"clsx": "^2.1.1",
3030
"cmdk": "^1.0.0",
3131
"date-fns": "^3.6.0",
32+
"jsonwebtoken": "^9.0.2",
3233
"lucide-react": "^0.441.0",
3334
"next": "^14.2.10",
3435
"qs": "^6.13.0",

frontend/src/app/dashboard/_components/QuestionTable/QuestionTable.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,19 @@ import { QuestionsResponse } from "@/types/Question";
66
import { CategoriesResponse } from "@/types/Category";
77
import { questionTableColumns } from "./column";
88
import { DataTable } from "./data-table";
9+
import { redirect } from "next/navigation";
910

1011
export default async function QuestionTable() {
1112
const questionsResponse: QuestionsResponse = await getQuestions();
1213
const categoriesResponse: CategoriesResponse = await getQuestionCategories();
1314

15+
if (
16+
questionsResponse.statusCode === 401 ||
17+
categoriesResponse.statusCode === 401
18+
) {
19+
redirect("/signin");
20+
}
21+
1422
if (!questionsResponse.data) {
1523
return <div>{questionsResponse.message}</div>;
1624
}

frontend/src/app/dashboard/_components/QuestionTable/data-table-toolbar.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { Table } from "@tanstack/react-table";
88
import { CreateQuestionModal } from "../Forms/CreateQuestionModal";
99
import { QuestionTableContext } from "@/contexts/QuestionTableContext";
1010
import { useContext } from "react";
11+
import { useUser } from "@/contexts/UserContext";
12+
import { RoleEnum } from "@/types/Role";
1113

1214
interface DataTableToolbarProps<TData> {
1315
table: Table<TData>;
@@ -17,6 +19,7 @@ interface DataTableToolbarProps<TData> {
1719
export default function DataTableToolbar<TData>({
1820
table,
1921
}: DataTableToolbarProps<TData>) {
22+
const user = useUser();
2023
const { categories } = useContext(QuestionTableContext);
2124

2225
return (
@@ -62,10 +65,12 @@ export default function DataTableToolbar<TData>({
6265
/>
6366
</div>
6467
<CreateQuestionModal>
65-
<Button variant="soft">
66-
<LucidePlus className="mr-2" />
67-
Create question
68-
</Button>
68+
{user?.roles.includes(RoleEnum.enum.admin) && (
69+
<Button variant="soft">
70+
<LucidePlus className="mr-2" />
71+
Create question
72+
</Button>
73+
)}
6974
</CreateQuestionModal>
7075
</div>
7176
</div>

frontend/src/app/dashboard/_components/QuestionTable/data-table.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ import {
2121
TableRow,
2222
} from "@/components/ui/table";
2323

24-
import { useState } from "react";
24+
import { useMemo, useState } from "react";
2525

2626
import { DataTablePagination } from "./data-table-pagination";
2727

2828
import DataTableToolbar from "./data-table-toolbar";
2929

3030
import { Card } from "@/components/ui/card";
3131
import { QuestionTableProvider } from "@/contexts/QuestionTableContext";
32+
import { useUser } from "@/contexts/UserContext";
3233

3334
interface DataTableProps<TData, TValue> {
3435
columns: ColumnDef<TData, TValue>[];
@@ -40,12 +41,22 @@ export function DataTable<TData, TValue>({
4041
columns,
4142
data,
4243
}: DataTableProps<TData, TValue>) {
44+
const user = useUser();
45+
46+
const isAdmin = useMemo(() => {
47+
return user?.roles.includes("admin");
48+
}, [user]);
49+
50+
const filteredColumns = isAdmin
51+
? columns
52+
: columns.filter((column) => column.id !== "Action");
53+
4354
const [sorting, setSorting] = useState<SortingState>([]);
4455
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);
4556

4657
const table = useReactTable({
4758
data,
48-
columns,
59+
columns: filteredColumns,
4960
getCoreRowModel: getCoreRowModel(),
5061
getPaginationRowModel: getPaginationRowModel(),
5162
onSortingChange: setSorting,
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
"use client";
2+
3+
import { useUser } from "@/contexts/UserContext";
4+
15
export default function WelcomeMessage() {
2-
return <h1 className="text-xl font-bold">Welcome Back, {"[user name]"}!</h1>;
6+
const user = useUser();
7+
8+
return <h1 className="text-xl font-bold">Welcome Back, {user?.email}!</h1>;
39
}
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
1+
// "use client";
2+
13
import Navbar from "@/components/Navbar";
24
import { Toaster } from "@/components/ui/toaster";
3-
import { ReactNode } from "react";
5+
import { UserProvider } from "@/contexts/UserContext";
6+
import React from "react";
7+
import { PropsWithChildren } from "react";
48

5-
export default function DashboardLayout({ children }: { children: ReactNode }) {
9+
export default function DashboardLayout({ children }: PropsWithChildren) {
610
return (
711
<>
8-
<Navbar />
9-
<main>{children}</main>
10-
<Toaster />
12+
<UserProvider>
13+
<Navbar />
14+
<main>{children}</main>
15+
<Toaster />
16+
</UserProvider>
1117
</>
1218
);
1319
}

frontend/src/app/globals.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
--destructive-foreground: #f7f9fb;
7373
--border: #2b3545;
7474
--input: #262626;
75+
--input-background-100: #404040;
7576
--input-foreground: #f3f4f6;
7677
--input-foreground-100: #9ca3af;
7778
--input: #262626;
@@ -117,6 +118,7 @@
117118
--destructive-foreground: #f7f9fb;
118119
--border: #2b3545;
119120
--input: #262626;
121+
--input-background-100: #404040;
120122
--input-foreground: #f3f4f6;
121123
--input-foreground-100: #9ca3af;
122124
--ring: #6f8ca4;

0 commit comments

Comments
 (0)