import { useState } from "react"; import { useTranslation } from "@termix/plugin-sdk/frontend"; import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, FOLDER_COLORS, Input, } from "@termix/plugin-sdk/ui"; import { FolderIcon } from "./folder-icons"; import { FOLDER_ICONS, type FolderIconId, type SnippetFolder } from "./types"; export interface FolderFormValues { name: string; color: string; icon: FolderIconId; } export function SnippetFolderDialog({ folder, onClose, onSave, }: { /** The folder being edited, or null to create one. */ folder: SnippetFolder | null; onClose: () => void; onSave: (values: FolderFormValues) => Promise; }) { const { t } = useTranslation(); const [name, setName] = useState(folder?.name ?? ""); const [color, setColor] = useState(folder?.color ?? FOLDER_COLORS[0]); const [icon, setIcon] = useState( (folder?.icon as FolderIconId) ?? "folder", ); const [saving, setSaving] = useState(false); const isEdit = folder !== null; async function handleSave() { if (!name.trim()) return; setSaving(true); try { await onSave({ name: name.trim(), color, icon }); } finally { setSaving(false); } } return ( !open && onClose()}> {t(isEdit ? "editFolderTitle" : "createFolderTitle")} {t(isEdit ? "editFolderDescription" : "createFolderDescription")}
setName(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") void handleSave(); }} />
{FOLDER_COLORS.map((c) => (
{FOLDER_ICONS.map((id) => ( ))}
{name.trim() || t("folderNamePlaceholder")}
); }