diff --git a/apps/admin-ui/src/app/settings/page.tsx b/apps/admin-ui/src/app/settings/page.tsx index ba744e2..7e9fbdb 100644 --- a/apps/admin-ui/src/app/settings/page.tsx +++ b/apps/admin-ui/src/app/settings/page.tsx @@ -20,6 +20,16 @@ export default function SettingsPage() { const [shelves, setShelves] = useState([]); const [newShelfName, setNewShelfName] = useState(""); const [newShelfKind, setNewShelfKind] = useState<"MOVIE" | "SERIES">("MOVIE"); + const [osApiKey, setOsApiKey] = useState(""); + const [osUsername, setOsUsername] = useState(""); + const [osPassword, setOsPassword] = useState(""); + const [osEnabled, setOsEnabled] = useState(true); + const [osHasKey, setOsHasKey] = useState(false); + const [osHasPassword, setOsHasPassword] = useState(false); + const [osConfigured, setOsConfigured] = useState(false); + const [osBusy, setOsBusy] = useState(false); + const [osMsg, setOsMsg] = useState(null); + const [osErr, setOsErr] = useState(null); const loadShelves = useCallback(() => { fetch("/api/v1/admin/library/shelves", { credentials: "include" }) @@ -27,9 +37,25 @@ export default function SettingsPage() { .then((d) => setShelves(d.shelves ?? [])); }, []); + const loadOpenSubtitles = useCallback(() => { + fetch("/api/v1/admin/settings/opensubtitles", { credentials: "include" }) + .then((r) => r.json()) + .then((d) => { + const s = d.settings; + if (!s) return; + setOsConfigured(!!s.configured); + setOsEnabled(s.enabled !== false); + setOsUsername(s.username ?? ""); + setOsHasKey(!!s.hasApiKey); + setOsHasPassword(!!s.hasPassword); + }) + .catch(() => undefined); + }, []); + useEffect(() => { loadShelves(); - }, [loadShelves]); + loadOpenSubtitles(); + }, [loadShelves, loadOpenSubtitles]); async function createShelf() { if (!newShelfName.trim()) return; @@ -62,6 +88,36 @@ export default function SettingsPage() { loadShelves(); } + async function saveOpenSubtitles() { + setOsBusy(true); + setOsMsg(null); + setOsErr(null); + try { + const res = await fetch("/api/v1/admin/settings/opensubtitles", { + method: "PUT", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + apiKey: osApiKey || undefined, + username: osUsername, + password: osPassword || undefined, + enabled: osEnabled, + }), + }); + const data = await res.json().catch(() => ({})); + if (!res.ok) { + setOsErr(data.error?.message ?? "Opslaan mislukt"); + return; + } + setOsMsg("Opgeslagen — OpenSubtitles OK"); + setOsApiKey(""); + setOsPassword(""); + loadOpenSubtitles(); + } finally { + setOsBusy(false); + } + } + return ( <>