'use client' import { useState, useEffect, useMemo } from 'react' import { WordPopup } from '@/components/word/WordPopup' import { useWordAnalysis } from '@/hooks/word/useWordAnalysis' import type { ClickableTextProps, WordAnalysis } from '@/lib/types/word' export function ClickableTextV2({ text, analysis, onWordClick, onSaveWord, remainingUsage, showIdiomsInline = true }: ClickableTextProps) { const [selectedWord, setSelectedWord] = useState(null) const [isSavingWord, setIsSavingWord] = useState(false) const [mounted, setMounted] = useState(false) const { findWordAnalysis, getWordClass, shouldShowStar } = useWordAnalysis() useEffect(() => { setMounted(true) }, []) const handleWordClick = (word: string) => { const wordAnalysis = findWordAnalysis(word, analysis) if (wordAnalysis) { setSelectedWord(word) onWordClick?.(word, wordAnalysis) } } const closePopup = () => { setSelectedWord(null) } const handleSaveWord = async (word: string, wordAnalysis: WordAnalysis) => { if (!onSaveWord) return { success: false } setIsSavingWord(true) try { const result = await onSaveWord(word, wordAnalysis) if (result.success) { closePopup() } return result } finally { setIsSavingWord(false) } } const words = useMemo(() => { const tokens = text.split(/(\s+)/) return tokens.map((token, index) => { const cleanToken = token.replace(/[^\w']/g, '') if (!cleanToken || /^\s+$/.test(token)) { return ( {token} ) } const wordAnalysis = findWordAnalysis(cleanToken, analysis) if (!wordAnalysis) { return ( {token} ) } return ( handleWordClick(cleanToken)} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { handleWordClick(cleanToken) } }} > {token} {shouldShowStar(wordAnalysis) && ( )} ) }) }, [text, analysis, findWordAnalysis, getWordClass, shouldShowStar]) return (
{words}
) }