"use client"; import { ExternalLink, Eye, EyeOff, Frown, MailPlus, UserSearch, } 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 { usePassword } from "~/hooks/usePassword"; 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 InviteTokenProps = { token: string; verification: | { status: "valid"; email: string; } | { status: "invalid"; reason: "not_found" | "expired"; } | { status: "already_user"; }; }; /** * Pagina di accettazione invito: /auth/accetta-invito/[token] */ const AcceptInvitePage: NextPageWithLayout = ({ verification, token, }: InviteTokenProps) => { switch (verification.status) { case "valid": return ; case "invalid": return ; case "already_user": return ; default: return ; } }; const ValidInvitePage = ({ token, email, }: { token: string; email: string; }) => { const { isVisible, getStrengthColor, passwordRefine, getStrengthTxt, strengthScore, toggleVisibility, maxStrength, } = usePassword(); 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); }, }); 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 AlreadyUserPage = () => { return (

Utente già registrato

L'email associata a questo invito è già registrata.

); }; const InvalidInvitePage = ({ reason }: { reason: "not_found" | "expired" }) => { const message = reason === "expired" ? "L'invito è scaduto, è passato troppo tempo dall'invio." : "Non è stato trovato alcun invito valido per questo collegamento."; return (

Invito non valido

{message}

); }; 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 e = context.query.e; let email: string | null = null; if (typeof e === "string") { try { email = atob(e); } catch { email = null; } } const helper = generateSSGHelper(); const verification = await helper.invite.verifyInvite.fetch({ token, email }); return { props: { verification, token, }, }; }) satisfies GetServerSideProps;