'use client' import { useState, useMemo, useCallback } from 'react' import { ProtectedRoute } from '@/components/ProtectedRoute' import { Navigation } from '@/components/Navigation' import { ClickableTextV2 } from '@/components/ClickableTextV2' import { flashcardsService } from '@/lib/services/flashcards' import Link from 'next/link' // 常數定義 const CEFR_LEVELS = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2'] as const const MAX_MANUAL_INPUT_LENGTH = 300 // 工具函數 const getLevelIndex = (level: string): number => { return CEFR_LEVELS.indexOf(level as typeof CEFR_LEVELS[number]) } const getTargetLearningRange = (userLevel: string): string => { const ranges: Record = { 'A1': 'A2-B1', 'A2': 'B1-B2', 'B1': 'B2-C1', 'B2': 'C1-C2', 'C1': 'C2', 'C2': 'C2' } return ranges[userLevel] || 'B1-B2' } interface GrammarCorrection { hasErrors: boolean; originalText: string; correctedText: string; corrections: Array<{ error: string; correction: string; type: string; explanation: string; }>; } interface PhrasePopup { phrase: string; analysis: any; position: { x: number; y: number }; } function GenerateContent() { const [textInput, setTextInput] = useState('') const [isAnalyzing, setIsAnalyzing] = useState(false) const [showAnalysisView, setShowAnalysisView] = useState(false) const [sentenceAnalysis, setSentenceAnalysis] = useState | null>(null) const [sentenceMeaning, setSentenceMeaning] = useState('') const [grammarCorrection, setGrammarCorrection] = useState(null) const [finalText, setFinalText] = useState('') const [phrasePopup, setPhrasePopup] = useState(null) // 處理句子分析 - 使用真實API const handleAnalyzeSentence = async () => { console.log('🚀 handleAnalyzeSentence 被調用 (真實API模式)') setIsAnalyzing(true) try { const userLevel = localStorage.getItem('userEnglishLevel') || 'A2' const response = await fetch('http://localhost:5008/api/ai/analyze-sentence', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ inputText: textInput, userLevel: userLevel, analysisMode: 'full', options: { includeGrammarCheck: true, includeVocabularyAnalysis: true, includeTranslation: true, includePhraseDetection: true, includeExamples: true } }) }) if (!response.ok) { const errorData = await response.json() throw new Error(errorData.error?.message || `API請求失敗: ${response.status}`) } const result = await response.json() if (!result.success || !result.data) { throw new Error('API回應格式錯誤') } // 處理API回應 const apiData = result.data // 設定分析結果 setSentenceAnalysis(apiData.vocabularyAnalysis || {}) setSentenceMeaning(apiData.sentenceMeaning || '') // 處理語法修正 if (apiData.grammarCorrection) { setGrammarCorrection({ hasErrors: apiData.grammarCorrection.hasErrors, originalText: textInput, correctedText: apiData.grammarCorrection.correctedText || textInput, corrections: apiData.grammarCorrection.corrections || [] }) // 使用修正後的文本作為最終文本 setFinalText(apiData.grammarCorrection.correctedText || textInput) } else { setFinalText(textInput) } setShowAnalysisView(true) console.log('✅ API分析完成', apiData) } catch (error) { console.error('Error in sentence analysis:', error) setGrammarCorrection({ hasErrors: true, originalText: textInput, correctedText: textInput, corrections: [] }) setSentenceMeaning('分析過程中發生錯誤,請稍後再試。') setFinalText(textInput) setShowAnalysisView(true) } finally { setIsAnalyzing(false) } } const handleAcceptCorrection = useCallback(() => { if (grammarCorrection?.correctedText) { setFinalText(grammarCorrection.correctedText) console.log('✅ 已採用修正版本,後續學習將基於正確的句子進行!') } }, [grammarCorrection?.correctedText]) const handleRejectCorrection = useCallback(() => { setFinalText(grammarCorrection?.originalText || textInput) console.log('📝 已保持原始版本,將基於您的原始輸入進行學習。') }, [grammarCorrection?.originalText, textInput]) // 詞彙統計計算 - 移到組件頂層避免Hooks順序問題 const vocabularyStats = useMemo(() => { if (!sentenceAnalysis) return null const userLevel = localStorage.getItem('userEnglishLevel') || 'A2' let simpleCount = 0 let moderateCount = 0 let difficultCount = 0 let phraseCount = 0 Object.entries(sentenceAnalysis).forEach(([, wordData]: [string, any]) => { const isPhrase = wordData?.isPhrase || wordData?.IsPhrase const difficultyLevel = wordData?.difficultyLevel || 'A1' if (isPhrase) { phraseCount++ } else { const userIndex = getLevelIndex(userLevel) const wordIndex = getLevelIndex(difficultyLevel) if (userIndex > wordIndex) { simpleCount++ } else if (userIndex === wordIndex) { moderateCount++ } else { difficultCount++ } } }) return { simpleCount, moderateCount, difficultCount, phraseCount } }, [sentenceAnalysis]) // 保存單個詞彙 const handleSaveWord = useCallback(async (word: string, analysis: any) => { try { const cardData = { word: word, translation: analysis.translation || analysis.Translation || '', definition: analysis.definition || analysis.Definition || '', pronunciation: analysis.pronunciation || analysis.Pronunciation || `/${word}/`, partOfSpeech: analysis.partOfSpeech || analysis.PartOfSpeech || 'unknown', example: `Example sentence with ${word}.` // 提供預設例句 } const response = await flashcardsService.createFlashcard(cardData) if (response.success) { console.log(`✅ 已將「${word}」保存到詞卡!`) return { success: true } } else { throw new Error(response.error || '保存失敗') } } catch (error) { console.error('Save word error:', error) return { success: false, error: error instanceof Error ? error.message : '保存失敗' } } }, []) return (
{!showAnalysisView ? (

AI 智能生成詞卡

{/* Content Input */}

輸入英文文本