'use client' import { useState } from 'react' // 模擬分析後的詞彙資料 interface WordAnalysis { word: string translation: string definition: string partOfSpeech: string pronunciation: string synonyms: string[] isPhrase: boolean phraseInfo?: { phrase: string meaning: string warning: string } } interface ClickableTextProps { text: string analysis?: Record onWordClick?: (word: string, analysis: WordAnalysis) => void } export function ClickableText({ text, analysis, onWordClick }: ClickableTextProps) { const [selectedWord, setSelectedWord] = useState(null) const [popupPosition, setPopupPosition] = useState({ x: 0, y: 0 }) // 將文字分割成單字 const words = text.split(/(\s+|[.,!?;:])/g).filter(word => word.trim()) const handleWordClick = (word: string, event: React.MouseEvent) => { const cleanWord = word.toLowerCase().replace(/[.,!?;:]/g, '') const wordAnalysis = analysis?.[cleanWord] if (wordAnalysis) { const rect = event.currentTarget.getBoundingClientRect() setPopupPosition({ x: rect.left + rect.width / 2, y: rect.top - 10 }) setSelectedWord(cleanWord) onWordClick?.(cleanWord, wordAnalysis) } } const closePopup = () => { setSelectedWord(null) } const getWordClass = (word: string) => { const cleanWord = word.toLowerCase().replace(/[.,!?;:]/g, '') const wordAnalysis = analysis?.[cleanWord] if (!wordAnalysis) return "cursor-default" const baseClass = "cursor-pointer transition-all duration-200 hover:bg-blue-100 rounded px-1" if (wordAnalysis.isPhrase) { return `${baseClass} bg-yellow-100 border-b-2 border-yellow-400 hover:bg-yellow-200` } return `${baseClass} hover:bg-blue-200 border-b border-blue-300` } return (
{/* 點擊區域遮罩 */} {selectedWord && (
)} {/* 文字內容 */}
{words.map((word, index) => { if (word.trim() === '') return {word} return ( handleWordClick(word, e)} > {word} ) })}
{/* 彈出視窗 */} {selectedWord && analysis?.[selectedWord] && (
{/* 標題 */}

{analysis[selectedWord].word}

{/* 片語警告 */} {analysis[selectedWord].isPhrase && analysis[selectedWord].phraseInfo && (
⚠️
注意:這個單字屬於片語
片語:{analysis[selectedWord].phraseInfo.phrase}
意思:{analysis[selectedWord].phraseInfo.meaning}
)} {/* 詞性和發音 */}
{analysis[selectedWord].partOfSpeech} {analysis[selectedWord].pronunciation}
{/* 翻譯 */}
翻譯
{analysis[selectedWord].translation}
{/* 定義 */}
定義
{analysis[selectedWord].definition}
{/* 同義詞 */} {analysis[selectedWord].synonyms.length > 0 && (
同義詞
{analysis[selectedWord].synonyms.map((synonym, idx) => ( {synonym} ))}
)}
)}
) }