"use client"; import { useTranslations } from "next-intl"; import { useId, useState } from "react"; import { toast } from "sonner"; import { deleteTableView, listTableViews, saveTableView, } from "@/actions/admin-table-views"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { captureTableView, type NamedTableView, } from "@/lib/admin/table-view-state"; export function TableSavedViews({ path, query, hidden, onApply, }: { path: string; query: string; hidden: string[]; onApply: (view: NamedTableView) => void; }) { const inputId = useId(); const t = useTranslations("pages.admin.table.views"); const [views, setViews] = useState([]); const [name, setName] = useState(""); const [busy, setBusy] = useState(false); const [loaded, setLoaded] = useState(false); const [error, setError] = useState(false); async function load() { setBusy(true); setError(false); setLoaded(false); setViews([]); try { const result = await listTableViews({ path }); if (!result.ok) throw new Error(result.error); setViews((result.data as { views: NamedTableView[] }).views); setLoaded(true); } catch { setError(true); } finally { setBusy(false); } } async function save() { if (busy || !name.trim()) return; setBusy(true); try { const result = await saveTableView({ path, name: name.trim(), state: captureTableView(query, hidden), }); if (!result.ok) throw new Error(result.error); toast.success(t("saved")); setName(""); await load(); } catch { toast.error(t("error")); } finally { setBusy(false); } } async function remove(view: NamedTableView) { if (busy) return; setBusy(true); try { const result = await deleteTableView({ path, name: view.name }); if (!result.ok) throw new Error(result.error); await load(); } catch { toast.error(t("error")); } finally { setBusy(false); } } return ( { if (open) void load(); }} >

{t("hint")}

{error && (

{t("error")}{" "}

)} {busy && (

{t("loading")}

)} {loaded && views.length === 0 && (

{t("empty")}

)}
{views.map((view) => (
))}
); }