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 (
{t('login.subtitle')}
{t('login.storedLocally')}