import { useState, useEffect } from 'react' import { useParams } from 'react-router-dom' import { CheckCircle, XCircle, AlertCircle, FileText, Image as ImageIcon, Film, Sparkles, Globe } from 'lucide-react' const STATUS_ICONS = { copy: FileText, design: ImageIcon, video: Film, other: Sparkles, } export default function PublicReview() { const { token } = useParams() const [artefact, setArtefact] = 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 [selectedLanguage, setSelectedLanguage] = useState(0) useEffect(() => { loadArtefact() }, [token]) const loadArtefact = async () => { try { const res = await fetch(`/api/public/review/${token}`) if (!res.ok) { const err = await res.json() setError(err.error || 'Failed to load artefact') setLoading(false) return } const data = await res.json() setArtefact(data) } catch (err) { setError('Failed to load artefact') } finally { setLoading(false) } } const handleAction = async (action) => { if (!reviewerName.trim()) { alert('Please enter your name') return } if (action === 'approve' && !confirm('Approve this artefact?')) return if (action === 'reject' && !confirm('Reject this artefact?')) return if (action === 'revision' && !feedback.trim()) { alert('Please provide feedback for revision request') return } setSubmitting(true) try { const res = await fetch(`/api/public/review/${token}/${action}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ approved_by_name: reviewerName, feedback: feedback || undefined, }), }) if (!res.ok) { const err = await res.json() setError(err.error || 'Action failed') setSubmitting(false) return } const data = await res.json() setSuccess(data.message || 'Action completed successfully') setTimeout(() => { loadArtefact() }, 1500) } catch (err) { setError('Action failed') } finally { setSubmitting(false) } } const extractDriveFileId = (url) => { const patterns = [ /\/file\/d\/([^\/]+)/, /id=([^&]+)/, /\/d\/([^\/]+)/, ] for (const pattern of patterns) { const match = url.match(pattern) if (match) return match[1] } return null } const getDriveEmbedUrl = (url) => { const fileId = extractDriveFileId(url) return fileId ? `https://drive.google.com/file/d/${fileId}/preview` : url } if (loading) { return (
{error}
{success}
Samaya Digital Hub
{artefact.description}
)}
{artefact.content}
{att.original_name}
{att.original_name}
{att.original_name}
{att.size && ({(att.size / 1024).toFixed(1)} KB
)}{comment.content}
This artefact has already been reviewed.
Status: {artefact.status.replace('_', ' ')}
{artefact.approved_by_name && (Reviewed by: {artefact.approved_by_name}
)}Powered by Samaya Digital Hub