import { useState, useEffect } from 'react' import { useParams } from 'react-router-dom' import { CheckCircle, XCircle, AlertCircle, Languages, Globe, User } from 'lucide-react' import { useLanguage } from '../i18n/LanguageContext' import { useToast } from '../components/ToastContainer' import Modal from '../components/Modal' export default function PublicTranslationReview() { const { token } = useParams() const { t } = useLanguage() const toast = useToast() const [translation, setTranslation] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [submitting, setSubmitting] = useState(false) const [success, setSuccess] = useState('') const [reviewerName, setReviewerName] = useState('') const [feedback, setFeedback] = useState('') const [pendingAction, setPendingAction] = useState(null) useEffect(() => { loadTranslation() }, [token]) const loadTranslation = async () => { try { const res = await fetch(`/api/public/review-translation/${token}`) if (!res.ok) { const err = await res.json() setError(err.error || t('review.loadFailed')) setLoading(false) return } const data = await res.json() setTranslation(data) if (data.approvers?.length === 1 && data.approvers[0].name) { setReviewerName(data.approvers[0].name) } } catch (err) { setError(t('review.loadFailed')) } finally { setLoading(false) } } const handleAction = async (action) => { if (action === 'approve' && !reviewerName.trim()) { toast.error(t('review.nameRequired')) return } if (action === 'reject' && !feedback.trim()) { toast.error(t('review.feedbackRequired')) return } setSubmitting(true) try { const res = await fetch(`/api/public/review-translation/${token}/${action}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ approved_by_name: reviewerName || 'Anonymous', feedback: feedback || '', }), }) if (!res.ok) { const err = await res.json() throw new Error(err.error || 'Action failed') } if (action === 'approve') setSuccess(t('review.approveSuccess')) else if (action === 'reject') setSuccess(t('review.rejectSuccess')) else setSuccess(t('review.revisionSuccess')) setPendingAction(null) } catch (err) { toast.error(err.message) } finally { setSubmitting(false) } } if (loading) { return (
{error}
{t('review.thankYou')}
{translation.description}
)}{translation.source_content}
{text.content}
{t('review.statusLabel')}: {translation.status.replace('_', ' ')}
{translation.approved_by_name && ({t('review.reviewedBy')}: {translation.approved_by_name}
)}{t('review.rejectConfirmDesc')}
{!feedback.trim() && ({t('review.feedbackRequiredForReject')}
)}