import React, { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { FileText } from "lucide-react"; import { type AppId } from "@/lib/api"; import { usePromptActions } from "@/hooks/usePromptActions"; import PromptListItem from "./PromptListItem"; import PromptFormPanel from "./PromptFormPanel"; import { ConfirmDialog } from "../ConfirmDialog"; interface PromptPanelProps { open: boolean; onOpenChange: (open: boolean) => void; appId: AppId; } export interface PromptPanelHandle { openAdd: () => void; } const PromptPanel = React.forwardRef( ({ open, appId }, ref) => { const { t } = useTranslation(); const [isFormOpen, setIsFormOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [confirmDialog, setConfirmDialog] = useState<{ isOpen: boolean; titleKey: string; messageKey: string; messageParams?: Record; onConfirm: () => void; } | null>(null); const { prompts, loading, reload, savePrompt, deletePrompt, toggleEnabled, } = usePromptActions(appId); useEffect(() => { if (open) reload(); }, [open, reload]); // Listen for prompt import events from deep link useEffect(() => { const handlePromptImported = (event: Event) => { const customEvent = event as CustomEvent; // Reload if the import is for this app if (customEvent.detail?.app === appId) { reload(); } }; window.addEventListener("prompt-imported", handlePromptImported); return () => { window.removeEventListener("prompt-imported", handlePromptImported); }; }, [appId, reload]); const handleAdd = () => { setEditingId(null); setIsFormOpen(true); }; React.useImperativeHandle(ref, () => ({ openAdd: handleAdd, })); const handleEdit = (id: string) => { setEditingId(id); setIsFormOpen(true); }; const handleDelete = (id: string) => { const prompt = prompts[id]; setConfirmDialog({ isOpen: true, titleKey: "prompts.confirm.deleteTitle", messageKey: "prompts.confirm.deleteMessage", messageParams: { name: prompt?.name }, onConfirm: async () => { try { await deletePrompt(id); setConfirmDialog(null); } catch (e) { // Error handled by hook } }, }); }; const promptEntries = useMemo(() => Object.entries(prompts), [prompts]); const enabledPrompt = promptEntries.find(([_, p]) => p.enabled); return (
{t("prompts.count", { count: promptEntries.length })} ยท{" "} {enabledPrompt ? t("prompts.enabledName", { name: enabledPrompt[1].name }) : t("prompts.noneEnabled")}
{loading ? (
{t("prompts.loading")}
) : promptEntries.length === 0 ? (

{t("prompts.empty")}

{t("prompts.emptyDescription")}

) : (
{promptEntries.map(([id, prompt]) => ( ))}
)}
{isFormOpen && ( setIsFormOpen(false)} /> )} {confirmDialog && ( setConfirmDialog(null)} /> )}
); }, ); PromptPanel.displayName = "PromptPanel"; export default PromptPanel;