/** * Hook for AddTriggerForm state management. * Extracts all useState calls and resetForm logic from AddTriggerForm. */ import { useCallback, useState } from 'react'; import type { TriggerContentType, TriggerMode, TriggerTokenType } from '@renderer/types/data'; import type { TriggerColor } from '@shared/constants/triggerColors'; interface AddTriggerFormState { // Section 1: General Info name: string; toolName: string; // Section 2: Trigger Condition mode: TriggerMode; // Section 3: Dynamic Configuration // Content match settings contentType: TriggerContentType; matchField: string; matchPattern: string; // Token threshold settings tokenThreshold: number; tokenType: TriggerTokenType; // Section 4: Advanced ignorePatterns: string[]; // Section 5: Repository Scope repositoryIds: string[]; // Display color: TriggerColor; // UI state isExpanded: boolean; } export interface AddTriggerFormStateReturn extends AddTriggerFormState { setName: (name: string) => void; setToolName: (toolName: string) => void; setMode: (mode: TriggerMode) => void; setContentType: (contentType: TriggerContentType) => void; setMatchField: (matchField: string) => void; setMatchPattern: (matchPattern: string) => void; setTokenThreshold: (threshold: number) => void; setTokenType: (tokenType: TriggerTokenType) => void; setIgnorePatterns: (patterns: string[]) => void; setRepositoryIds: (ids: string[]) => void; setColor: (color: TriggerColor) => void; setIsExpanded: (expanded: boolean) => void; resetForm: () => void; } /** * Hook for managing AddTriggerForm state. */ export function useAddTriggerFormState(): AddTriggerFormStateReturn { // Section 1: General Info const [name, setName] = useState(''); const [toolName, setToolName] = useState(''); // Section 2: Trigger Condition const [mode, setMode] = useState('error_status'); // Section 3: Dynamic Configuration // Content match settings const [contentType, setContentType] = useState('tool_result'); const [matchField, setMatchField] = useState('content'); const [matchPattern, setMatchPattern] = useState(''); // Token threshold settings const [tokenThreshold, setTokenThreshold] = useState(1000); const [tokenType, setTokenType] = useState('total'); // Section 4: Advanced const [ignorePatterns, setIgnorePatterns] = useState([]); // Section 5: Repository Scope const [repositoryIds, setRepositoryIds] = useState([]); // Display const [color, setColor] = useState('red'); // UI state const [isExpanded, setIsExpanded] = useState(false); const resetForm = useCallback(() => { setName(''); setToolName(''); setMode('error_status'); setContentType('tool_result'); setMatchField('content'); setMatchPattern(''); setTokenThreshold(1000); setTokenType('total'); setIgnorePatterns([]); setRepositoryIds([]); // Intentionally do NOT reset color — preserve last-used color across triggers }, []); return { // State values name, toolName, mode, contentType, matchField, matchPattern, tokenThreshold, tokenType, ignorePatterns, repositoryIds, color, isExpanded, // Setters setName, setToolName, setMode, setContentType, setMatchField, setMatchPattern, setTokenThreshold, setTokenType, setIgnorePatterns, setRepositoryIds, setColor, setIsExpanded, resetForm, }; }