import { useState, useEffect } from 'react'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent } from '@/components/ui/card'; import { supabase } from '@/integrations/supabase/client'; import { Image as ImageIcon } from 'lucide-react'; import { PhotoModal } from './PhotoModal'; interface EntityEditPreviewProps { submissionId: string; entityType: string; entityName?: string; } interface ImageAssignments { uploaded: Array<{ url: string; cloudflare_id: string; }>; banner_assignment: number | null; card_assignment: number | null; } interface SubmissionItemData { id: string; item_data: any; original_data?: any; } export const EntityEditPreview = ({ submissionId, entityType, entityName }: EntityEditPreviewProps) => { const [loading, setLoading] = useState(true); const [itemData, setItemData] = useState(null); const [originalData, setOriginalData] = useState(null); const [changedFields, setChangedFields] = useState([]); const [bannerImageUrl, setBannerImageUrl] = useState(null); const [cardImageUrl, setCardImageUrl] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedImageIndex, setSelectedImageIndex] = useState(0); const [isPhotoOperation, setIsPhotoOperation] = useState(false); useEffect(() => { fetchSubmissionItems(); }, [submissionId]); const fetchSubmissionItems = async () => { try { setLoading(true); const { data: items, error } = await supabase .from('submission_items') .select('*') .eq('submission_id', submissionId) .order('order_index', { ascending: true }); if (error) throw error; if (items && items.length > 0) { const firstItem = items[0]; setItemData(firstItem.item_data); setOriginalData(firstItem.original_data); // Check for photo edit/delete operations if (firstItem.item_type === 'photo_edit' || firstItem.item_type === 'photo_delete') { setIsPhotoOperation(true); if (firstItem.item_type === 'photo_edit') { setChangedFields(['caption']); } return; } // Parse changed fields const changed: string[] = []; const data = firstItem.item_data as any; // Check for image changes if (data.images) { const images: ImageAssignments = data.images; // Extract banner image if (images.banner_assignment !== null && images.banner_assignment !== undefined) { const bannerImg = images.uploaded[images.banner_assignment]; if (bannerImg) { setBannerImageUrl(bannerImg.url); changed.push('banner_image'); } } // Extract card image if (images.card_assignment !== null && images.card_assignment !== undefined) { const cardImg = images.uploaded[images.card_assignment]; if (cardImg) { setCardImageUrl(cardImg.url); changed.push('card_image'); } } } // Check for other field changes by comparing with original_data if (firstItem.original_data) { const originalData = firstItem.original_data as any; const excludeFields = ['images', 'updated_at', 'created_at']; Object.keys(data).forEach(key => { if (!excludeFields.includes(key) && data[key] !== originalData[key]) { changed.push(key); } }); } setChangedFields(changed); } } catch (error) { console.error('Error fetching submission items:', error); } finally { setLoading(false); } }; if (loading) { return (
Loading preview...
); } if (!itemData) { return (
No preview available
); } // Handle photo edit/delete operations if (isPhotoOperation) { const isEdit = changedFields.includes('caption'); return (
Photo {isEdit ? 'Edit' : 'Delete'}
{itemData?.cloudflare_image_url && ( Photo to be modified )} {isEdit && (
Old caption: {originalData?.caption || No caption}
New caption: {itemData?.new_caption || No caption}
)} {!isEdit && itemData?.reason && (
Reason: {itemData.reason}
)}
Click "Review Items" for full details
); } // Build photos array for modal const photos = []; if (bannerImageUrl) { photos.push({ id: 'banner', url: `${bannerImageUrl}`, caption: 'New Banner Image' }); } if (cardImageUrl) { photos.push({ id: 'card', url: `${cardImageUrl}`, caption: 'New Card Image' }); } return (
{entityType} Edit
{entityName && (
{entityName}
)} {changedFields.length > 0 && (
Changed fields: {changedFields.map(field => field.replace(/_/g, ' ')).join(', ')}
)} {(bannerImageUrl || cardImageUrl) && (
Image Changes:
{bannerImageUrl && ( { setSelectedImageIndex(0); setIsModalOpen(true); }}> New banner
Banner
)} {cardImageUrl && ( { setSelectedImageIndex(bannerImageUrl ? 1 : 0); setIsModalOpen(true); }}> New card
Card
)}
)}
Click "Review Items" for full details
setIsModalOpen(false)} />
); };