import { useState, useCallback, useEffect } from 'react' import { ClassificationOutput, TextClassificationWorkerInput, WorkerMessage } from '../../types' import { useModel } from '../../contexts/ModelContext' import { useTextClassification } from '../../contexts/TextClassificationContext' const PLACEHOLDER_TEXTS: string[] = [ 'I absolutely love this product! It exceeded all my expectations.', "This is the worst purchase I've ever made. Complete waste of money.", 'The service was okay, nothing special but not terrible either.', 'Amazing quality and fast delivery. Highly recommended!', "I'm not sure how I feel about this. It's decent but could be better.", 'Terrible customer service. They were rude and unhelpful.', "Great value for money. I'm very satisfied with my purchase.", 'The product arrived damaged and the return process was a nightmare.', 'Pretty good overall. A few minor issues but mostly positive experience.', 'Outstanding! This company really knows how to treat their customers.' ].sort(() => Math.random() - 0.5) function TextClassification() { const [text, setText] = useState(PLACEHOLDER_TEXTS.join('\n')) const [numberExamples, setNumberExamples] = useState(PLACEHOLDER_TEXTS.length) const [results, setResults] = useState([]) const { activeWorker, status, setStatus, modelInfo, hasBeenLoaded, selectedQuantization } = useModel() const { config } = useTextClassification() useEffect(() => { if (modelInfo?.widgetData) { const examples = modelInfo.widgetData.map((e: any) => e.text) if (examples.length > 0) { setText(examples.join('\n')) } } }, [modelInfo]) useEffect(() => { setNumberExamples(text.split('\n').length) }, [text]) const classify = useCallback(() => { if (!modelInfo || !activeWorker) { console.error('Model info or worker is not available') return } setResults([]) // Clear previous results const message: TextClassificationWorkerInput = { type: 'classify', text, model: modelInfo.id, dtype: selectedQuantization ?? 'fp32', config } activeWorker.postMessage(message) }, [text, modelInfo, activeWorker, selectedQuantization, config, setResults]) // Handle worker messages useEffect(() => { if (!activeWorker) return const onMessageReceived = (e: MessageEvent) => { const status = e.data.status if (status === 'output') { setStatus('output') const result = e.data.output! setResults((prev: ClassificationOutput[]) => [...prev, result]) } } activeWorker.addEventListener('message', onMessageReceived) return () => activeWorker.removeEventListener('message', onMessageReceived) }, [activeWorker, setStatus]) const busy: boolean = status !== 'ready' const handleClear = (): void => { setResults([]) } return (

Text Classification

{/* Input Section */}