"use client"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { useAppTheme } from "@/components/ThemeProvider"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Eye, EyeOff, Loader2, X } from "lucide-react"; import { useAuth } from "@/hooks/useAuth"; import { loginSchema, registerSchema, type LoginInput, type RegisterInput } from "@/lib/schema/auth"; import { toast } from "sonner"; import { useRouter } from "next/navigation"; interface LoginDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onLoginSuccess: () => void; } // Login Dialog component export function LoginDialog({ open, onOpenChange, onLoginSuccess }: LoginDialogProps) { const { theme } = useAppTheme(); const isDark = theme === "dark"; const router = useRouter(); const { login, register, loginMutation, registerMutation } = useAuth(); const [isSignup, setIsSignup] = useState(false); const [loginData, setLoginData] = useState({ email: "", password: "", }); const [signupData, setSignupData] = useState({ first_name: "", last_name: "", email: "", phone_number: "", password: "", password2: "", }); const [showPassword, setShowPassword] = useState(false); const [showPassword2, setShowPassword2] = useState(false); const [rememberMe, setRememberMe] = useState(false); const [error, setError] = useState(null); const handleLogin = async (e: React.FormEvent) => { e.preventDefault(); setError(null); // Validate form const validation = loginSchema.safeParse(loginData); if (!validation.success) { const firstError = validation.error.issues[0]; toast.error(firstError.message); return; } try { const result = await login(loginData); if (result.tokens && result.user) { toast.success("Login successful!"); setShowPassword(false); onOpenChange(false); onLoginSuccess(); } } catch (err) { const errorMessage = err instanceof Error ? err.message : "Login failed. Please try again."; toast.error(errorMessage); } }; const handleSignup = async (e: React.FormEvent) => { e.preventDefault(); setError(null); // Validate form const validation = registerSchema.safeParse(signupData); if (!validation.success) { const firstError = validation.error.issues[0]; toast.error(firstError.message); return; } try { const result = await register(signupData); if (result.message) { toast.success("Registration successful! Please check your email for OTP verification."); // Switch to login after successful registration setIsSignup(false); setLoginData({ email: signupData.email, password: "" }); setSignupData({ first_name: "", last_name: "", email: "", phone_number: "", password: "", password2: "", }); } } catch (err) { const errorMessage = err instanceof Error ? err.message : "Signup failed. Please try again."; toast.error(errorMessage); } }; const handleSwitchToSignup = () => { setIsSignup(true); setError(null); setLoginData({ email: "", password: "" }); }; const handleSwitchToLogin = () => { setIsSignup(false); setError(null); setSignupData({ first_name: "", last_name: "", email: "", phone_number: "", password: "", password2: "", }); }; return ( {/* Header with Close Button - Fixed */}
{isSignup ? "Create an account" : "Welcome back"} {isSignup ? "Sign up to complete your booking" : "Please log in to complete your booking"} {/* Close Button */}
{/* Scrollable Content */}
{/* Signup Form */} {isSignup ? (
{/* First Name Field */}
setSignupData({ ...signupData, first_name: e.target.value })} className={`h-11 sm:h-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} required />
{/* Last Name Field */}
setSignupData({ ...signupData, last_name: e.target.value })} className={`h-11 sm:h-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} required />
{/* Email Field */}
setSignupData({ ...signupData, email: e.target.value })} className={`h-11 sm:h-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} required />
{/* Phone Field */}
setSignupData({ ...signupData, phone_number: e.target.value })} className={`h-11 sm:h-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} />
{/* Password Field */}
setSignupData({ ...signupData, password: e.target.value })} className={`h-11 sm:h-12 pr-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} required />
{/* Confirm Password Field */}
setSignupData({ ...signupData, password2: e.target.value })} className={`h-11 sm:h-12 pr-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} required />
{/* Submit Button */} {/* Switch to Login */}

Already have an account?{" "}

) : ( /* Login Form */
{/* Email Field */}
setLoginData({ ...loginData, email: e.target.value })} className={`h-11 sm:h-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} required />
{/* Password Field */}
setLoginData({ ...loginData, password: e.target.value })} className={`h-11 sm:h-12 pr-12 text-sm sm:text-base ${isDark ? 'bg-gray-700 border-gray-600 text-white placeholder:text-gray-400' : 'bg-white border-gray-300 text-gray-900'}`} required />
{/* Submit Button */} {/* Remember Me & Forgot Password */}
{/* Sign Up Prompt */}

New to Attune Heart Therapy?{" "}

)}
); }