import React, { useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import MarkdownEditor from "@/components/MarkdownEditor"; import { FullScreenPanel } from "@/components/common/FullScreenPanel"; import type { Prompt, AppId } from "@/lib/api"; interface PromptFormPanelProps { appId: AppId; editingId?: string; initialData?: Prompt; onSave: (id: string, prompt: Prompt) => Promise; onClose: () => void; } const PromptFormPanel: React.FC = ({ appId, editingId, initialData, onSave, onClose, }) => { const { t } = useTranslation(); const appName = t(`apps.${appId}`); const filenameMap: Record = { claude: "CLAUDE.md", codex: "AGENTS.md", gemini: "GEMINI.md", }; const filename = filenameMap[appId]; const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [content, setContent] = useState(""); const [saving, setSaving] = useState(false); const [isDarkMode, setIsDarkMode] = useState(false); useEffect(() => { setIsDarkMode(document.documentElement.classList.contains("dark")); const observer = new MutationObserver(() => { setIsDarkMode(document.documentElement.classList.contains("dark")); }); observer.observe(document.documentElement, { attributes: true, attributeFilter: ["class"], }); return () => observer.disconnect(); }, []); useEffect(() => { if (initialData) { setName(initialData.name); setDescription(initialData.description || ""); setContent(initialData.content); } }, [initialData]); const handleSave = async () => { if (!name.trim() || !content.trim()) { return; } setSaving(true); try { const id = editingId || `prompt-${Date.now()}`; const timestamp = Math.floor(Date.now() / 1000); const prompt: Prompt = { id, name: name.trim(), description: description.trim() || undefined, content: content.trim(), enabled: initialData?.enabled || false, createdAt: initialData?.createdAt || timestamp, updatedAt: timestamp, }; await onSave(id, prompt); onClose(); } catch (error) { // Error handled by hook } finally { setSaving(false); } }; const title = editingId ? t("prompts.editTitle", { appName }) : t("prompts.addTitle", { appName }); return (
setName(e.target.value)} placeholder={t("prompts.namePlaceholder")} className="mt-2" />
setDescription(e.target.value)} placeholder={t("prompts.descriptionPlaceholder")} className="mt-2" />
); }; export default PromptFormPanel;