import React, { useState, useEffect, useRef } from "react"; import { Lock, User, KeyRound, ShieldCheck, HardDrive, CheckCircle2, AlertCircle, X, Eye, EyeOff, ArrowRight, Sparkles, FolderLock, Globe, Loader2 } from "lucide-react"; interface AuthModalProps { isOpen: boolean; onClose: () => void; onAuthSuccess: (user: { id: string; username: string; createdAt: string; stats: any; }, cloudData?: any) => void; initialMode?: "signin" | "signup"; } export default function AuthModal({ isOpen, onClose, onAuthSuccess, initialMode = "signin" }: AuthModalProps) { const [mode, setMode] = useState<"signin" | "signup">(initialMode); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [successMsg, setSuccessMsg] = useState(null); // Real-time username availability checking const [usernameStatus, setUsernameStatus] = useState<{ checking: boolean; available?: boolean; exists?: boolean; message?: string; }>({ checking: false }); const checkTimeoutRef = useRef(null); // Sync initialMode when modal opens useEffect(() => { if (isOpen) { setMode(initialMode); setError(null); setSuccessMsg(null); } }, [isOpen, initialMode]); // Debounced username availability check useEffect(() => { const trimmed = username.trim(); if (!trimmed || trimmed.length < 3) { setUsernameStatus({ checking: false }); return; } if (checkTimeoutRef.current) { clearTimeout(checkTimeoutRef.current); } setUsernameStatus({ checking: true }); checkTimeoutRef.current = setTimeout(async () => { try { const res = await fetch(`/api/auth/check-username?username=${encodeURIComponent(trimmed)}`); const data = await res.json(); setUsernameStatus({ checking: false, available: data.available, exists: data.exists, message: data.message }); } catch (e) { setUsernameStatus({ checking: false }); } }, 300); return () => { if (checkTimeoutRef.current) clearTimeout(checkTimeoutRef.current); }; }, [username, mode]); if (!isOpen) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); setSuccessMsg(null); const trimmedUser = username.trim(); if (!trimmedUser) { setError("Please enter your username."); return; } if (!password) { setError("Please enter your password."); return; } if (mode === "signup") { if (password.length < 6) { setError("Password must be at least 6 characters long."); return; } if (password !== confirmPassword) { setError("Passwords do not match. Please verify your confirm password."); return; } } setLoading(true); try { const endpoint = mode === "signup" ? "/api/auth/register" : "/api/auth/login"; const response = await fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ username: trimmedUser, password }) }); const data = await response.json(); if (!response.ok || !data.success) { throw new Error(data.error || "Authentication failed."); } setSuccessMsg( mode === "signup" ? `Welcome, @${data.user.username}! Your cross-device account is ready.` : `Signed in as @${data.user.username}. Restoring your cloud chats...` ); // Instantly apply user credentials and hydrate chats across devices onAuthSuccess(data.user, data.data); setTimeout(() => { onClose(); }, 500); } catch (err: any) { setError(err.message || "An unexpected authentication error occurred."); } finally { setLoading(false); } }; return (
e.stopPropagation()} > {/* Top Gradient Banner */}

{mode === "signin" ? "Sign In to AI Assistant" : "Create Aura Store Account"}

{mode === "signin" ? "Available on any device with 1 GB Cloud Storage" : "Claim your username across all your devices"}

Cross-Device Cloud Sign In
1 GB Storage
{/* Auth Mode Toggle Tabs */}
{/* Main Form */}
{error && (
{error}
)} {successMsg && (
{successMsg}
)} {/* Username Field with Live Availability Indicator */}
{username.trim().length >= 3 && (
{usernameStatus.checking ? ( Checking... ) : mode === "signup" ? ( usernameStatus.available ? ( Available ) : usernameStatus.exists ? ( ) : null ) : ( usernameStatus.exists ? ( Account Found ) : null )}
)}
setUsername(e.target.value)} placeholder="e.g. harsha, hari, alex" autoComplete="username" required className="w-full pl-9 pr-4 py-2.5 rounded-xl border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800 text-slate-900 dark:text-white text-xs focus:ring-2 focus:ring-indigo-500 focus:outline-none" />

{mode === "signup" ? "Usernames are universal and can be signed into from any phone, laptop, or browser." : "Enter your registered username to load your cloud chats and 1 GB storage."}

{/* Password Field */}
setPassword(e.target.value)} placeholder="Enter password (min 6 characters)" autoComplete={mode === "signin" ? "current-password" : "new-password"} required className="w-full pl-9 pr-10 py-2.5 rounded-xl border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800 text-slate-900 dark:text-white text-xs focus:ring-2 focus:ring-indigo-500 focus:outline-none" />
{/* Confirm Password Field (Only for Create Account) */} {mode === "signup" && (
setConfirmPassword(e.target.value)} placeholder="Re-enter password to confirm" autoComplete="new-password" required className="w-full pl-9 pr-4 py-2.5 rounded-xl border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800 text-slate-900 dark:text-white text-xs focus:ring-2 focus:ring-indigo-500 focus:outline-none" />
)} {/* Account Storage Features Info Box */}
Aura Store Quota: 1.00 GB Cloud

Auto-creates 4 dedicated cloud folders: media storage, chats, generated media, and pinned chats.

{/* Submit Action Button */} {/* Switch Mode Clickable Text */}
{mode === "signin" ? (

Don't have an account?{" "}

) : (

Already have an account?{" "}

)}
); }