"use client"; import { ExternalLink, Eye, EyeOff, Frown, MailPlus } from "lucide-react"; import type { GetServerSideProps } from "next"; import Link from "next/link"; import { useRouter } from "next/router"; import { useState } from "react"; import toast from "react-hot-toast"; import { z } from "zod"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "~/components/custom_ui/form"; import LoadingButton from "~/components/custom_ui/loading-button"; import { PasswordSVG } from "~/components/svgs"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "~/components/ui/alert-dialog"; import { Button } from "~/components/ui/button"; import Input from "~/components/ui/input"; import { useStrongPassword } from "~/hooks/useStrongPassword"; import { cn } from "~/lib/utils"; import { useZodForm } from "~/lib/zodForm"; import type { NextPageWithLayout } from "~/pages/_app"; import { useTranslation } from "~/providers/I18nProvider"; import { generateSSGHelper } from "~/server/utils/ssgHelper"; import { api } from "~/utils/api"; type Valid = { valid: true; token: string; email: string; }; type Invalid = { valid: false; token: null; email: null; }; type InviteTokenProps = Valid | Invalid; /** * Pagina di accettazione invito: /auth/accetta-invito/[token] */ const AcceptInvitePage: NextPageWithLayout = ({ valid, token, email, }: InviteTokenProps) => { const { isVisible, getStrengthColor, passwordRefine, getStrengthTxt, strengthScore, toggleVisibility, } = useStrongPassword(); const router = useRouter(); const schema = z .object({ newPsw: z.string(), }) .superRefine(({ newPsw }, refinementContext) => { passwordRefine({ password: newPsw, path: "newPsw", refinementContext, }); }); type FormValues = z.infer; const { locale } = useTranslation(); z.config(z.locales[locale]()); const form = useZodForm(schema, { defaultValues: { newPsw: "", }, }); function onSubmit(fields: FormValues) { if (!email || !token) return; acceptInvite({ email, password: fields.newPsw, token, }); } const { mutate: acceptInvite, isPending } = api.invite.acceptInvite.useMutation({ onSuccess: async () => { toast.success("Account creato! Effettua il login."); await router.push("/area-riservata/dashboard"); //await router.push("/login?redirect=/area-riservata/dashboard"); }, onError: (error) => { toast.error(error.message); }, }); if (!valid) { return (

Invito non valido

L'invito è scaduto o è già stato utilizzato.

); } return (

Scegli la tua password

(
Scegli una password
{ field.onChange(e); await form.trigger("newPsw"); }} placeholder="Password" type={isVisible ? "text" : "password"} />
)} />

La utilizzerai per accedere al tuo account

); }; const NewInviteDialog = () => { const { t } = useTranslation(); const [email, setEmail] = useState(""); const [open, setOpen] = useState(false); const { mutate, isPending } = api.invite.requestNewInvite.useMutation({ onSuccess: () => { toast.success("Email inviata! Controlla la tua casella di posta.", { duration: 5000, }); setOpen(false); setEmail(""); }, onError: (error) => { toast.error(error.message); setOpen(false); setEmail(""); }, }); return ( Inserisci il tuo indirizzo email Inserisci l'indirizzo email associato al tuo account per ricevere un nuovo invito. setEmail(e.target.value)} placeholder="esempio@email.com" type="email" value={email} /> {t.cancella} mutate({ email })} variant="default" > {t.procedi} ); }; export default AcceptInvitePage; export const getServerSideProps = (async (context) => { const token = context.params?.token; if (typeof token !== "string") { return { redirect: { destination: "/auth/nonvalid-password-reset-token", permanent: false, }, }; } const helper = generateSSGHelper(); const valid = await helper.invite.verifyInvite.fetch({ token }); if (valid.valid) { return { props: { valid: true, token, email: valid.email as string, }, }; } return { props: { valid: false, token: null, email: null, }, }; }) satisfies GetServerSideProps;