import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/contexts/AuthContext"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { toast } from "sonner"; import { Brain, Sparkles } from "lucide-react"; const LAST_NAME_KEY = "distractiq.lastUsername"; const NAME_REGEX = /^[a-zA-Z0-9_]{3,24}$/; // Deterministic synthetic credentials so a username always maps to the same account. const toEmail = (name: string) => `${name.toLowerCase()}@distractiq.local`; // Note: not security-grade — by design, no password to remember. const toPassword = (name: string) => `diq_${name.toLowerCase()}_focus_2025`; export default function Auth() { const navigate = useNavigate(); const { user, loading } = useAuth(); const [busy, setBusy] = useState(false); const [username, setUsername] = useState(""); const [remembered, setRemembered] = useState(null); useEffect(() => { document.title = "Welcome · DistractIQ"; const saved = localStorage.getItem(LAST_NAME_KEY); if (saved) { setUsername(saved); setRemembered(saved); } }, []); useEffect(() => { if (!loading && user) navigate("/", { replace: true }); }, [user, loading, navigate]); const enter = async (e: React.FormEvent) => { e.preventDefault(); const name = username.trim(); if (!NAME_REGEX.test(name)) { toast.error("Use 3–24 letters, numbers, or underscores."); return; } setBusy(true); const email = toEmail(name); const password = toPassword(name); // Try sign-in first (returning user) const { error: signInErr } = await supabase.auth.signInWithPassword({ email, password }); if (signInErr) { // Likely first-time — create account const { error: signUpErr } = await supabase.auth.signUp({ email, password, options: { emailRedirectTo: `${window.location.origin}/`, data: { username: name }, }, }); if (signUpErr) { setBusy(false); toast.error(signUpErr.message); return; } // After sign-up, session is created automatically (auto-confirm on) toast.success(`Welcome, ${name}! ✨`); } else { toast.success(`Welcome back, ${name} 👋`); } localStorage.setItem(LAST_NAME_KEY, name); setBusy(false); navigate("/", { replace: true }); }; const useDifferent = () => { setUsername(""); setRemembered(null); }; return (

DistractIQ

Quantify your focus. Beat your distractions.

{remembered && (
Welcome back, {remembered}. Tap continue to jump in.
)}
setUsername(e.target.value)} placeholder="focus_ninja" className="mt-1.5 h-12 text-lg font-display" />

3–24 characters · letters, numbers, underscores. Same name later = same account.

{remembered && ( )}

No password, no email — your name is your key. Pick something unique to you so no one else claims it.

); }