import React, { useState, useEffect } from 'react' import { Sparkles, ArrowRight, X, RefreshCw, Check, Eraser } from 'lucide-react' import ReactMarkdown from 'react-markdown' import { chatService } from '../services/chatService' import { useLanguage } from '../contexts/LanguageContext' interface AICommandDrawerProps { isOpen: boolean onClose: () => void context: string onApply: (content: string) => void authToken: string } const PRESET_COMMANDS = [ { label: 'polishContent', valueKey: 'aiCommandInstructPolish' }, { label: 'expandContent', valueKey: 'aiCommandInstructExpand' }, { label: 'summarizeContent', valueKey: 'aiCommandInstructSummarize' }, { label: 'translateToEnglish', valueKey: 'aiCommandInstructTranslateToEn' }, { label: 'fixGrammar', valueKey: 'aiCommandInstructFixGrammar' }, ] export const AICommandDrawer: React.FC = ({ isOpen, onClose, context, onApply, authToken }) => { const { t } = useLanguage() const [instruction, setInstruction] = useState('') const [result, setResult] = useState('') const [isGenerating, setIsGenerating] = useState(false) const [mode, setMode] = useState<'input' | 'preview'>('input') useEffect(() => { if (isOpen) { setInstruction('') setResult('') setMode('input') setIsGenerating(false) } }, [isOpen]) const handleGenerate = async () => { if (!instruction) return setMode('preview') setIsGenerating(true) setResult('') try { const stream = chatService.streamAssist(instruction, context, authToken) for await (const chunk of stream) { if (chunk.type === 'content') { setResult(prev => prev + chunk.data) } else if (chunk.type === 'error') { setResult(prev => prev + `\n\n[Error: ${chunk.data}]`) } } } catch (error) { console.error(error) setResult(prev => prev + '\n\n[' + t('aiCommandsError') + ']') } finally { setIsGenerating(false) } } // Drawer Styles const drawerClasses = `fixed inset-y-0 right-0 z-50 w-96 bg-white shadow-2xl transform transition-transform duration-300 ease-in-out ${isOpen ? 'translate-x-0' : 'translate-x-full' }` // Overlay for closing on click outside (optional, but good UX) // Using a transparent overlay that allows interaction with the editor might be desired? // Usually drawers have a backdrop. User said "Show AI assistant page in right drawer", likely implies a standard drawer behavior. return ( <> {/* Backdrop */} {isOpen && (
)}
{/* Header */}

{t('aiAssistant')}

{/* Content */}
{mode === 'input' ? (
{PRESET_COMMANDS.map(cmd => ( ))}