import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { api, type Library, type AuthUser } from "../api/client"; import { useAuth } from "../auth/useAuth"; function LibraryRow({ lib, onRemove }: { lib: Library; onRemove: (id: number) => void }) { const qc = useQueryClient(); const { data } = useQuery({ queryKey: ["scan-status", lib.id], queryFn: () => api.libraries.scanStatus(lib.id), refetchInterval: (query) => (query.state.data?.scanning ? 2000 : false), }); const scanning = data?.scanning ?? false; const rescanMutation = useMutation({ mutationFn: () => api.libraries.rescan(lib.id), onSuccess: () => qc.invalidateQueries({ queryKey: ["scan-status", lib.id] }), }); return (
  • {lib.name} {scanning && ( Scanning… )}
    {lib.path}
  • ); } function UserManagement() { const qc = useQueryClient(); const { user: currentUser } = useAuth(); const { data: users = [] } = useQuery({ queryKey: ["users"], queryFn: api.auth.listUsers, }); const [newUsername, setNewUsername] = useState(""); const [newPassword, setNewPassword] = useState(""); const [userError, setUserError] = useState(""); const createMutation = useMutation({ mutationFn: () => api.auth.createUser(newUsername, newPassword), onSuccess: () => { qc.invalidateQueries({ queryKey: ["users"] }); setNewUsername(""); setNewPassword(""); setUserError(""); }, onError: (e: Error) => setUserError(e.message), }); const deleteMutation = useMutation({ mutationFn: (id: number) => api.auth.deleteUser(id), onSuccess: () => qc.invalidateQueries({ queryKey: ["users"] }), onError: (e: Error) => setUserError(e.message), }); return (

    Users

    { e.preventDefault(); createMutation.mutate(); }} style={{ display: "flex", flexDirection: "column", gap: 8, marginBottom: 24 }} > setNewUsername(e.target.value)} required autoComplete="off" /> setNewPassword(e.target.value)} required autoComplete="new-password" /> {userError &&

    {userError}

    }
    ); } export default function SettingsPage() { const qc = useQueryClient(); const { data: libraries = [] } = useQuery({ queryKey: ["libraries"], queryFn: api.libraries.list, }); const [name, setName] = useState(""); const [path, setPath] = useState(""); const [error, setError] = useState(""); const addMutation = useMutation({ mutationFn: () => api.libraries.create(name, path), onSuccess: () => { qc.invalidateQueries({ queryKey: ["libraries"] }); setName(""); setPath(""); setError(""); }, onError: (e: Error) => setError(e.message), }); const deleteMutation = useMutation({ mutationFn: (id: number) => api.libraries.delete(id), onSuccess: () => qc.invalidateQueries({ queryKey: ["libraries"] }), }); return (

    Settings

    Libraries

    { e.preventDefault(); addMutation.mutate(); }} style={{ display: "flex", flexDirection: "column", gap: 8, marginBottom: 24 }} > setName(e.target.value)} required /> setPath(e.target.value)} required /> {error &&

    {error}

    }
      {libraries.map((lib) => ( deleteMutation.mutate(id)} /> ))}
    ); }