import { useState, useEffect } from 'react'; import { Sparkles, Eye, EyeOff, Loader2 } from 'lucide-react'; import { useT } from '../hooks/useLocale'; interface Props { onConnect: (url: string, token: string) => void; error?: string | null; isConnecting?: boolean; } const STORAGE_KEY = 'pinchchat_credentials'; export function getStoredCredentials(): { url: string; token: string } | null { try { const raw = localStorage.getItem(STORAGE_KEY); if (!raw) return null; const parsed = JSON.parse(raw); if (parsed.url && parsed.token) return parsed; } catch {} return null; } export function storeCredentials(url: string, token: string) { localStorage.setItem(STORAGE_KEY, JSON.stringify({ url, token })); } export function clearCredentials() { localStorage.removeItem(STORAGE_KEY); } export function LoginScreen({ onConnect, error, isConnecting }: Props) { const t = useT(); const defaultUrl = import.meta.env.VITE_GATEWAY_WS_URL || `ws://${window.location.hostname}:18789`; const [url, setUrl] = useState(defaultUrl); const [token, setToken] = useState(''); const [showToken, setShowToken] = useState(false); useEffect(() => { const stored = getStoredCredentials(); if (stored) { setUrl(stored.url); setToken(stored.token); } }, []); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!url.trim() || !token.trim()) return; onConnect(url.trim(), token.trim()); }; return (
{/* Logo */}
PinchChat

{t('login.title')}

{t('login.subtitle')}

{/* Form */}
setUrl(e.target.value)} placeholder="ws://192.168.1.14:18789" className="w-full rounded-xl border border-white/8 bg-zinc-800/50 px-4 py-3 text-sm text-zinc-200 placeholder:text-zinc-600 outline-none focus:border-cyan-400/40 focus:ring-1 focus:ring-cyan-400/20 transition-all" autoComplete="url" disabled={isConnecting} />
setToken(e.target.value)} placeholder={t('login.tokenPlaceholder')} className="w-full rounded-xl border border-white/8 bg-zinc-800/50 px-4 py-3 pr-12 text-sm text-zinc-200 placeholder:text-zinc-600 outline-none focus:border-cyan-400/40 focus:ring-1 focus:ring-cyan-400/20 transition-all" autoComplete="current-password" disabled={isConnecting} />
{error && (
{error}
)}

{t('login.storedLocally')}

); }