diff --git a/src/components/ProfileCard.tsx b/src/components/ProfileCard.tsx index b846e4cc..47db3699 100644 --- a/src/components/ProfileCard.tsx +++ b/src/components/ProfileCard.tsx @@ -3,6 +3,7 @@ import {User} from "@/interfaces/user"; import clsx from "clsx"; import LevelLabel from "./LevelLabel"; import LevelProgressBar from "./LevelProgressBar"; +import {Avatar} from "primereact/avatar"; interface Props { user: User; @@ -13,8 +14,11 @@ export default function ProfileCard({user, className}: Props) { return (
-
- Profile picture +
+ {user.profilePicture.length > 0 && Profile picture} + {user.profilePicture.length === 0 && ( + + )}
{user.name} diff --git a/src/pages/api/user.ts b/src/pages/api/user.ts index 6d759c43..a7b28086 100644 --- a/src/pages/api/user.ts +++ b/src/pages/api/user.ts @@ -1,10 +1,14 @@ import {app} from "@/firebase"; +import {User} from "@/interfaces/user"; import {sessionOptions} from "@/lib/session"; import {getAuth} from "firebase/auth"; +import {doc, getDoc, getFirestore} from "firebase/firestore"; import {withIronSessionApiRoute} from "iron-session/next"; import {NextApiRequest, NextApiResponse} from "next"; const auth = getAuth(app); +const db = getFirestore(app); + export default withIronSessionApiRoute(user, sessionOptions); async function user(req: NextApiRequest, res: NextApiResponse) { @@ -14,12 +18,23 @@ async function user(req: NextApiRequest, res: NextApiResponse) { return; } - if (req.session.user.id === auth.currentUser.uid) { + if (req.session.user.id !== auth.currentUser.uid) { res.status(401).json(undefined); return; } - res.json(req.session.user); + const docUser = await getDoc(doc(db, "users", req.session.user.id)); + if (!docUser.exists()) { + res.status(401).json(undefined); + return; + } + + const user = docUser.data() as User; + + req.session.user = {...user, id: req.session.user.id}; + await req.session.save(); + + res.json({...user, id: req.session.user.id}); } else { res.status(401).json(undefined); } diff --git a/src/pages/exam/index.tsx b/src/pages/exam/index.tsx index 6579b4d5..f01f19fe 100644 --- a/src/pages/exam/index.tsx +++ b/src/pages/exam/index.tsx @@ -17,6 +17,7 @@ import {sessionOptions} from "@/lib/session"; import {Stat, User} from "@/interfaces/user"; import Speaking from "@/exams/Speaking"; import {v4 as uuidv4} from "uuid"; +import useUser from "@/hooks/useUser"; export const getServerSideProps = withIronSessionSsr(({req, res}) => { const user = req.session.user; @@ -37,7 +38,7 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => { }; }, sessionOptions); -export default function Page({user}: {user: User}) { +export default function Page() { const [userSolutions, setUserSolutions] = useState([]); const [selectedModules, setSelectedModules] = useState([]); const [hasBeenUploaded, setHasBeenUploaded] = useState(false); @@ -47,6 +48,8 @@ export default function Page({user}: {user: User}) { const [exam, setExam] = useState(); const [timer, setTimer] = useState(-1); + const {user} = useUser({redirectTo: "/login"}); + useEffect(() => setSessionId(uuidv4()), []); useEffect(() => { @@ -67,7 +70,7 @@ export default function Page({user}: {user: User}) { session: sessionId, exam: solution.exam!, module: solution.module!, - user: user.id, + user: user?.id || "", })); axios @@ -126,13 +129,13 @@ export default function Page({user}: {user: User}) { const renderScreen = () => { if (selectedModules.length === 0) { - return ; + return ; } if (moduleIndex >= selectedModules.length) { return ( { setShowSolutions(true); @@ -184,10 +187,12 @@ export default function Page({user}: {user: User}) { -
- - {renderScreen()} -
+ {user && ( +
+ + {renderScreen()} +
+ )} ); } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index b09b47ec..10a05dad 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -10,6 +10,7 @@ import {useEffect, useState} from "react"; import useStats from "@/hooks/useStats"; import {averageScore, formatModuleTotalStats, totalExams} from "@/utils/stats"; import {Divider} from "primereact/divider"; +import useUser from "@/hooks/useUser"; export const getServerSideProps = withIronSessionSsr(({req, res}) => { const user = req.session.user; @@ -30,10 +31,12 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => { }; }, sessionOptions); -export default function Home({user}: {user: User}) { +export default function Home() { const [showEndExam, setShowEndExam] = useState(false); const [windowWidth, setWindowWidth] = useState(0); + const {stats, isLoading} = useStats(); + const {user} = useUser({redirectTo: "/login"}); useEffect(() => setShowEndExam(window.innerWidth <= 960), []); useEffect(() => setWindowWidth(window.innerWidth), []); @@ -49,34 +52,36 @@ export default function Home({user}: {user: User}) { -
- -
-
-
- -
- {windowWidth <= 960 && } -
- Statistics - {!isLoading && stats && ( -
-
- Exams: {totalExams(stats)} - Exercises: {stats.length} - Average Score: {averageScore(stats)}% + {user && ( +
+ +
+
+
+ +
+ {windowWidth <= 960 && } +
+ Statistics + {!isLoading && stats && ( +
+
+ Exams: {totalExams(stats)} + Exercises: {stats.length} + Average Score: {averageScore(stats)}% +
-
- )} -
-
- {!isLoading && stats && ( -
- + )} +
- )} -
- + {!isLoading && stats && ( +
+ +
+ )} +
+ + )} ); } diff --git a/src/pages/stats.tsx b/src/pages/stats.tsx index 16ae93a1..b90bdf6b 100644 --- a/src/pages/stats.tsx +++ b/src/pages/stats.tsx @@ -60,15 +60,17 @@ export default function Stats({user}: {user: User}) {
- setAutocompleteValue(e.target.value)} - completeMethod={search} - onSelect={(e) => setSelectedUser(e.value)} - dropdown - /> + {!isLoading && ( + setAutocompleteValue(e.target.value)} + completeMethod={search} + onSelect={(e) => setSelectedUser(e.value)} + dropdown + /> + )}