// ======================================== // Hook Card Component // ======================================== // Individual hook display card with actions import { useIntl } from 'react-intl'; import { GitFork, Power, PowerOff, Edit, Trash2, ChevronDown, ChevronUp, } from 'lucide-react'; import { Card } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { cn } from '@/lib/utils'; // ========== Types ========== export type HookTriggerType = 'UserPromptSubmit' | 'PreToolUse' | 'PostToolUse' | 'Stop'; export interface HookCardData { name: string; description?: string; enabled: boolean; trigger: HookTriggerType; matcher?: string; command?: string; script?: string; } export interface HookCardProps { hook: HookCardData; isExpanded: boolean; onToggleExpand: () => void; onToggle: (hookName: string, enabled: boolean) => void; onEdit: (hook: HookCardData) => void; onDelete: (hookName: string) => void; } // ========== Helper Functions ========== function getTriggerIcon(trigger: HookTriggerType) { switch (trigger) { case 'UserPromptSubmit': return '⚡'; case 'PreToolUse': return '🔧'; case 'PostToolUse': return '✅'; case 'Stop': return '🛑'; default: return '📌'; } } function getTriggerVariant(trigger: HookTriggerType): 'default' | 'secondary' | 'outline' { switch (trigger) { case 'UserPromptSubmit': return 'default'; case 'PreToolUse': return 'secondary'; case 'PostToolUse': return 'outline'; case 'Stop': return 'secondary'; default: return 'outline'; } } // ========== Component ========== export function HookCard({ hook, isExpanded, onToggleExpand, onToggle, onEdit, onDelete, }: HookCardProps) { const { formatMessage } = useIntl(); const handleToggle = () => { onToggle(hook.name, !hook.enabled); }; const handleEdit = () => { onEdit(hook); }; const handleDelete = () => { if (confirm(formatMessage({ id: 'cliHooks.actions.deleteConfirm' }, { hookName: hook.name }))) { onDelete(hook.name); } }; return ( {/* Header */}
{hook.name} {getTriggerIcon(hook.trigger)} {formatMessage({ id: `cliHooks.trigger.${hook.trigger}` })} {hook.enabled ? formatMessage({ id: 'common.status.enabled' }) : formatMessage({ id: 'common.status.disabled' }) }
{hook.description && (

{hook.description}

)}
{/* Action Buttons */}
{/* Expanded Content */} {isExpanded && (
{hook.description && (

{hook.description}

)}

{hook.matcher || formatMessage({ id: 'cliHooks.allTools' })}

{hook.command || hook.script || 'N/A'}

)}
); } export default HookCard;