import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Puzzle, ShieldCheck } from "lucide-react"; import { toast } from "sonner"; import { SettingRow } from "@/components/section-card"; import { Button } from "@/components/button"; import { getPlugins, setPluginEnabled, type PluginSummary, } from "@/api/plugins-api"; import { refreshPluginState } from "@/shell/pluginLoader"; import { AccordionSection, AdminToggle } from "./AdminSettingsShared"; import { PluginPermissionsDialog } from "./PluginPermissionsDialog"; export function AdminPluginsSection({ open, onToggle, }: { open: boolean; onToggle: () => void; }) { const { t } = useTranslation(); const [plugins, setPlugins] = useState([]); const [busy, setBusy] = useState(null); const [loaded, setLoaded] = useState(false); const [permissionsTargetId, setPermissionsTargetId] = useState( null, ); const permissionsTarget = plugins.find((plugin) => plugin.id === permissionsTargetId) ?? null; const load = useCallback(async () => { try { setPlugins(await getPlugins()); } catch { toast.error(t("admin.pluginsLoadFailed")); } finally { setLoaded(true); } }, [t]); useEffect(() => { if (open && !loaded) void load(); }, [open, loaded, load]); const toggle = async (plugin: PluginSummary) => { setBusy(plugin.id); try { await setPluginEnabled(plugin.id, !plugin.enabled); await load(); // Re-read state so the shell picks the change up without a reload. await refreshPluginState(); toast.success( plugin.enabled ? t("admin.pluginDisabled", { name: plugin.name }) : t("admin.pluginEnabled", { name: plugin.name }), ); } catch { toast.error(t("admin.pluginToggleFailed")); } finally { setBusy(null); } }; return ( <> } open={open} onToggle={onToggle} > {plugins.length === 0 ? (

{loaded ? t("admin.pluginsNone") : t("common.loading")}

) : ( plugins.map((plugin) => (
{(plugin.capabilities?.length ?? 0) > 0 && ( )} void toggle(plugin)} disabled={busy === plugin.id} />
)) )}
{ if (!next) setPermissionsTargetId(null); }} onChanged={() => void load()} /> ); }