"use client" import type React from "react" import { useState, useEffect, Suspense } from "react" import { useRouter, useSearchParams } from "next/navigation" import Link from "next/link" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Alert, AlertDescription } from "@/components/ui/alert" import { Mail, Loader2, CheckCircle, ArrowLeft, Shield, Cpu } from "lucide-react" function ForgotPasswordContent() { const [step, setStep] = useState<'email' | 'verify'>('email') const [email, setEmail] = useState("") const [resetCode, setResetCode] = useState("") const [isLoading, setIsLoading] = useState(false) const [isVerifying, setIsVerifying] = useState(false) const [error, setError] = useState("") const [success, setSuccess] = useState(false) const [resetToken, setResetToken] = useState(null) const router = useRouter() const searchParams = useSearchParams() // Pre-fill email from URL parameter if provided useEffect(() => { const emailParam = searchParams.get('email') if (emailParam && !email) { setEmail(emailParam) } }, [searchParams, email]) // Step 1: Send reset code const handleSendCode = async (e: React.FormEvent) => { e.preventDefault() setError("") setSuccess(false) // Client-side validation if (!email) { setError("Email is required") return } // Validate email format const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ if (!emailRegex.test(email)) { setError("Please enter a valid email address (Gmail, Yahoo, etc.)") return } setIsLoading(true) try { const response = await fetch("/api/auth/send-reset-code", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ email }), }) // Check if response has valid JSON const contentType = response.headers.get('content-type') let data if (contentType && contentType.includes('application/json')) { data = await response.json() } else { const text = await response.text() throw new Error(text || `Server error: ${response.status}`) } if (!response.ok) { throw new Error(data.error || data.message || "Failed to send password reset code") } setSuccess(true) setStep('verify') } catch (err: any) { console.error("Send reset code error:", err) setError(err.message || "Failed to send password reset code. Please try again.") } finally { setIsLoading(false) } } // Step 2: Verify code and redirect to reset password const handleVerifyCode = async (e: React.FormEvent) => { e.preventDefault() setError("") setSuccess(false) if (!resetCode || resetCode.length !== 6) { setError("Please enter the 6-digit verification code") return } setIsVerifying(true) try { // Ensure we have valid data before sending if (!email || !resetCode) { setError("Email and verification code are required") setIsVerifying(false) return } const requestBody = JSON.stringify({ email: email.trim(), code: resetCode.trim() }) const response = await fetch("/api/auth/verify-reset-code", { method: "POST", headers: { "Content-Type": "application/json", }, body: requestBody, }) // Check if response has valid JSON const contentType = response.headers.get('content-type') let data if (contentType && contentType.includes('application/json')) { data = await response.json() } else { const text = await response.text() throw new Error(text || `Server error: ${response.status}`) } if (!response.ok) { // Show detailed error message const errorMessage = data.error || data.message || "Invalid verification code" const errorDetails = data.details ? ` ${data.details}` : '' throw new Error(`${errorMessage}${errorDetails}`) } if (data.token) { setResetToken(data.token) // Redirect to reset password page with email and token router.push(`/reset-password?email=${encodeURIComponent(email)}&token=${data.token}`) } } catch (err: any) { console.error("Verify reset code error:", err) setError(err.message || "Invalid verification code. Please try again.") } finally { setIsVerifying(false) } } return (
{/* BuildMate Logo - Centered */}

BuildMate

{/* Header */}

Forgot Password

{step === 'email' ? 'Enter your verified email address and we\'ll send you a reset code' : 'Enter the verification code sent to your email'}

{/* Forgot Password Form */} {step === 'email' ? 'Step 1: Enter Email' : 'Step 2: Verify Code'} {step === 'email' ? 'We\'ll send a 6-digit verification code to your verified email (Gmail, Yahoo, etc.)' : `Code sent to ${email}`} {error && ( {error} )} {success && step === 'email' && ( Password reset code sent! Please check your inbox (and spam folder). )} {/* Step 1: Email Input */} {step === 'email' && (
setEmail(e.target.value)} required disabled={isLoading} />

We'll send a 6-digit verification code to verify your email address

)} {/* Step 2: Code Verification */} {step === 'verify' && (
{ // Only allow digits, max 6 characters const cleaned = e.target.value.replace(/\D/g, '').slice(0, 6) setResetCode(cleaned) }} onBlur={(e) => { // Trim whitespace on blur setResetCode(e.target.value.trim()) }} required maxLength={6} disabled={isVerifying} className="text-center text-2xl font-mono tracking-widest" />

Check your email inbox for the verification code

{error && error.includes("Invalid or expired") && (

💡 Tip: Make sure you use the exact same email address. If the server restarted, request a new code.

)}
)}
Back to Login
) } export default function ForgotPasswordPage() { return (
}>
) }