import { useState, useEffect } from "react"; import { apiFetch, getStoredKey, onUnauthorized, logout } from "./api"; import { getSpeechMuted, setSpeechMuted } from "./speech"; import Login from "./components/Login"; import Chat from "./components/Chat"; import Dashboard from "./components/Dashboard"; import Settings from "./components/Settings"; import WeatherWidget from "./components/WeatherWidget"; type View = "chat" | "dashboard" | "settings"; export default function App() { const [authenticated, setAuthenticated] = useState(() => getStoredKey() !== null); const [view, setView] = useState("chat"); const [muted, setMuted] = useState(() => getSpeechMuted()); const [assistantName, setAssistantName] = useState("JARVIS"); useEffect(() => onUnauthorized(() => setAuthenticated(false)), []); useEffect(() => { if (!authenticated) return; async function loadAssistantName() { try { const response = await apiFetch("/api/v1/settings"); if (!response.ok) return; const data = await response.json(); setAssistantName(data.assistant_name); document.title = data.assistant_name; } catch { // Default "JARVIS" bleibt bei Fehlern erhalten. } } loadAssistantName(); }, [authenticated]); function toggleMuted() { const next = !muted; setSpeechMuted(next); setMuted(next); } if (!authenticated) { return setAuthenticated(true)} />; } return (
{view === "chat" && } {view === "dashboard" && } {view === "settings" && }
); }