"use client"; import { useEffect, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { api } from "@/lib/trpc"; import { CheckCircle, Loader2, XCircle } from "lucide-react"; export default function VerifyEmailPage() { const searchParams = useSearchParams(); const router = useRouter(); const [status, setStatus] = useState<"loading" | "success" | "error">( "loading", ); const [message, setMessage] = useState(""); const token = searchParams.get("token"); const email = searchParams.get("email"); const verifyEmailMutation = api.users.verifyEmail.useMutation({ onSuccess: () => { setStatus("success"); setMessage( "Your email has been successfully verified! You can now sign in.", ); }, onError: (error) => { setStatus("error"); setMessage( error.message || "Failed to verify email. The link may be invalid or expired.", ); }, }); const resendEmailMutation = api.users.resendVerificationEmail.useMutation({ onSuccess: () => { setMessage( "A new verification email has been sent to your email address.", ); }, onError: (error) => { setMessage(error.message || "Failed to resend verification email."); }, }); useEffect(() => { if (token && email) { verifyEmailMutation.mutate({ token, email }); } else { setStatus("error"); setMessage("Invalid verification link. Missing token or email."); } }, [token, email]); const handleResendEmail = () => { if (email) { resendEmailMutation.mutate({ email }); } }; const handleSignIn = () => { router.push("/signin"); }; return (
Email Verification {status === "loading" && "Verifying your email address..."} {status === "success" && "Email verified successfully!"} {status === "error" && "Verification failed"} {status === "loading" && (
)} {status === "success" && ( <>
{message} )} {status === "error" && ( <>
{message} {email && (
)} )}
); }