import { trpc } from "@/app/_trpc/client"; import { useToast } from "@/components/ui/use-toast"; import { User } from "@/server/user/domain/models"; import { useSignUp, useUser } from "@clerk/nextjs"; import { useRouter, useSearchParams } from "next/navigation"; import { useEffect, useState } from "react"; type RegisteredUser = User & {sessionId:string} const STORAGE_KEY = "registeredUser"; export default function useRegisterUserInvitation() { const { user } = useUser(); const router = useRouter(); const { isLoaded, signUp, setActive } = useSignUp(); const { toast } = useToast(); const [isRegistering, setIsRegistering] = useState(false); const { mutateAsync: registerUserDb } = trpc.users.findOrCreateUser.useMutation(); const searchParams = useSearchParams(); const token = searchParams.get("__clerk_ticket"); useEffect(() => { if (user?.id) { router.push("/"); } }, [user, router]); const retryRegisterStoredUser = async () => { const storedUserStr = localStorage.getItem(STORAGE_KEY); if (!storedUserStr || !isLoaded) return false; try { const storedUser = JSON.parse(storedUserStr) as RegisteredUser; await registerUserDb(storedUser); await setActive({ session: storedUser.sessionId }); localStorage.removeItem(STORAGE_KEY); return true; } catch (err) { toast({ title: "Error", description: "Error al reintentar el registro. Por favor, inténtalo de nuevo más tarde.", variant: "destructive", }); return false; } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!isLoaded || isRegistering) return; try { setIsRegistering(true); const recovered = await retryRegisterStoredUser(); if (recovered) return; if (!token) { toast({ title: "Error", description: "No se encontró un token de invitación válido.", variant: "destructive", }); return; } const formData = new FormData(e.target as any); const firstName = formData.get("firstName") as string; const lastName = formData.get("lastName") as string; const signUpAttempt = await signUp.create({ strategy: "ticket", ticket: token, firstName, lastName, }); if (signUpAttempt.status !== "complete") { toast({ title: "Error", description: "El proceso de registro no pudo completarse.", variant: "destructive", }); return; } const newUser: RegisteredUser = { id: signUpAttempt.createdUserId!, firstName, lastName, email: signUpAttempt.emailAddress!, sessionId: signUpAttempt.createdSessionId!, }; localStorage.setItem(STORAGE_KEY, JSON.stringify(newUser)); await registerUserDb(newUser); await setActive({ session: newUser.sessionId }); localStorage.removeItem(STORAGE_KEY); } catch (err) { const recovered = await retryRegisterStoredUser(); if (!recovered) { toast({ title: "Error", description: "Un error inesperado ocurrió. Por favor, inténtalo de nuevo más tarde.", variant: "destructive", }); } } finally { setIsRegistering(false); } }; return { token, handleSubmit, isRegistering, }; }