/** * SnippetPanel — 命令片段库侧边面板 * * 功能:搜索、新建、编辑、删除命令片段,并插入到活跃终端 */ import { useState, useEffect, useCallback } from 'react' import { Code2, Plus, Search, Trash2, Copy, Pencil, X } from 'lucide-react' import { useSnippetStore, type Snippet } from '../../stores/snippetStore' import { useTabStore } from '../../stores/tabStore' import Button from '../common/Button' import Modal from '../common/Modal' import EmptyState from '../common/EmptyState' // ─── Snippet 编辑对话框 ───────────────────────────────────────── interface SnippetFormData { name: string content: string tags: string } interface SnippetFormProps { isOpen: boolean initial: SnippetFormData title: string confirmText: string onConfirm: (data: SnippetFormData) => void onClose: () => void } function SnippetFormModal({ isOpen, initial, title, confirmText, onConfirm, onClose }: SnippetFormProps) { const [form, setForm] = useState(initial) useEffect(() => { if (isOpen) { setForm(initial) } }, [isOpen, initial]) const handleConfirm = () => { if (!form.name.trim() || !form.content.trim()) return onConfirm(form) } return (
{/* 名称 */}
setForm((f) => ({ ...f, name: e.target.value }))} placeholder="例如:重启 Nginx" className="w-full px-3 py-2 bg-dark-700 border border-dark-600 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-accent-blue text-sm" />
{/* 命令内容 */}