Files
jp 489241b798 Sync React frontend into git
- Replace stale TanStack Router scaffold with working react-router-dom app
- Add all 9 page components + cyber theme CSS
- Remove routeTree.gen.ts, add index.css, query.ts
2026-08-13 18:22:03 +01:00

68 lines
3.3 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { api } from "../lib/api";
export default function SettingsPage() {
const qc = useQueryClient();
const { data, isLoading, error } = useQuery({ queryKey: ["settings"], queryFn: api.settings });
const save = useMutation({
mutationFn: api.saveSettings,
onSuccess: () => alert("Settings saved"),
});
if (isLoading) return <div className="wrap"><div className="card empty">Loading...</div></div>;
if (error) return <div className="wrap"><div className="card err">{(error as Error).message}</div></div>;
if (!data) return null;
const s = (k: string, fallback = "") => (data as any)?.[k] ?? fallback;
const yn = (k: string) => s(k, "no") === "yes";
return (
<div className="wrap">
<div className="card">
<form
onSubmit={(e) => {
e.preventDefault();
const fd = new FormData(e.currentTarget);
save.mutate(fd);
}}
>
<label>Email address</label>
<input name="email_address" defaultValue={s("email_address")} />
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="email_enabled" defaultChecked={yn("email_enabled")} /> Email notifications
</label>
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="attach_audio" defaultChecked={yn("attach_audio")} /> Attach recording to email
</label>
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="telegram_enabled" defaultChecked={yn("telegram_enabled")} /> Send Telegram DM
</label>
<label>Telegram chat ID</label>
<input name="telegram_chat_id" defaultValue={s("telegram_chat_id")} />
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="telegram_audio" defaultChecked={yn("telegram_audio")} /> Include audio as voice note
</label>
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="telegram_transcript" defaultChecked={yn("telegram_transcript")} /> Send transcript follow-up
</label>
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="transcribe" defaultChecked={yn("transcribe")} /> Transcribe recordings
</label>
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="summarise" defaultChecked={yn("summarise")} /> Generate summary
</label>
<label style={{ fontWeight: 400, margin: 0, display: "flex", alignItems: "center", gap: 5 }}>
<input type="checkbox" name="contact_lookup" defaultChecked={yn("contact_lookup")} /> Resolve caller ID from contacts
</label>
<div className="row" style={{ marginTop: 16 }}>
<button type="submit" className="primary">Save</button>
</div>
</form>
</div>
</div>
);
}