From d73b6d9d12e81c8f21a5598d5c9b4057c998939b Mon Sep 17 00:00:00 2001 From: Joao Ramos Date: Wed, 19 Jun 2024 23:00:43 +0100 Subject: [PATCH] Added badges for students --- src/components/Navbar.tsx | 283 ++++++++++++++++++++++++++------------ 1 file changed, 192 insertions(+), 91 deletions(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 02f82022..6c1320e5 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,118 +1,219 @@ -import {User} from "@/interfaces/user"; +import { User } from "@/interfaces/user"; import Link from "next/link"; import FocusLayer from "@/components/FocusLayer"; -import {preventNavigation} from "@/utils/navigation.disabled"; -import {useRouter} from "next/router"; -import {BsList, BsQuestionCircle, BsQuestionCircleFill} from "react-icons/bs"; +import { preventNavigation } from "@/utils/navigation.disabled"; +import { useRouter } from "next/router"; +import { BsList, BsQuestionCircle, BsQuestionCircleFill } from "react-icons/bs"; import clsx from "clsx"; import moment from "moment"; import MobileMenu from "./MobileMenu"; -import {useEffect, useState} from "react"; -import {Type} from "@/interfaces/user"; -import {USER_TYPE_LABELS} from "@/resources/user"; +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"; +import { isUserFromCorporate } from "@/utils/groups"; import Button from "./Low/Button"; import Modal from "./Modal"; import Input from "./Low/Input"; import TicketSubmission from "./High/TicketSubmission"; +import { Module } from "@/interfaces"; +import Badge from "./Low/Badge"; +import { + BsArrowRepeat, + BsBook, + BsCheck, + BsCheckCircle, + BsClipboard, + BsHeadphones, + BsMegaphone, + BsPen, + BsXCircle, +} from "react-icons/bs"; interface Props { - user: User; - navDisabled?: boolean; - focusMode?: boolean; - onFocusLayerMouseEnter?: () => void; - path: string; + user: User; + navDisabled?: boolean; + focusMode?: boolean; + onFocusLayerMouseEnter?: () => void; + path: string; } /* 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 [isTicketOpen, setIsTicketOpen] = useState(false); +export default function Navbar({ + user, + path, + navDisabled = false, + focusMode = false, + onFocusLayerMouseEnter, +}: Props) { + const [isMenuOpen, setIsMenuOpen] = useState(false); + const [disablePaymentPage, setDisablePaymentPage] = useState(true); + const [isTicketOpen, setIsTicketOpen] = useState(false); - const router = useRouter(); + const router = useRouter(); - const disableNavigation = preventNavigation(navDisabled, focusMode); + const disableNavigation = preventNavigation(navDisabled, focusMode); - const expirationDateColor = (date: Date) => { - const momentDate = moment(date); - const today = moment(new Date()); + const expirationDateColor = (date: Date) => { + const momentDate = moment(date); + const today = moment(new Date()); - if (today.add(1, "days").isAfter(momentDate)) return "!bg-mti-red-ultralight border-mti-red-light"; - if (today.add(3, "days").isAfter(momentDate)) return "!bg-mti-rose-ultralight border-mti-rose-light"; - if (today.add(7, "days").isAfter(momentDate)) return "!bg-mti-orange-ultralight border-mti-orange-light"; - }; + if (today.add(1, "days").isAfter(momentDate)) + return "!bg-mti-red-ultralight border-mti-red-light"; + if (today.add(3, "days").isAfter(momentDate)) + return "!bg-mti-rose-ultralight border-mti-rose-light"; + if (today.add(7, "days").isAfter(momentDate)) + return "!bg-mti-orange-ultralight border-mti-orange-light"; + }; - const showExpirationDate = () => { - if (!user.subscriptionExpirationDate) return false; + const showExpirationDate = () => { + if (!user.subscriptionExpirationDate) return false; - const momentDate = moment(user.subscriptionExpirationDate); - const today = moment(new Date()); + const momentDate = moment(user.subscriptionExpirationDate); + const today = moment(new Date()); - return today.add(7, "days").isAfter(momentDate); - }; + return today.add(7, "days").isAfter(momentDate); + }; - useEffect(() => { - if (user.type !== "student" && user.type !== "teacher") return setDisablePaymentPage(false); - isUserFromCorporate(user.id).then((result) => setDisablePaymentPage(result)); - }, [user]); + useEffect(() => { + if (user.type !== "student" && user.type !== "teacher") + return setDisablePaymentPage(false); + isUserFromCorporate(user.id).then((result) => + setDisablePaymentPage(result) + ); + }, [user]); - return ( - <> - setIsTicketOpen(false)} title="Submit a ticket"> - setIsTicketOpen(false)} /> - + const badges = [ + { + module: "reading", + icon: () => , + achieved: user.levels.reading >= user.desiredLevels.reading, + }, - {user && ( - setIsMenuOpen(false)} user={user} /> - )} -
- - EnCoach's Logo -

EnCoach

- -
- {/* OPEN TICKET SYSTEM */} - + { + module: "listening", + icon: () => , + achieved: user.levels.listening >= user.desiredLevels.listening, + }, + { + module: "writing", + icon: () => , + achieved: user.levels.writing >= user.desiredLevels.writing, + }, + { + module: "speaking", + icon: () => , + achieved: user.levels.speaking >= user.desiredLevels.speaking, + }, + { + module: "level", + icon: () => , + achieved: user.levels.level >= user.desiredLevels.level, + }, + ]; - {showExpirationDate() && ( - - {!user.subscriptionExpirationDate && "Unlimited"} - {user.subscriptionExpirationDate && moment(user.subscriptionExpirationDate).format("DD/MM/YYYY")} - - )} - - {user.name} - - {user.type === "corporate" ? `${user.corporateInformation?.companyInformation.name} |` : ""} {user.name} |{" "} - {USER_TYPE_LABELS[user.type]} - - -
setIsMenuOpen(true)}> - -
-
- {focusMode && } -
- - ); + return ( + <> + setIsTicketOpen(false)} + title="Submit a ticket" + > + setIsTicketOpen(false)} + /> + + + {user && ( + setIsMenuOpen(false)} + user={user} + /> + )} +
+ + EnCoach's Logo +

EnCoach

+ +
+ {user.type === "student" && + badges.map((badge) => ( +
+ {badge.icon()} +
+ ))} + {/* OPEN TICKET SYSTEM */} + + + {showExpirationDate() && ( + + {!user.subscriptionExpirationDate && "Unlimited"} + {user.subscriptionExpirationDate && + moment(user.subscriptionExpirationDate).format("DD/MM/YYYY")} + + )} + + {user.name} + + {user.type === "corporate" + ? `${user.corporateInformation?.companyInformation.name} |` + : ""}{" "} + {user.name} | {USER_TYPE_LABELS[user.type]} + + +
setIsMenuOpen(true)} + > + +
+
+ {focusMode && ( + + )} +
+ + ); }