import Button from "@/components/Low/Button"; import Input from "@/components/Low/Input"; import useUsers from "@/hooks/useUsers"; import { User } from "@/interfaces/user"; import { sendEmailVerification } from "@/utils/email"; import axios from "axios"; import { Divider } from "primereact/divider"; import { useState } from "react"; import { toast } from "react-toastify"; import { KeyedMutator } from "swr"; import Select from "react-select"; import moment from "moment"; import useAcceptedTerms from "@/hooks/useAcceptedTerms"; interface Props { isLoading: boolean; setIsLoading: (isLoading: boolean) => void; mutateUser: KeyedMutator; sendEmailVerification: typeof sendEmailVerification; } const availableDurations = { "1_month": { label: "1 Month", number: 1 }, "3_months": { label: "3 Months", number: 3 }, "6_months": { label: "6 Months", number: 6 }, "12_months": { label: "12 Months", number: 12 }, }; export default function RegisterCorporate({ isLoading, setIsLoading, mutateUser, sendEmailVerification, }: Props) { const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [referralAgent, setReferralAgent] = useState(); const [companyName, setCompanyName] = useState(""); const [companyUsers, setCompanyUsers] = useState(0); const [subscriptionDuration, setSubscriptionDuration] = useState(1); const { acceptedTerms, renderCheckbox } = useAcceptedTerms(); const { users } = useUsers({ type: "agent" }); const onSuccess = () => toast.success( "An e-mail has been sent, please make sure to check your spam folder!" ); const onError = (e: Error) => { console.error(e); toast.error("Something went wrong, please logout and re-login.", { toastId: "send-verify-error", }); }; const register = (e: any) => { e.preventDefault(); if (confirmPassword !== password) { toast.error("Your passwords do not match!", { toastId: "password-not-match", }); return; } setIsLoading(true); axios .post("/api/register", { name, email, password, type: "corporate", profilePicture: "/defaultAvatar.png", subscriptionExpirationDate: moment().subtract(1, "days").toISOString(), corporateInformation: { monthlyDuration: subscriptionDuration, referralAgent, }, }) .then((response) => { mutateUser(response.data.user).then(() => sendEmailVerification(setIsLoading, onSuccess, onError) ); }) .catch((error) => { console.log(error.response.data); if (error.response.status === 401) { toast.error("There is already a user with that e-mail!"); return; } if (error.response.status === 400) { toast.error("The provided code is invalid!"); return; } toast.error("There was something wrong, please try again!"); }) .finally(() => setIsLoading(false)); }; return (
setName(e)} placeholder="Enter your name" defaultValue={name} required /> setEmail(e.toLowerCase())} placeholder="Enter email address" defaultValue={email} required />
setPassword(e)} placeholder="Enter your password" defaultValue={password} required /> setConfirmPassword(e)} placeholder="Confirm your password" defaultValue={confirmPassword} required />
setCompanyName(e)} placeholder="Corporate name" label="Corporate name" defaultValue={companyName} required /> setCompanyUsers(parseInt(e))} label="Number of users" defaultValue={companyUsers} required />
({ value, label: availableDurations[value as keyof typeof availableDurations] .label, }))} defaultValue={{ value: "1_month", label: availableDurations["1_month"].label, }} onChange={(value) => setSubscriptionDuration( value ? availableDurations[ value.value as keyof typeof availableDurations ].number : 1 ) } styles={{ control: (styles) => ({ ...styles, paddingLeft: "4px", border: "none", outline: "none", ":focus": { outline: "none", }, }), option: (styles, state) => ({ ...styles, backgroundColor: state.isFocused ? "#D5D9F0" : state.isSelected ? "#7872BF" : "white", color: state.isFocused ? "black" : styles.color, }), }} />
{renderCheckbox()}
); }