import { useState } from 'react'; import { createLogger } from '@automaker/utils/logger'; import { Button } from '@/components/ui/button'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Sparkles, ChevronDown, ChevronRight } from 'lucide-react'; import { toast } from 'sonner'; import { getElectronAPI } from '@/lib/electron'; import { ModelOverrideTrigger, useModelOverride } from '@/components/shared'; import { EnhancementMode, ENHANCEMENT_MODE_LABELS } from './enhancement-constants'; const logger = createLogger('EnhanceWithAI'); interface EnhanceWithAIProps { /** Current text value to enhance */ value: string; /** Callback when text is enhanced */ onChange: (enhancedText: string) => void; /** Optional callback to track enhancement in history */ onHistoryAdd?: (entry: { mode: EnhancementMode; originalText: string; enhancedText: string; }) => void; /** Disable the enhancement feature */ disabled?: boolean; /** Additional CSS classes */ className?: string; } /** * Reusable "Enhance with AI" component * * Provides AI-powered text enhancement with multiple modes: * - Improve Clarity * - Add Technical Details * - Simplify * - Add Acceptance Criteria * - User Experience * * Used in Add Feature, Edit Feature, and Follow-Up dialogs. */ export function EnhanceWithAI({ value, onChange, onHistoryAdd, disabled = false, className, }: EnhanceWithAIProps) { const [isEnhancing, setIsEnhancing] = useState(false); const [enhancementMode, setEnhancementMode] = useState('improve'); const [enhanceOpen, setEnhanceOpen] = useState(false); // Enhancement model override const enhancementOverride = useModelOverride({ phase: 'enhancementModel' }); const handleEnhance = async () => { if (!value.trim() || isEnhancing || disabled) return; setIsEnhancing(true); try { const api = getElectronAPI(); const result = await api.enhancePrompt?.enhance( value, enhancementMode, enhancementOverride.effectiveModel, enhancementOverride.effectiveModelEntry.thinkingLevel ); if (result?.success && result.enhancedText) { const originalText = value; const enhancedText = result.enhancedText; onChange(enhancedText); // Track in history if callback provided (includes original for restoration) onHistoryAdd?.({ mode: enhancementMode, originalText, enhancedText }); toast.success('Enhanced successfully!'); } else { toast.error(result?.error || 'Failed to enhance'); } } catch (error) { logger.error('Enhancement failed:', error); toast.error('Failed to enhance'); } finally { setIsEnhancing(false); } }; return (
{(Object.entries(ENHANCEMENT_MODE_LABELS) as [EnhancementMode, string][]).map( ([mode, label]) => ( setEnhancementMode(mode)}> {label} ) )}
); }