import React, { useState, useEffect } from 'react'; import { MagnifyingGlassIcon, GlobeAltIcon, AcademicCapIcon, FunnelIcon, PencilIcon, CheckCircleIcon, XCircleIcon, ClockIcon } from '@heroicons/react/24/outline'; import { api } from '../services/api'; interface SearchFilters { sourceLanguage: string; } interface UserSubmission { _id: string; transcreation: string; explanation: string; status: 'pending' | 'approved' | 'rejected' | 'submitted'; createdAt: string; score?: number; voteCounts?: { 1: number; 2: number; 3: number; }; } const SearchTexts: React.FC = () => { const [filters, setFilters] = useState({ sourceLanguage: '' }); const [isSearching, setIsSearching] = useState(false); const [searchResults, setSearchResults] = useState([]); const [error, setError] = useState(''); const [translations, setTranslations] = useState<{[key: string]: string}>({}); const [userSubmissions, setUserSubmissions] = useState<{[key: string]: UserSubmission[]}>({}); const [loadingSubmissions, setLoadingSubmissions] = useState(false); // Fetch user's submissions when examples are loaded useEffect(() => { if (searchResults.length > 0) { fetchUserSubmissions(); } }, [searchResults]); const fetchUserSubmissions = async () => { setLoadingSubmissions(true); try { const token = localStorage.getItem('token'); if (!token) return; const response = await fetch('/api/submissions/my-submissions', { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); if (response.ok) { const data = await response.json(); const submissionsByExample: {[key: string]: UserSubmission[]} = {}; data.submissions.forEach((submission: UserSubmission & { sourceTextId: any }) => { const exampleId = submission.sourceTextId?._id || submission.sourceTextId; if (exampleId) { if (!submissionsByExample[exampleId]) { submissionsByExample[exampleId] = []; } submissionsByExample[exampleId].push(submission); } }); setUserSubmissions(submissionsByExample); } } catch (error) { console.error('Error fetching submissions:', error); } finally { setLoadingSubmissions(false); } }; const handleSearch = async () => { setIsSearching(true); setError(''); try { const response = await api.post('/search/auto-search', filters); setSearchResults(response.data.results || []); } catch (error: any) { console.error('Search error:', error); if (error.response?.data?.error) { setError(error.response.data.error); } else { setError('Search failed. Please try again.'); } } finally { setIsSearching(false); } }; const handleFilterChange = (field: keyof SearchFilters, value: string) => { setFilters(prev => ({ ...prev, [field]: value })); // Clear error when user changes filters if (error) setError(''); }; const handleTranslationChange = (id: string, value: string) => { setTranslations(prev => ({ ...prev, [id]: value })); }; const handleTranscreate = async (id: string) => { const translation = translations[id]; if (!translation || !translation.trim()) { alert('Please enter a translation before submitting.'); return; } try { const token = localStorage.getItem('token'); if (!token) { alert('Please log in to submit translations.'); return; } const result = searchResults.find(r => r.id === id); if (!result) { alert('Example not found.'); return; } // Submit translation to backend const response = await fetch('/api/submissions', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ sourceTextId: id, targetCulture: result.sourceCulture, targetLanguage: result.sourceLanguage === 'English' ? 'Chinese' : 'English', transcreation: translation.trim(), explanation: 'Practice translation submission', isAnonymous: true }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); // Clear the translation input setTranslations(prev => ({ ...prev, [id]: '' })); // Refresh user's submissions to show the new one await fetchUserSubmissions(); alert('Translation submitted successfully! It will be available for voting.'); } catch (error) { console.error('Error submitting translation:', error); alert('Failed to submit translation. Please try again.'); } }; return (

Practice

In-class practice examples for puns and wordplay in English and Chinese

{/* Search Filters */}

Language Filter

{/* Error Message */} {error && (

Search Error

{error}
)} {/* Search Results */} {searchResults.length > 0 && (

Practice Examples ({searchResults.length})

{searchResults.map((result) => (
{result.content}
{/* Translation Input - Only show if user hasn't submitted yet */} {loadingSubmissions ? (
Loading your submissions...
) : (!userSubmissions[result.id] || userSubmissions[result.id].length === 0) ? (