From e47607597caf44834af00565295936b663a22d95 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 15 Jan 2024 14:52:17 +0000 Subject: [PATCH] Solved some bugs related to the payment page --- src/components/Navbar.tsx | 12 ++++++++++-- src/pages/(status)/PaymentDue.tsx | 2 +- src/pages/api/groups/index.ts | 24 +++++++++--------------- src/utils/groups.ts | 10 ++++++++++ 4 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 src/utils/groups.ts diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index e6ac2460..f7e4666e 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -7,9 +7,11 @@ import {BsList} from "react-icons/bs"; import clsx from "clsx"; import moment from "moment"; import MobileMenu from "./MobileMenu"; -import {useState} from "react"; +import {useEffect, useState} from "react"; import {Type} from "@/interfaces/user"; import {USER_TYPE_LABELS} from "@/resources/user"; +import useGroups from "@/hooks/useGroups"; +import {isUserFromCorporate} from "@/utils/groups"; interface Props { user: User; @@ -22,6 +24,7 @@ interface Props { /* eslint-disable @next/next/no-img-element */ export default function Navbar({user, path, navDisabled = false, focusMode = false, onFocusLayerMouseEnter}: Props) { const [isMenuOpen, setIsMenuOpen] = useState(false); + const [disablePaymentPage, setDisablePaymentPage] = useState(true); const disableNavigation = preventNavigation(navDisabled, focusMode); const router = useRouter(); @@ -44,6 +47,11 @@ export default function Navbar({user, path, navDisabled = false, focusMode = fal return today.add(7, "days").isAfter(momentDate); }; + useEffect(() => { + if (user.type !== "student" && user.type !== "teacher") setDisablePaymentPage(false); + isUserFromCorporate(user.id).then((result) => setDisablePaymentPage(result)); + }, [user]); + return ( <> {user && setIsMenuOpen(false)} user={user} />} @@ -55,7 +63,7 @@ export default function Navbar({user, path, navDisabled = false, focusMode = fal
{showExpirationDate() && ( users?.find((u) => u.id === g.admin)?.type).filter((t) => !!t); - return userGroupsAdminTypes.every((t) => t !== "admin"); + return userGroupsAdminTypes.every((t) => t !== "corporate"); }; return ( diff --git a/src/pages/api/groups/index.ts b/src/pages/api/groups/index.ts index 95d736f4..f39ec3bd 100644 --- a/src/pages/api/groups/index.ts +++ b/src/pages/api/groups/index.ts @@ -1,7 +1,7 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction import type {NextApiRequest, NextApiResponse} from "next"; import {app} from "@/firebase"; -import {getFirestore, collection, getDocs, setDoc, doc} from "firebase/firestore"; +import {getFirestore, collection, getDocs, setDoc, doc, query, where} from "firebase/firestore"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; import {Group} from "@/interfaces/user"; @@ -22,25 +22,19 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { } async function get(req: NextApiRequest, res: NextApiResponse) { - const {admin} = req.query as {admin: string}; - const snapshot = await getDocs(collection(db, "groups")); + const {admin, participant} = req.query as {admin: string; participant: string}; - const groups: Group[] = snapshot.docs.map((doc) => ({ + const queryConstraints = [ + ...(admin ? [where("admin", "==", admin)] : []), + ...(participant ? [where("participants", "array-contains", participant)] : []), + ]; + const snapshot = await getDocs(queryConstraints.length > 0 ? query(collection(db, "groups"), ...queryConstraints) : collection(db, "groups")); + const groups = snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data(), })) as Group[]; - if (admin) { - res.status(200).json(groups.filter((x) => x.admin === admin)); - return; - } - - res.status(200).json( - snapshot.docs.map((doc) => ({ - id: doc.id, - ...doc.data(), - })), - ); + res.status(200).json(groups); } async function post(req: NextApiRequest, res: NextApiResponse) { diff --git a/src/utils/groups.ts b/src/utils/groups.ts new file mode 100644 index 00000000..1bb59388 --- /dev/null +++ b/src/utils/groups.ts @@ -0,0 +1,10 @@ +import {Group, User} from "@/interfaces/user"; +import axios from "axios"; + +export const isUserFromCorporate = async (userID: string) => { + const groups = (await axios.get(`/api/groups?participant=${userID}`)).data; + const users = (await axios.get("/api/users/list")).data; + + const adminTypes = groups.map((g) => users.find((u) => u.id === g.admin)?.type); + return adminTypes.includes("corporate"); +};