import { useEffect, useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faArrowLeft, faCheckCircle, faExclamationTriangle, faCircleNotch, faPlug, faTrashAlt, faServer, } from "@fortawesome/free-solid-svg-icons"; import { useToast } from "../lib/toast"; import { getServerStatus, type ServerStatus } from "../lib/llm"; import { clearHistory } from "../lib/history"; import { useI18n } from "../lib/i18n"; const DRAFT_KEY = "melodymuse-draft"; interface LocalDataSummary { hasDraft: boolean; } function readLocalDataSummary(): LocalDataSummary { if (typeof window === "undefined") { return { hasDraft: false }; } const hasDraft = window.localStorage.getItem(DRAFT_KEY) !== null; return { hasDraft }; } export function SettingsPage() { const toast = useToast(); const navigate = useNavigate(); const { t } = useI18n(); const [status, setStatus] = useState(null); const [statusError, setStatusError] = useState(null); const [checking, setChecking] = useState(true); const [summary, setSummary] = useState({ hasDraft: false, }); const check = async (signal?: AbortSignal) => { setChecking(true); setStatusError(null); try { const s = await getServerStatus(signal); setStatus(s); } catch (err) { setStatusError(err instanceof Error ? err.message : t.unreachable); setStatus(null); } finally { setChecking(false); } }; useEffect(() => { const ctrl = new AbortController(); check(ctrl.signal); setSummary(readLocalDataSummary()); return () => ctrl.abort(); }, []); const onClearHistory = async () => { if (!window.confirm(t.clearHistoryConfirm)) return; await clearHistory(); toast.info(t.clearHistory); }; const onClearDraft = () => { if (!summary.hasDraft) return; if (!window.confirm(t.clearDraftConfirm)) return; window.localStorage.removeItem(DRAFT_KEY); setSummary((s) => ({ ...s, hasDraft: false })); toast.info(t.clearDraft); }; return (

{t.settings}

{t.serverStatus}

{checking ? t.checking : status ? t.connected : statusError ? t.unreachable : "Unknown"}

{status && (

{t.model}: {status.model}
{t.endpoint}:{" "} {status.endpoint}

)} {statusError && !checking && (

{statusError}

)}

{t.localData}

  • melodymuse-draft —{" "} {summary.hasDraft ? t.draftSaved : t.draftEmpty}
{t.backToGenerator}
); } function StatusDot({ checking, ok }: { checking: boolean; ok: boolean }) { if (checking) return ; if (ok) return ; return ; }