'use client' import { useState, useEffect } from 'react' import { useSearchParams } from 'next/navigation' import Link from 'next/link' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '@/components/ui/card' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Loader2, CheckCircle, XCircle, Mail, ArrowRight } from 'lucide-react' import { useMutation } from '@tanstack/react-query' import httpBrowserClient from '@/lib/httpBrowserClient' import { ApiEndpoints } from '@/config/api' import { Routes } from '@/config/routes' const ErrorAlert = ({ message }: { message: string }) => ( Error {message} ) const SendVerificationButton = ({ onClick, isLoading, hasVerificationCode, }: { onClick: () => void isLoading: boolean hasVerificationCode: boolean }) => ( ) const SendVerificationEmail = () => { const [successMessage, setSuccessMessage] = useState('') const [error, setError] = useState('') const { mutate: sendVerificationEmailMutation, isPending: isSendingVerificationEmail, } = useMutation({ mutationFn: () => httpBrowserClient.post( ApiEndpoints.auth.sendEmailVerificationEmail(), {} ), onSuccess: () => { setSuccessMessage('Verification email has been sent to your inbox') }, onError: (error: any) => { setError(error.message || 'Failed to send verification email') }, }) const renderContent = () => { if (successMessage) return ( Email Sent {successMessage} ) if (error) return return null } return ( Email Verification Send a verification email to verify your account {renderContent()} sendVerificationEmailMutation()} isLoading={isSendingVerificationEmail} hasVerificationCode={false} /> ) } const VerifyEmail = ({ userId, verificationCode, }: { userId: string verificationCode: string }) => { const [successMessage, setSuccessMessage] = useState('') const [error, setError] = useState('') const [isVerified, setIsVerified] = useState(false) const { mutate: verifyEmailMutation, isPending: isVerifyingEmail } = useMutation({ mutationFn: () => httpBrowserClient.post('/auth/verify-email', { userId, verificationCode, }), onSuccess: () => { setIsVerified(true) setSuccessMessage('Your email has been successfully verified') }, onError: (error: any) => { setError(error.message || 'Failed to verify email') }, }) useEffect(() => { verifyEmailMutation() }, [verifyEmailMutation]) const renderContent = () => { if (isVerifyingEmail) return (
) if (isVerified) return ( Success
{successMessage}
Go to Dashboard
) if (error) return return null } return ( Email Verification Verifying your email address... {renderContent()} {isVerified && ( )} ) } const CheckEmailPrompt = () => { const { mutate: sendVerificationEmailMutation, isPending, isError, isSuccess, } = useMutation({ mutationFn: () => httpBrowserClient.post( ApiEndpoints.auth.sendEmailVerificationEmail(), {} ), }) return ( Check your email We've sent you a verification email. Please check your inbox and click the link to verify your account. {isSuccess && ( Email Sent A new verification email has been sent to your inbox )} {isError && ( Error Failed to resend verification email )}
Didn't receive the email?
) } export default function VerifyEmailPage() { const searchParams = useSearchParams() const userId = searchParams.get('userId') const verificationCode = searchParams.get('verificationCode') const verificationEmailSent = searchParams.get('verificationEmailSent') return (
{userId && verificationCode ? ( ) : verificationEmailSent ? ( ) : ( )}
) }