import Link from "next/link"; import React, { useState, FormEvent } from "react"; import { toast } from "react-hot-toast"; import { signIn } from "next-auth/react"; import { useRouter } from "next/router"; import CenteredForm from "@/layouts/CenteredForm"; import TextInput from "@/components/TextInput"; import Button from "@/components/ui/Button"; import { getLogins } from "./api/v1/logins"; import { GetServerSideProps, InferGetServerSidePropsType } from "next"; import { getToken } from "next-auth/jwt"; import { prisma } from "@/lib/api/db"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import { i18n } from "next-i18next.config"; import { Trans, useTranslation } from "next-i18next"; const emailEnabled = process.env.NEXT_PUBLIC_EMAIL_PROVIDER === "true"; type FormData = { name: string; username?: string; email?: string; password: string; passwordConfirmation: string; }; export default function Register({ availableLogins, }: InferGetServerSidePropsType) { const { t } = useTranslation(); const [submitLoader, setSubmitLoader] = useState(false); const router = useRouter(); const [form, setForm] = useState({ name: "", username: emailEnabled ? undefined : "", email: emailEnabled ? "" : undefined, password: "", passwordConfirmation: "", }); async function registerUser(event: FormEvent) { event.preventDefault(); if (!submitLoader) { const checkFields = () => { if (emailEnabled) { return ( form.name !== "" && form.email !== "" && form.password !== "" && form.passwordConfirmation !== "" ); } else { return ( form.name !== "" && form.username !== "" && form.password !== "" && form.passwordConfirmation !== "" ); } }; if (checkFields()) { if (form.password !== form.passwordConfirmation) return toast.error(t("passwords_mismatch")); else if (form.password.length < 8) return toast.error(t("password_too_short")); const { passwordConfirmation, ...request } = form; setSubmitLoader(true); const load = toast.loading(t("creating_account")); const response = await fetch("/api/v1/users", { body: JSON.stringify(request), headers: { "Content-Type": "application/json", }, method: "POST", }); const data = await response.json(); toast.dismiss(load); setSubmitLoader(false); if (response.ok) { if (form.email && emailEnabled) { await signIn("email", { email: form.email, callbackUrl: "/", redirect: false, }); router.push( "/confirmation?email=" + encodeURIComponent(form.email) ); } else if (!emailEnabled) router.push("/login"); toast.success(t("account_created")); } else { toast.error(data.response); } } else { toast.error(t("fill_all_fields")); } } } async function loginUserButton(method: string) { setSubmitLoader(true); const load = toast.loading(t("authenticating")); const res = await signIn(method, {}); toast.dismiss(load); setSubmitLoader(false); } function displayLoginExternalButton() { const Buttons: any = []; availableLogins.buttonAuths.forEach((value: any, index: any) => { Buttons.push( ); }); return Buttons; } return ( {process.env.NEXT_PUBLIC_DISABLE_REGISTRATION === "true" ? (

{t("registration_disabled")}

) : (

{t("enter_details")}

{t("display_name")}

setForm({ ...form, name: e.target.value })} />
{emailEnabled ? undefined : (

{t("username")}

setForm({ ...form, username: e.target.value }) } />
)} {emailEnabled ? (

{t("email")}

setForm({ ...form, email: e.target.value })} />
) : undefined}

{t("password")}

setForm({ ...form, password: e.target.value })} />

{t("confirm_password")}

setForm({ ...form, passwordConfirmation: e.target.value }) } />
{process.env.NEXT_PUBLIC_STRIPE ? (

, , ]} />

) : undefined} {availableLogins.buttonAuths.length > 0 ? (
{t("or_continue_with")}
) : undefined} {displayLoginExternalButton()}

{t("already_registered")}

{t("login")}
{process.env.NEXT_PUBLIC_STRIPE ? (

{t("need_help")}

{t("get_in_touch")}
) : undefined}
)}
); } const getServerSideProps: GetServerSideProps = async (ctx) => { const availableLogins = getLogins(); const acceptLanguageHeader = ctx.req.headers["accept-language"]; const availableLanguages = i18n.locales; const token = await getToken({ req: ctx.req }); if (token) { const user = await prisma.user.findUnique({ where: { id: token.id, }, }); if (user) { return { props: { availableLogins, ...(await serverSideTranslations(user.locale ?? "en", ["common"])), }, }; } } const acceptedLanguages = acceptLanguageHeader ?.split(",") .map((lang) => lang.split(";")[0]); let bestMatch = acceptedLanguages?.find((lang) => availableLanguages.includes(lang) ); if (!bestMatch) { acceptedLanguages?.some((acceptedLang) => { const partialMatch = availableLanguages.find((lang) => lang.startsWith(acceptedLang) ); if (partialMatch) { bestMatch = partialMatch; return true; } return false; }); } return { props: { availableLogins, ...(await serverSideTranslations(bestMatch ?? "en", ["common"])), }, }; }; export { getServerSideProps };