/* eslint-disable @next/next/no-img-element */ import Modal from "@/components/Modal"; import useStats from "@/hooks/useStats"; import useUsers from "@/hooks/useUsers"; import {User} from "@/interfaces/user"; import UserList from "@/pages/(admin)/Lists/UserList"; import {dateSorter} from "@/utils"; import moment from "moment"; import {useEffect, useState} from "react"; import { BsArrowLeft, BsBriefcaseFill, BsGlobeCentralSouthAsia, BsPerson, BsPersonFill, BsPencilSquare, BsBank, BsCurrencyDollar, } from "react-icons/bs"; import UserCard from "@/components/UserCard"; import useGroups from "@/hooks/useGroups"; import IconCard from "./IconCard"; import useFilterStore from "@/stores/listFilterStore"; import {useRouter} from "next/router"; import usePaymentStatusUsers from "@/hooks/usePaymentStatusUsers"; interface Props { user: User; } export default function AdminDashboard({user}: Props) { const [page, setPage] = useState(""); const [selectedUser, setSelectedUser] = useState(); const [showModal, setShowModal] = useState(false); const {stats} = useStats(user.id); const {users, reload} = useUsers(); const {groups} = useGroups(); const {pending, done} = usePaymentStatusUsers(); const appendUserFilters = useFilterStore((state) => state.appendUserFilter); const router = useRouter(); useEffect(() => { setShowModal(!!selectedUser && page === ""); }, [selectedUser, page]); // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(reload, [page]); const inactiveCountryManagerFilter = (x: User) => x.type === "agent" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); const UserDisplay = (displayUser: User) => (
setSelectedUser(displayUser)} className="flex w-full p-4 gap-4 items-center hover:bg-mti-purple-ultralight cursor-pointer transition ease-in-out duration-300"> {displayUser.name}
{displayUser.type === "corporate" ? displayUser.corporateInformation?.companyInformation?.name || displayUser.name : displayUser.name} {displayUser.email}
); const StudentsList = () => { const filter = (x: User) => x.type === "student" && (!!selectedUser ? groups .filter((g) => g.admin === selectedUser.id || g.participants.includes(selectedUser.id)) .flatMap((g) => g.participants) .includes(x.id) : true); return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

Students ({users.filter(filter).length})

); }; const TeachersList = () => { const filter = (x: User) => x.type === "teacher" && (!!selectedUser ? groups .filter((g) => g.admin === selectedUser.id || g.participants.includes(selectedUser.id)) .flatMap((g) => g.participants) .includes(x.id) || false : true); return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

Teachers ({users.filter(filter).length})

); }; const AgentsList = () => { const filter = (x: User) => x.type === "agent"; return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

Country Managers ({users.filter(filter).length})

); }; const CorporateList = () => ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

Corporate ({users.filter((x) => x.type === "corporate").length})

x.type === "corporate"]} /> ); const CorporatePaidStatusList = ({paid}: {paid: Boolean}) => { const list = paid ? done : pending; const filter = (x: User) => x.type === "corporate" && list.includes(x.id); return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

{paid ? "Payment Done" : "Pending Payment"} ({list.length})

); }; const InactiveCountryManagerList = () => { return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

Inactive Country Managers ({users.filter(inactiveCountryManagerFilter).length})

); }; const InactiveStudentsList = () => { const filter = (x: User) => x.type === "student" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

Inactive Students ({users.filter(filter).length})

); }; const InactiveCorporateList = () => { const filter = (x: User) => x.type === "corporate" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); return ( <>
setPage("")} className="flex gap-2 items-center text-mti-purple-light cursor-pointer hover:text-mti-purple-dark transition ease-in-out duration-300"> Back

Inactive Corporate ({users.filter(filter).length})

); }; const DefaultDashboard = () => ( <>
x.type === "student").length} onClick={() => setPage("students")} color="purple" /> x.type === "teacher").length} onClick={() => setPage("teachers")} color="purple" /> x.type === "corporate").length} onClick={() => setPage("corporate")} color="purple" /> x.type === "agent").length} onClick={() => setPage("agents")} color="purple" /> x.demographicInformation).map((x) => x.demographicInformation?.country))].length} color="purple" /> setPage("inactiveStudents")} Icon={BsPersonFill} label="Inactive Students" value={ users.filter((x) => x.type === "student" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate))) .length } color="rose" /> setPage("inactiveCountryManagers")} Icon={BsBriefcaseFill} label="Inactive Country Managers" value={users.filter(inactiveCountryManagerFilter).length} color="rose" /> setPage("inactiveCorporate")} Icon={BsBank} label="Inactive Corporate" value={ users.filter((x) => x.type === "corporate" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate))) .length } color="rose" /> setPage("paymentdone")} Icon={BsCurrencyDollar} label="Payment Done" value={done.length} color="purple" /> setPage("paymentpending")} Icon={BsCurrencyDollar} label="Pending Payment" value={pending.length} color="rose" />
Latest students
{users .filter((x) => x.type === "student") .sort((a, b) => dateSorter(a, b, "desc", "registrationDate")) .map((x) => ( ))}
Latest corporate
{users .filter((x) => x.type === "corporate") .sort((a, b) => { return dateSorter(a, b, "desc", "registrationDate"); }) .map((x) => ( ))}
Unpaid Corporate
{users .filter((x) => x.type === "corporate" && x.status === "paymentDue") .map((x) => ( ))}
Students expiring in 1 month
{users .filter( (x) => x.type === "student" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")) && moment().isBefore(moment(x.subscriptionExpirationDate)), ) .map((x) => ( ))}
Country Manager expiring in 1 month
{users .filter( (x) => x.type === "teacher" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")) && moment().isBefore(moment(x.subscriptionExpirationDate)), ) .map((x) => ( ))}
Corporate expiring in 1 month
{users .filter( (x) => x.type === "corporate" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")) && moment().isBefore(moment(x.subscriptionExpirationDate)), ) .map((x) => ( ))}
Expired Students
{users .filter( (x) => x.type === "student" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate)), ) .map((x) => ( ))}
Expired Country Manager
{users .filter( (x) => x.type === "teacher" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate)), ) .map((x) => ( ))}
Expired Corporate
{users .filter( (x) => x.type === "corporate" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate)), ) .map((x) => ( ))}
); return ( <> setSelectedUser(undefined)}> <> {selectedUser && (
{ setSelectedUser(undefined); if (shouldReload) reload(); }} onViewStudents={ selectedUser.type === "corporate" || selectedUser.type === "teacher" ? () => { appendUserFilters({ id: "view-students", filter: (x: User) => x.type === "student", }); appendUserFilters({ id: "belongs-to-admin", filter: (x: User) => groups .filter((g) => g.admin === selectedUser.id || g.participants.includes(selectedUser.id)) .flatMap((g) => g.participants) .includes(x.id), }); router.push("/list/users"); } : undefined } onViewTeachers={ selectedUser.type === "corporate" || selectedUser.type === "student" ? () => { appendUserFilters({ id: "view-teachers", filter: (x: User) => x.type === "teacher", }); appendUserFilters({ id: "belongs-to-admin", filter: (x: User) => groups .filter((g) => g.admin === selectedUser.id || g.participants.includes(selectedUser.id)) .flatMap((g) => g.participants) .includes(x.id), }); router.push("/list/users"); } : undefined } onViewCorporate={ selectedUser.type === "teacher" || selectedUser.type === "student" ? () => { appendUserFilters({ id: "view-corporate", filter: (x: User) => x.type === "corporate", }); appendUserFilters({ id: "belongs-to-admin", filter: (x: User) => groups .filter((g) => g.participants.includes(selectedUser.id)) .flatMap((g) => [g.admin, ...g.participants]) .includes(x.id), }); router.push("/list/users"); } : undefined } user={selectedUser} />
)}
{page === "students" && } {page === "teachers" && } {page === "corporate" && } {page === "agents" && } {page === "inactiveStudents" && } {page === "inactiveCorporate" && } {page === "inactiveCountryManagers" && } {page === "paymentdone" && } {page === "paymentpending" && } {page === "" && } ); }