Skip to content

Commit eed95c8

Browse files
Add auth-guard
1 parent 0d9553b commit eed95c8

File tree

3 files changed

+76
-23
lines changed

3 files changed

+76
-23
lines changed

apps/frontend/src/app/page.tsx

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import {
4848
ValidateUser,
4949
VerifyTokenResponseType,
5050
} from "./services/user";
51+
import { useRouter } from 'next/navigation';
5152

5253
/**
5354
* defines the State of the page whe a user is deleing an object. Has 3 general states:
@@ -123,27 +124,31 @@ export default function Home() {
123124
// State for refreshing data
124125
const [refresh, setRefresh] = useState(false);
125126

126-
// used to check if user jwt is verified
127+
// used to check if user JWT is verified
127128

128129
const [userId, setUserId] = useState<string | undefined>(undefined);
129130
const [email, setEmail] = useState<string | undefined>(undefined);
130131
const [username, setUsername] = useState<string | undefined>(undefined);
131132
const [isAdmin, setIsAdmin] = useState<boolean | undefined>(undefined);
132-
// useLayoutEffect(() => {
133-
// var isAuth = false;
134-
135-
// ValidateUser().then((data: VerifyTokenResponseType) => {
136-
// setUserId(data.data.id);
137-
// setEmail(data.data.email);
138-
// setUsername(data.data.username);
139-
// setIsAdmin(data.data.isAdmin);
140-
// isAuth = true;
141-
// }).finally(() => {
142-
// if(!isAuth){
143-
// redirect("/login")
144-
// }
145-
// });
146-
// }, [])
133+
134+
const router = useRouter();
135+
136+
useLayoutEffect(() => {
137+
var isAuth = false;
138+
139+
ValidateUser().then((data: VerifyTokenResponseType) => {
140+
setUserId(data.data.id);
141+
setEmail(data.data.email);
142+
setUsername(data.data.username);
143+
setIsAdmin(data.data.isAdmin);
144+
isAuth = true;
145+
}).finally(() => {
146+
if(!isAuth){
147+
// cannot verify
148+
router.push('/login'); // Client-side redirect using router.push
149+
}
150+
});
151+
}, [router])
147152

148153
const handleEditClick = (index: number, question: Question) => {
149154
// Open the modal for the specific question

apps/frontend/src/app/profile/page.tsx

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ import {
1414
import { Content } from "antd/es/layout/layout";
1515
import "./styles.scss";
1616
import { EditOutlined, SaveOutlined } from "@ant-design/icons";
17-
import { useEffect, useState } from "react";
17+
import { useEffect, useState, useLayoutEffect } from "react";
1818
import {
1919
UpdateUser,
2020
ValidateUser,
2121
VerifyTokenResponseType,
2222
} from "../services/user";
23+
import { useRouter } from 'next/navigation';
2324

2425
interface ProfilePageProps {}
2526

@@ -32,6 +33,30 @@ const ProfilePage = (props: ProfilePageProps): JSX.Element => {
3233
const [refresh, setRefresh] = useState<boolean>(false);
3334
const [messageApi, contextHolder] = message.useMessage();
3435

36+
// used to check if user JWT is verified
37+
38+
const [userId, setUserId] = useState<string | undefined>(undefined);
39+
const [isAdmin, setIsAdmin] = useState<boolean | undefined>(undefined);
40+
41+
const router = useRouter();
42+
43+
useLayoutEffect(() => {
44+
var isAuth = false;
45+
46+
ValidateUser().then((data: VerifyTokenResponseType) => {
47+
setUserId(data.data.id);
48+
setEmail(data.data.email);
49+
setUsername(data.data.username);
50+
setIsAdmin(data.data.isAdmin);
51+
isAuth = true;
52+
}).finally(() => {
53+
if(!isAuth){
54+
// cannot verify
55+
router.push('/login'); // Client-side redirect using router.push
56+
}
57+
});
58+
}, [router])
59+
3560
useEffect(() => {
3661
ValidateUser().then((data: VerifyTokenResponseType) => {
3762
form.setFieldsValue({

apps/frontend/src/app/question/[id]/page.tsx

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ import TextArea from "antd/es/input/TextArea";
3232
import { useSearchParams } from "next/navigation";
3333
import { ProgrammingLanguageOptions } from "@/utils/SelectOptions";
3434
import { isAuthenticated } from "@/utils/Auth";
35-
import { redirect } from 'next/navigation';
35+
import {
36+
ValidateUser,
37+
VerifyTokenResponseType,
38+
} from "../../services/user";
39+
import { useRouter } from 'next/navigation';
3640

3741
export default function Home() {
3842
const [isLoading, setIsLoading] = useState<boolean>(true); // Store the states related to table's loading
@@ -60,12 +64,31 @@ export default function Home() {
6064
const [description, setDescription] = useState<string | undefined>(undefined);
6165
const [selectedItem, setSelectedItem] = useState("python"); // State to hold the selected language item
6266

67+
// used to check if user JWT is verified
68+
69+
const [userId, setUserId] = useState<string | undefined>(undefined);
70+
const [email, setEmail] = useState<string | undefined>(undefined);
71+
const [username, setUsername] = useState<string | undefined>(undefined);
72+
const [isAdmin, setIsAdmin] = useState<boolean | undefined>(undefined);
73+
74+
const router = useRouter();
75+
6376
useLayoutEffect(() => {
64-
const isAuth = isAuthenticated;
65-
if(!isAuth){
66-
redirect("/login")
67-
}
68-
}, [])
77+
var isAuth = false;
78+
79+
ValidateUser().then((data: VerifyTokenResponseType) => {
80+
setUserId(data.data.id);
81+
setEmail(data.data.email);
82+
setUsername(data.data.username);
83+
setIsAdmin(data.data.isAdmin);
84+
isAuth = true;
85+
}).finally(() => {
86+
if(!isAuth){
87+
// cannot verify
88+
router.push('/login'); // Client-side redirect using router.push
89+
}
90+
});
91+
}, [router])
6992

7093
// When code editor page is initialised, fetch the particular question, and display in code editor
7194
useEffect(() => {

0 commit comments

Comments
 (0)