import { useState, useEffect, useRef } from "react"; import { Link } from "react-router-dom"; import { useAuth } from "../context/AuthContext"; import { searchActors, startLogin } from "../api/client"; import { AtSign } from "lucide-react"; import logo from "../assets/logo.svg"; import SignUpModal from "../components/SignUpModal"; export default function Login() { const { isAuthenticated, user, logout } = useAuth(); const [showSignUp, setShowSignUp] = useState(false); const [handle, setHandle] = useState(""); const [inviteCode, setInviteCode] = useState(""); const [showInviteInput, setShowInviteInput] = useState(false); const [suggestions, setSuggestions] = useState([]); const [showSuggestions, setShowSuggestions] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [selectedIndex, setSelectedIndex] = useState(-1); const inputRef = useRef(null); const inviteRef = useRef(null); const suggestionsRef = useRef(null); const [providerIndex, setProviderIndex] = useState(0); const [morphClass, setMorphClass] = useState("morph-in"); const providers = [ "AT Protocol", "Bluesky", "Blacksky", "Tangled", "Northsky", "witchcraft.systems", "topphie.social", "altq.net", ]; useEffect(() => { const cycleText = () => { setMorphClass("morph-out"); setTimeout(() => { setProviderIndex((prev) => (prev + 1) % providers.length); setMorphClass("morph-in"); }, 400); }; const interval = setInterval(cycleText, 3000); return () => clearInterval(interval); }, [providers.length]); const isSelectionRef = useRef(false); useEffect(() => { if (handle.length >= 3) { if (isSelectionRef.current) { isSelectionRef.current = false; return; } const timer = setTimeout(async () => { try { const data = await searchActors(handle); setSuggestions(data.actors || []); setShowSuggestions(true); setSelectedIndex(-1); } catch (e) { console.error("Search failed:", e); } }, 300); return () => clearTimeout(timer); } }, [handle]); useEffect(() => { const handleClickOutside = (e) => { if ( suggestionsRef.current && !suggestionsRef.current.contains(e.target) && inputRef.current && !inputRef.current.contains(e.target) ) { setShowSuggestions(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); if (isAuthenticated) { return (