diff --git a/src/dashboards/Owner.tsx b/src/dashboards/Owner.tsx index e00856e5..7f876bca 100644 --- a/src/dashboards/Owner.tsx +++ b/src/dashboards/Owner.tsx @@ -111,7 +111,7 @@ export default function OwnerDashboard({user}: Props) { ); const InactiveStudentsList = () => { - const filter = (x: User) => x.type === "student" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate)); + const filter = (x: User) => x.type === "student" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); return ( <> @@ -131,7 +131,7 @@ export default function OwnerDashboard({user}: Props) { }; const InactiveCorporateList = () => { - const filter = (x: User) => x.type === "corporate" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate)); + const filter = (x: User) => x.type === "corporate" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)); return ( <> @@ -196,7 +196,11 @@ export default function OwnerDashboard({user}: Props) { Inactive Students - {users.filter((x) => x.type === "student" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate))).length} + { + users.filter( + (x) => x.type === "student" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)), + ).length + } @@ -207,7 +211,11 @@ export default function OwnerDashboard({user}: Props) { Inactive Corporate - {users.filter((x) => x.type === "corporate" && (x.isDisabled || moment().isAfter(x.subscriptionExpirationDate))).length} + { + users.filter( + (x) => x.type === "corporate" && (x.status === "disabled" || moment().isAfter(x.subscriptionExpirationDate)), + ).length + } @@ -219,7 +227,7 @@ export default function OwnerDashboard({user}: Props) {
{users .filter((x) => x.type === "student") - .sort((a, b) => dateSorter(a, b, "asc", "registrationDate")) + .sort((a, b) => dateSorter(a, b, "desc", "registrationDate")) .map((x) => ( ))} @@ -230,17 +238,17 @@ export default function OwnerDashboard({user}: Props) {
{users .filter((x) => x.type === "corporate") - .sort((a, b) => dateSorter(a, b, "asc", "registrationDate")) + .sort((a, b) => dateSorter(a, b, "desc", "registrationDate")) .map((x) => ( ))}
- Disabled Corporate + Unpaid Corporate
{users - .filter((x) => x.type === "corporate" && x.isDisabled) + .filter((x) => x.type === "corporate" && x.status === "paymentDue") .map((x) => ( ))} diff --git a/src/interfaces/user.ts b/src/interfaces/user.ts index c80e5cc6..33fc7fe7 100644 --- a/src/interfaces/user.ts +++ b/src/interfaces/user.ts @@ -16,8 +16,8 @@ export interface User { demographicInformation?: DemographicInformation; corporateInformation?: CorporateInformation; subscriptionExpirationDate?: null | Date; - isDisabled?: boolean; registrationDate?: Date; + status: "active" | "disabled" | "paymentDue"; } export interface CorporateInformation { diff --git a/src/pages/(admin)/Lists/UserList.tsx b/src/pages/(admin)/Lists/UserList.tsx index e92451a2..66dc614b 100644 --- a/src/pages/(admin)/Lists/UserList.tsx +++ b/src/pages/(admin)/Lists/UserList.tsx @@ -85,7 +85,7 @@ export default function UserList({user, filter}: {user: User; filter?: (user: Us const toggleDisableAccount = (user: User) => { if ( !confirm( - `Are you sure you want to ${user.isDisabled ? "enable" : "disable"} ${ + `Are you sure you want to ${user.status === "disabled" ? "enable" : "disable"} ${ user.name }'s account? This change is usually related to their payment state.`, ) @@ -93,9 +93,12 @@ export default function UserList({user, filter}: {user: User; filter?: (user: Us return; axios - .post<{user?: User; ok?: boolean}>(`/api/users/update?id=${user.id}`, {...user, isDisabled: !user.isDisabled}) + .post<{user?: User; ok?: boolean}>(`/api/users/update?id=${user.id}`, { + ...user, + status: user.status === "disabled" ? "active" : "disabled", + }) .then(() => { - toast.success(`User ${user.isDisabled ? "enabled" : "disabled"} successfully!`); + toast.success(`User ${user.status === "disabled" ? "enabled" : "disabled"} successfully!`); reload(); }) .catch(() => { @@ -166,10 +169,10 @@ export default function UserList({user, filter}: {user: User; filter?: (user: Us )} {PERMISSIONS.updateUser[row.original.type].includes(user.type) && (
toggleDisableAccount(row.original)}> - {row.original.isDisabled ? ( + {row.original.status === "disabled" ? ( ) : ( diff --git a/src/pages/(register)/RegisterCorporate.tsx b/src/pages/(register)/RegisterCorporate.tsx index 9487d123..58b265db 100644 --- a/src/pages/(register)/RegisterCorporate.tsx +++ b/src/pages/(register)/RegisterCorporate.tsx @@ -47,6 +47,13 @@ export default function RegisterCorporate({isLoading, setIsLoading, mutateUser, password, type: "corporate", profilePicture: "/defaultAvatar.png", + corporateInformation: { + companyInformation: { + name: companyName, + userAmount: companyUsers, + }, + allowedUserAmount: companyUsers, + }, }) .then((response) => { mutateUser(response.data.user).then(() => sendEmailVerification(setIsLoading, onSuccess, onError)); @@ -114,7 +121,9 @@ export default function RegisterCorporate({isLoading, setIsLoading, mutateUser, diff --git a/src/pages/(register)/RegisterIndividual.tsx b/src/pages/(register)/RegisterIndividual.tsx index 68f0f825..727c3c33 100644 --- a/src/pages/(register)/RegisterIndividual.tsx +++ b/src/pages/(register)/RegisterIndividual.tsx @@ -43,6 +43,7 @@ export default function RegisterIndividual({queryCode, isLoading, setIsLoading, name, email, password, + type: "individual", code, profilePicture: "/defaultAvatar.png", }) diff --git a/src/pages/api/register.ts b/src/pages/api/register.ts index 67e5fb45..ff836955 100644 --- a/src/pages/api/register.ts +++ b/src/pages/api/register.ts @@ -4,13 +4,13 @@ import {app} from "@/firebase"; import {sessionOptions} from "@/lib/session"; import {withIronSessionApiRoute} from "iron-session/next"; import {getFirestore, doc, setDoc, query, collection, where, getDocs} from "firebase/firestore"; -import {DemographicInformation, Type} from "@/interfaces/user"; +import {CorporateInformation, DemographicInformation, Type} from "@/interfaces/user"; import {addUserToGroupOnCreation} from "@/utils/registration"; const auth = getAuth(app); const db = getFirestore(app); -export default withIronSessionApiRoute(login, sessionOptions); +export default withIronSessionApiRoute(register, sessionOptions); const DEFAULT_DESIRED_LEVELS = { reading: 9, @@ -26,8 +26,21 @@ const DEFAULT_LEVELS = { speaking: 0, }; -async function login(req: NextApiRequest, res: NextApiResponse) { - const {email, password, code} = req.body as {email: string; password: string; code: string; demographicInformation: DemographicInformation}; +async function register(req: NextApiRequest, res: NextApiResponse) { + const {type} = req.body as { + type: "individual" | "corporate"; + }; + + if (type === "individual") return registerIndividual(req, res); + if (type === "corporate") return registerCorporate(req, res); +} + +async function registerIndividual(req: NextApiRequest, res: NextApiResponse) { + const {email, password, code} = req.body as { + email: string; + password: string; + code?: string; + }; const codeQuery = query(collection(db, "codes"), where("code", "==", code)); const codeDocs = (await getDocs(codeQuery)).docs.filter((x) => !Object.keys(x.data()).includes("userId")); @@ -70,3 +83,41 @@ async function login(req: NextApiRequest, res: NextApiResponse) { res.status(401).json({error}); }); } + +async function registerCorporate(req: NextApiRequest, res: NextApiResponse) { + const {email, password} = req.body as { + email: string; + password: string; + corporateInformation: CorporateInformation; + }; + + createUserWithEmailAndPassword(auth, email, password) + .then(async (userCredentials) => { + const userId = userCredentials.user.uid; + delete req.body.password; + + const user = { + ...req.body, + desiredLevels: DEFAULT_DESIRED_LEVELS, + levels: DEFAULT_LEVELS, + bio: "", + isFirstLogin: false, + focus: "academic", + type: "corporate", + subscriptionExpirationDate: null, + status: "paymentDue", + registrationDate: new Date().toISOString(), + }; + + await setDoc(doc(db, "users", userId), user); + + req.session.user = {...user, id: userId}; + await req.session.save(); + + res.status(200).json({user: {...user, id: userId}}); + }) + .catch((error) => { + console.log(error); + res.status(401).json({error}); + }); +} diff --git a/src/pages/api/reset/sendVerification.ts b/src/pages/api/reset/sendVerification.ts index cf028f59..69e36b91 100644 --- a/src/pages/api/reset/sendVerification.ts +++ b/src/pages/api/reset/sendVerification.ts @@ -13,6 +13,8 @@ async function sendVerification(req: NextApiRequest, res: NextApiResponse) { const short = new ShortUniqueId(); if (req.session.user) { + console.log("ME HERE"); + const transport = prepareMailer("verification"); const mailOptions = prepareMailOptions( { @@ -25,7 +27,8 @@ async function sendVerification(req: NextApiRequest, res: NextApiResponse) { "verification", ); - await transport.sendMail(mailOptions); + const result = await transport.sendMail(mailOptions); + console.log(result); res.status(200).json({ok: true}); return; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 151c7d35..ea949562 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -65,7 +65,7 @@ export default function Home() { return true; }; - if (user && (user.isDisabled || checkIfUserExpired())) { + if (user && (user.status === "disabled" || checkIfUserExpired())) { return ( <> @@ -79,7 +79,7 @@ export default function Home() {
- {user.isDisabled ? ( + {user.status === "disabled" ? ( <> Your account has been disabled! Please contact an administrator if you believe this to be a mistake. diff --git a/src/utils/navigation.disabled.ts b/src/utils/navigation.disabled.ts index 4b3a85e4..bfc9e067 100644 --- a/src/utils/navigation.disabled.ts +++ b/src/utils/navigation.disabled.ts @@ -8,7 +8,7 @@ export const preventNavigation = (navDisabled: boolean, focusMode: boolean): boo }; export const shouldRedirectHome = (user: User) => { - if (user.isDisabled) return true; + if (user.status === "disabled") return true; if (user.isFirstLogin) return true; if (!user.demographicInformation) return true; if (user.subscriptionExpirationDate && moment(new Date()).isAfter(user.subscriptionExpirationDate)) return true;