"use client"; import { useState } from "react"; import { apiFetch, ApiError } from "@/lib/api"; import { useList } from "@/lib/useResource"; import { useToast } from "@/components/toast"; import { DataTable, type Column } from "@/components/DataTable"; import { Button, ConfirmDialog, Field, Input, Select, Modal, PageHeader, } from "@/components/ui"; import { EditIcon, PlusIcon, TrashIcon } from "@/components/icons"; import { toFa, formatDuration } from "@/lib/utils"; interface TimerPreset { id: number; name: string; duration_seconds: number; start_bell_id: number | null; end_bell_id: number | null; interval_bell_id: number | null; interval_seconds: number | null; interval_repeat: number | null; background_sound_id: number | null; background_image_id: number | null; volume: number | null; } interface BellSound { id: number; name: string; } interface BackgroundSound { id: number; name: string; } const emptyForm = { name: "", duration_seconds: "", start_bell_id: "", end_bell_id: "", interval_bell_id: "", interval_seconds: "", interval_repeat: "", background_sound_id: "", background_image_id: "", volume: "", }; export default function TimerPresetsPage() { const { data, loading, error, reload } = useList("/timer-presets"); const { data: bells } = useList("/bell-sounds"); const { data: backgroundSounds } = useList("/background-sounds"); const toast = useToast(); const [editing, setEditing] = useState(null); const [open, setOpen] = useState(false); const [form, setForm] = useState({ ...emptyForm }); const [saving, setSaving] = useState(false); const [deleting, setDeleting] = useState(null); const [removing, setRemoving] = useState(false); function set(key: K, value: string) { setForm((f) => ({ ...f, [key]: value })); } function openCreate() { setEditing(null); setForm({ ...emptyForm }); setOpen(true); } function openEdit(row: TimerPreset) { setEditing(row); setForm({ name: row.name ?? "", duration_seconds: row.duration_seconds?.toString() ?? "", start_bell_id: row.start_bell_id?.toString() ?? "", end_bell_id: row.end_bell_id?.toString() ?? "", interval_bell_id: row.interval_bell_id?.toString() ?? "", interval_seconds: row.interval_seconds?.toString() ?? "", interval_repeat: row.interval_repeat?.toString() ?? "", background_sound_id: row.background_sound_id?.toString() ?? "", background_image_id: row.background_image_id?.toString() ?? "", volume: row.volume?.toString() ?? "", }); setOpen(true); } function toNum(value: string): number | null { if (value === "" || value === null || value === undefined) return null; const n = Number(value); return Number.isNaN(n) ? null : n; } async function save(e: React.FormEvent) { e.preventDefault(); setSaving(true); try { const body = { name: form.name, duration_seconds: toNum(form.duration_seconds), start_bell_id: toNum(form.start_bell_id), end_bell_id: toNum(form.end_bell_id), interval_bell_id: toNum(form.interval_bell_id), interval_seconds: toNum(form.interval_seconds), interval_repeat: toNum(form.interval_repeat), background_sound_id: toNum(form.background_sound_id), background_image_id: toNum(form.background_image_id), volume: toNum(form.volume), }; if (editing) { await apiFetch(`/timer-presets/${editing.id}`, { method: "PUT", body, }); toast.success("پیش‌تنظیم ویرایش شد."); } else { await apiFetch("/timer-presets", { method: "POST", body, }); toast.success("پیش‌تنظیم افزوده شد."); } setOpen(false); reload(); } catch (err) { toast.error(err instanceof ApiError ? err.message : "خطا در ذخیره‌سازی"); } finally { setSaving(false); } } async function confirmDelete() { if (!deleting) return; setRemoving(true); try { await apiFetch(`/timer-presets/${deleting.id}`, { method: "DELETE" }); toast.success("پیش‌تنظیم حذف شد."); setDeleting(null); reload(); } catch (err) { toast.error(err instanceof ApiError ? err.message : "خطا در حذف"); } finally { setRemoving(false); } } const columns: Column[] = [ { key: "id", header: "شناسه", render: (r) => toFa(r.id), className: "w-24" }, { key: "name", header: "نام" }, { key: "duration_seconds", header: "مدت", render: (r) => formatDuration(r.duration_seconds), }, { key: "volume", header: "صدا", render: (r) => toFa(r.volume ?? "—") }, ]; return (
} onClick={openCreate}> پیش‌تنظیم جدید } /> } onClick={openCreate}> پیش‌تنظیم جدید } actions={(row) => ( <> )} /> setOpen(false)} title={editing ? "ویرایش پیش‌تنظیم" : "پیش‌تنظیم جدید"} footer={ <> } >
set("name", e.target.value)} placeholder="مثلاً مدیتیشن صبحگاهی" required autoFocus /> set("duration_seconds", e.target.value)} placeholder="مثلاً ۶۰۰" required /> set("interval_seconds", e.target.value)} /> set("interval_repeat", e.target.value)} /> set("background_image_id", e.target.value)} /> set("volume", e.target.value)} placeholder="مثلاً ۸۰" />
setDeleting(null)} />
); }