import type { PluginDashboardViewContext } from "@fusion/dashboard/app/plugins/types"; import { List, Pencil, RefreshCw, Trash2 } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { EditDraftModal } from "./manage/EditDraftModal.js"; import { useDrafts } from "./manage/useDrafts.js"; import { CliPrintingPressTestRunner } from "./run/TestRunnerPanel.js"; import type { ServiceDraft } from "./wizard/types.js"; import "./manage-view.css"; // FN-3763 symbol drift note: plugin id/registry route uses "fusion-plugin-cli-printing-press" // and bundled registration lives in registerBundledPluginViews.ts (not pluginViewRegistry.tsx). export function CliPrintingPressManageView({ context: _context }: { context?: PluginDashboardViewContext }) { const { drafts, loading, error, refresh, getDraft, updateDraft, regenerateDraft, deleteDraft } = useDrafts(); const [selectedId, setSelectedId] = useState(null); const [selectedDraft, setSelectedDraft] = useState(null); const [detailError, setDetailError] = useState(null); const [statusMessage, setStatusMessage] = useState(null); const [isEditOpen, setIsEditOpen] = useState(false); useEffect(() => { if (!drafts.length) { setSelectedId(null); setSelectedDraft(null); return; } const activeId = selectedId && drafts.some((item) => item.id === selectedId) ? selectedId : drafts[0]?.id ?? null; setSelectedId(activeId); }, [drafts, selectedId]); useEffect(() => { if (!selectedId) return; void (async () => { try { setDetailError(null); setSelectedDraft(await getDraft(selectedId)); } catch (err) { setDetailError(err instanceof Error ? err.message : "Failed to load draft details"); } })(); }, [getDraft, selectedId]); const selectedListItem = useMemo(() => drafts.find((item) => item.id === selectedId) ?? null, [drafts, selectedId]); async function onRegenerate() { if (!selectedId) return; try { const response = await regenerateDraft(selectedId); setSelectedDraft(response.draft); setStatusMessage(`Regenerated at ${new Date(response.artifact.generatedAt).toLocaleString()}`); await refresh(); } catch (err) { setStatusMessage(err instanceof Error ? err.message : "Failed to regenerate draft"); } } async function onDelete() { if (!selectedId) return; if (!globalThis.confirm("Delete this draft?")) return; try { await deleteDraft(selectedId); setStatusMessage("Draft removed"); await refresh(); } catch (err) { setStatusMessage(err instanceof Error ? err.message : "Failed to delete draft"); } } async function onSaveEditedDraft(nextDraft: ServiceDraft) { if (!selectedId) return; const saved = await updateDraft(selectedId, nextDraft); setSelectedDraft(saved); setIsEditOpen(false); setStatusMessage("Draft updated"); await refresh(); } if (loading) return

Loading drafts…

; if (error) return

{error}

; return (

Manage Service CLIs

{statusMessage ?

{statusMessage}

: null} {!drafts.length ?

No saved drafts yet. Use the Create Service CLI view to add one.

: (
{drafts.map((draft) => ( ))}
{detailError ?

{detailError}

: null} {selectedDraft ? ( <>

{selectedDraft.name}

Slug: {selectedListItem?.slug}

Base URL: {selectedDraft.baseUrl}

Endpoints: {selectedDraft.endpoints.length}

Credentials: {selectedDraft.credential.kind}

Updated: {new Date(selectedDraft.updatedAt).toLocaleString()}

) :

Select a draft to inspect details.

}
)} {isEditOpen && selectedDraft ? setIsEditOpen(false)} onSave={onSaveEditedDraft} /> : null}
); } export default CliPrintingPressManageView;