feat: Settings 'Scan library' button + last-result status

This commit is contained in:
Jonathan
2026-07-11 17:14:37 +02:00
parent 7cb99361a5
commit 612cd02b15
+45 -19
View File
@@ -22,6 +22,22 @@ export function SettingsForm() {
const [tokenSet, setTokenSet] = useState(false); const [tokenSet, setTokenSet] = useState(false);
const [keySet, setKeySet] = useState(false); const [keySet, setKeySet] = useState(false);
const [saved, setSaved] = useState(false); const [saved, setSaved] = useState(false);
const [scanResult, setScanResult] = useState<string | null>(null);
const [scanRequested, setScanRequested] = useState(false);
useEffect(() => {
fetch("/api/scan")
.then((r) => r.json())
.then((s: { result: string | null; requested: boolean }) => {
setScanResult(s.result);
setScanRequested(s.requested);
});
}, []);
async function requestScan() {
await fetch("/api/scan", { method: "POST" });
setScanRequested(true);
}
useEffect(() => { useEffect(() => {
fetch("/api/config") fetch("/api/config")
@@ -53,24 +69,34 @@ export function SettingsForm() {
} }
return ( return (
<form onSubmit={submit}> <>
<fieldset> <form onSubmit={submit}>
<legend>Qobuz email/password</legend> <fieldset>
<label>Qobuz email <input aria-label="qobuz email" value={qobuzEmail} onChange={(e) => setQobuzEmail(e.target.value)} /></label> <legend>Qobuz email/password</legend>
<label>Qobuz password <input aria-label="qobuz password" type="password" placeholder={pwSet ? "•••• (set)" : ""} value={qobuzPassword} onChange={(e) => setQobuzPassword(e.target.value)} /></label> <label>Qobuz email <input aria-label="qobuz email" value={qobuzEmail} onChange={(e) => setQobuzEmail(e.target.value)} /></label>
</fieldset> <label>Qobuz password <input aria-label="qobuz password" type="password" placeholder={pwSet ? "•••• (set)" : ""} value={qobuzPassword} onChange={(e) => setQobuzPassword(e.target.value)} /></label>
<fieldset> </fieldset>
<legend>Qobuz auth token (more reliable; overrides email/password)</legend> <fieldset>
<label>Qobuz user ID <input aria-label="qobuz user id" value={qobuzUserId} onChange={(e) => setQobuzUserId(e.target.value)} /></label> <legend>Qobuz auth token (more reliable; overrides email/password)</legend>
<label>Qobuz auth token <input aria-label="qobuz auth token" type="password" placeholder={tokenSet ? "•••• (set)" : ""} value={qobuzToken} onChange={(e) => setQobuzToken(e.target.value)} /></label> <label>Qobuz user ID <input aria-label="qobuz user id" value={qobuzUserId} onChange={(e) => setQobuzUserId(e.target.value)} /></label>
</fieldset> <label>Qobuz auth token <input aria-label="qobuz auth token" type="password" placeholder={tokenSet ? "•••• (set)" : ""} value={qobuzToken} onChange={(e) => setQobuzToken(e.target.value)} /></label>
<fieldset> </fieldset>
<legend>Soulseek (slskd)</legend> <fieldset>
<label>slskd URL <input aria-label="slskd url" value={slskdUrl} onChange={(e) => setSlskdUrl(e.target.value)} /></label> <legend>Soulseek (slskd)</legend>
<label>slskd API key <input aria-label="slskd api key" type="password" placeholder={keySet ? "•••• (set)" : ""} value={slskdApiKey} onChange={(e) => setSlskdApiKey(e.target.value)} /></label> <label>slskd URL <input aria-label="slskd url" value={slskdUrl} onChange={(e) => setSlskdUrl(e.target.value)} /></label>
</fieldset> <label>slskd API key <input aria-label="slskd api key" type="password" placeholder={keySet ? "•••• (set)" : ""} value={slskdApiKey} onChange={(e) => setSlskdApiKey(e.target.value)} /></label>
<button type="submit">Save</button> </fieldset>
{saved ? <span> Saved.</span> : null} <button type="submit">Save</button>
</form> {saved ? <span> Saved.</span> : null}
</form>
<section>
<h2>Library</h2>
<p>Scan <code>/music</code> and record what's already on disk as owned + monitored.</p>
<button type="button" onClick={requestScan} disabled={scanRequested}>
{scanRequested ? "Scan requested…" : "Scan library"}
</button>
{scanResult ? <p aria-label="scan result">Last scan: {scanResult}</p> : null}
</section>
</>
); );
} }