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 (
) } if (error) { return (

Review Not Available

{error}

) } if (success) { return (

Thank You!

{success}

) } if (!artefact) return null const TypeIcon = STATUS_ICONS[artefact.type] || Sparkles const isImage = (url) => /\.(jpg|jpeg|png|gif|webp)$/i.test(url) return (
{/* Header */}

Content Review

Samaya Digital Hub

{/* Artefact Info */}

{artefact.title}

{artefact.description && (

{artefact.description}

)}
{artefact.type} {artefact.brand_name && • {artefact.brand_name}} {artefact.version_number && • Version {artefact.version_number}}
{/* COPY TYPE: Multilingual Content */} {artefact.type === 'copy' && artefact.texts && artefact.texts.length > 0 && (

Content Languages

{/* Language tabs */}
{artefact.texts.map((text, idx) => ( ))}
{/* Selected language content */}
{artefact.texts[selectedLanguage].language_label} Content
{artefact.texts[selectedLanguage].content}
)} {/* Legacy content field (for backward compatibility) */} {artefact.content && (!artefact.texts || artefact.texts.length === 0) && (

Content

                    {artefact.content}
                  
)} {/* DESIGN TYPE: Image Gallery */} {artefact.type === 'design' && artefact.attachments && artefact.attachments.length > 0 && (

Design Files

{artefact.attachments.map((att, idx) => ( {att.original_name {att.original_name && (

{att.original_name}

)}
))}
)} {/* VIDEO TYPE: Video Player or Drive Embed */} {artefact.type === 'video' && artefact.attachments && artefact.attachments.length > 0 && (

Videos

{artefact.attachments.map((att, idx) => (
{att.drive_url ? (
Google Drive Video