"use client"; import { useEffect, useState } from "react"; import { getModules, toggleModule } from "@/services/modules"; import { usePermissions } from "@/hooks/usePermissions"; import { useApiStore, useLocaleStore } from "@/store/uiStore"; import DataTable from "@/components/ui/Table"; import { ModuleItem } from "@/types/api"; import { t } from "@/lib/locale"; import PageHeader from "@/components/ui/PageHeader"; import ConfirmDialog from "@/components/ui/ConfirmDialog"; export default function ModulesPage() { const locale = useLocaleStore((s) => s.locale); const permissions = usePermissions(); const addToast = useApiStore((s) => s.addToast); const [modules, setModules] = useState([]); const [pendingModule, setPendingModule] = useState(null); const [confirmLoading, setConfirmLoading] = useState(false); useEffect(() => { const loadModules = async () => { if (!permissions.isAdmin) return; try { const rows = await getModules(); setModules(rows); } catch (error) { addToast((error as { message?: string })?.message || t("loadFailed", locale), "error"); } }; loadModules(); }, [permissions.isAdmin, addToast, locale]); const onToggle = (row: ModuleItem) => { setPendingModule(row); }; const onConfirmToggle = async () => { if (!pendingModule) return; setConfirmLoading(true); try { await toggleModule(pendingModule.code, { enabled: !pendingModule.enabled }); setModules((prev) => prev.map((item) => item.code === pendingModule.code ? { ...item, enabled: !pendingModule.enabled } : item ) ); addToast(t("moduleToggled", locale), "success"); } catch (error) { addToast((error as { message?: string })?.message || t("actionFailed", locale), "error"); } finally { setPendingModule(null); setConfirmLoading(false); } }; if (!permissions.isAdmin) { return
{t("forbidden", locale)}
; } return (
( {row.enabled ? t("enabled", locale) : t("disabled", locale)} ) }, { key: "actions", header: t("actions", locale), render: (row) => ( ) } ]} data={modules} />
setPendingModule(null)} confirmLabel={t("save", locale)} cancelLabel="Cancel" loading={confirmLoading} />
); }