import { useCallback, useEffect, useState } from "react"; import { listen } from "@tauri-apps/api/event"; import Overlay from "./Overlay"; import GeneralPage from "./pages/General"; import ModelsPage from "./pages/Models"; import EnhancePage from "./pages/Enhance"; import { getSettings, setSettings as persistSettings, toggleDictation } from "./api"; import type { RecordingState, Settings, TranscriptPayload } from "./types"; type Page = "general" | "models" | "enhance"; const NAV: { id: Page; label: string }[] = [ { id: "general", label: "general" }, { id: "models", label: "models" }, { id: "enhance", label: "enhance" }, ]; export default function App() { if (window.location.hash === "#overlay") { return ; } return ; } function SettingsApp() { const [page, setPage] = useState("general"); const [settings, setSettingsState] = useState(null); const [saveError, setSaveError] = useState(null); const [recState, setRecState] = useState("idle"); const [lastTranscript, setLastTranscript] = useState(null); const [pipelineError, setPipelineError] = useState(null); useEffect(() => { getSettings().then(setSettingsState).catch(console.error); const subs = [ listen<{ state: RecordingState }>("recording-state", (e) => setRecState(e.payload.state), ), listen("transcript", (e) => { setLastTranscript(e.payload); setPipelineError(null); }), listen<{ message: string }>("pipeline-error", (e) => setPipelineError(e.payload.message), ), // fired when the tray switches profiles behind the UI's back listen("settings-changed", () => { getSettings().then(setSettingsState).catch(console.error); }), ]; return () => { subs.forEach((s) => s.then((fn) => fn())); }; }, []); const update = useCallback((next: Settings) => { setSettingsState(next); setSaveError(null); persistSettings(next).catch((e) => setSaveError(String(e))); }, []); return (
{saveError &&
save failed: {saveError}
} {pipelineError && (
{pipelineError}
)} {settings === null ? (

loading…

) : page === "general" ? ( ) : page === "models" ? ( ) : ( )}
); }