import { useState, useEffect, memo } from 'react'; import { supabase } from '@/integrations/supabase/client'; import { SubmissionChangesDisplay } from './SubmissionChangesDisplay'; import { PhotoSubmissionDisplay } from './PhotoSubmissionDisplay'; import { Skeleton } from '@/components/ui/skeleton'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { AlertCircle, Loader2 } from 'lucide-react'; import type { SubmissionItemData } from '@/types/submissions'; interface SubmissionItemsListProps { submissionId: string; view?: 'summary' | 'detailed'; showImages?: boolean; } export const SubmissionItemsList = memo(function SubmissionItemsList({ submissionId, view = 'summary', showImages = true }: SubmissionItemsListProps) { const [items, setItems] = useState([]); const [hasPhotos, setHasPhotos] = useState(false); const [loading, setLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const [error, setError] = useState(null); useEffect(() => { fetchSubmissionItems(); }, [submissionId]); const fetchSubmissionItems = async () => { try { // Only show skeleton on initial load, show refreshing indicator on refresh if (loading) { setLoading(true); } else { setRefreshing(true); } setError(null); // Fetch submission items const { data: itemsData, error: itemsError } = await supabase .from('submission_items') .select('*') .eq('submission_id', submissionId) .order('order_index'); if (itemsError) throw itemsError; // Check for photo submissions (using array query to avoid 406) const { data: photoData, error: photoError } = await supabase .from('photo_submissions') .select('id') .eq('submission_id', submissionId); if (photoError) { console.warn('Error checking photo submissions:', photoError); } setItems((itemsData || []) as SubmissionItemData[]); setHasPhotos(photoData && photoData.length > 0); } catch (err) { console.error('Error fetching submission items:', err); setError('Failed to load submission details'); } finally { setLoading(false); setRefreshing(false); } }; if (loading) { return (
{view === 'detailed' && }
); } if (error) { return ( {error} ); } if (items.length === 0 && !hasPhotos) { return (
No items found for this submission
); } return (
{refreshing && (
Refreshing...
)} {/* Show regular submission items */} {items.map((item) => (
))} {/* Show photo submission if exists */} {hasPhotos && (
)}
); });