// "use client"; import React, { type ReactNode, useState, useCallback, useMemo, useEffect, startTransition, useTransition, } from "react"; import { Brain, Zap, Loader2 } from "lucide-react"; import { NLP } from "sortug-ai"; import GranularityMenu, { GranularityId } from "./LevelPicker"; import TextViewer from "./TextViewer"; import { wordAction } from "@/actions/lang"; import Modal from "@/components/Modal"; // --- Granularity Definition --- type AnalysisEngine = "spacy" | "stanza"; // --- Main Application Component --- export default function NlpTextAnalysisScreen({ children, }: { children: ReactNode; }) { const [modalContent, setModalContent] = useState(null); const closeModal = () => setModalContent(null); const [selectedGranularity, setSelectedGranularity] = useState("word"); const [currentEngine, setCurrentEngine] = useState("spacy"); const [selectedElementInfo, setSelectedElementInfo] = useState( null, ); const [activeNlpData, setData] = useState(); useEffect(() => { const nlpdata = sessionStorage.getItem( currentEngine === "spacy" ? "spacyres" : "stanzares", ); const parsed = JSON.parse(nlpdata!); setData(parsed); }, []); const handleGranularityChange = useCallback((granularity: GranularityId) => { setSelectedGranularity(granularity); setSelectedElementInfo(null); }, []); const [isPending, startTransition] = useTransition(); const handleElementSelect = useCallback( (elementType: GranularityId, elementData: any, elementText: string) => { if (elementType === "word") { startTransition(async () => { const modal = await wordAction(elementData.lemma, "en"); setModalContent(modal); }); } }, [currentEngine], ); // const handleElementSelect = useCallback( // (elementType: GranularityId, elementData: any, elementText: string) => { // let info = `Selected: ${elementType.toUpperCase()} (${currentEngine})\n`; // info += `Text: "${elementText}"\n`; // if (elementType === "syllable" || elementType === "phoneme") { // info += `(Granularity: ${elementType}, showing parent Word/Token details)\n`; // } // // Add specific details based on element type and engine // if (elementType === "word") { // if (currentEngine === "stanza" && elementData.lemma) { // // StanzaWord // info += `Lemma: ${elementData.lemma}\nUPOS: ${elementData.upos}\nXPOS: ${elementData.xpos}\nDepRel: ${elementData.deprel} (Head ID: ${elementData.head})\n`; // if (elementData.parentToken?.ner) // info += `NER (Token): ${elementData.parentToken.ner}\n`; // } else if (currentEngine === "spacy" && elementData.lemma_) { // // SpacyToken // info += `Lemma: ${elementData.lemma_}\nPOS: ${elementData.pos_}\nTag: ${elementData.tag_}\nDep: ${elementData.dep_} (Head ID: ${elementData.head?.i})\n`; // if (elementData.ent_type_) // info += `Entity: ${elementData.ent_type_} (${elementData.ent_iob_})\n`; // } // } else if (elementType === "sentence") { // if ( // currentEngine === "stanza" && // (elementData as NLP.Stanza.Sentence).sentiment // ) { // info += `Sentiment: ${(elementData as NLP.Stanza.Sentence).sentiment}\n`; // } // if ( // (elementData as NLP.Stanza.Sentence | NLP.Spacy.Sentence).entities // ?.length // ) { // info += `Entities in sentence: ${(elementData.entities as any[]).map((e) => `${e.text} (${e.type || e.label_})`).join(", ")}\n`; // } // } else if (elementType === "paragraph") { // info += `Char range: ${elementData.start_char}-${elementData.end_char}\n`; // info += `Sentence count: ${elementData.sentences.length}\n`; // } // info += `Raw Data Keys: ${Object.keys(elementData).slice(0, 5).join(", ")}...`; // Show some keys // setSelectedElementInfo(info); // console.log( // "Selected Element:", // elementType, // elementData, // "Text:", // elementText, // ); // }, // [currentEngine], // ); const toggleEngine = () => { setCurrentEngine((prev) => (prev === "spacy" ? "stanza" : "spacy")); setSelectedElementInfo(null); }; return (

NLP Text Analyzer

Currently viewing with:{" "} {currentEngine.toUpperCase()}

{" "} {/* min-w-0 for flex child to prevent overflow */} {activeNlpData ? ( ) : ( )}

© {new Date().getFullYear()} NLP Analysis Tool. Powered by React, TailwindCSS, and your NLP engine of choice!

{modalContent && ( {modalContent} )}
); }