import { useState } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '@/components/ui/sheet'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { toast } from '@/hooks/use-toast'; import { useIsMobile } from '@/hooks/use-mobile'; import { logger } from '@/lib/logger'; import { useUserRole } from '@/hooks/useUserRole'; import { getErrorMessage } from '@/lib/errorHandler'; import { useAuth } from '@/hooks/useAuth'; import { editSubmissionItem, type SubmissionItemWithDeps } from '@/lib/submissionItemsService'; import { ParkForm } from '@/components/admin/ParkForm'; import { RideForm } from '@/components/admin/RideForm'; import { ManufacturerForm } from '@/components/admin/ManufacturerForm'; import { DesignerForm } from '@/components/admin/DesignerForm'; import { OperatorForm } from '@/components/admin/OperatorForm'; import { jsonToFormData } from '@/lib/typeConversions'; import { PropertyOwnerForm } from '@/components/admin/PropertyOwnerForm'; import { RideModelForm } from '@/components/admin/RideModelForm'; import { Save, X, Edit } from 'lucide-react'; import { SubmissionErrorBoundary } from '@/components/error/SubmissionErrorBoundary'; interface ItemEditDialogProps { item?: SubmissionItemWithDeps | null; items?: SubmissionItemWithDeps[]; open: boolean; onOpenChange: (open: boolean) => void; onComplete: () => void; } export function ItemEditDialog({ item, items, open, onOpenChange, onComplete }: ItemEditDialogProps) { const [submitting, setSubmitting] = useState(false); const [activeTab, setActiveTab] = useState(items?.[0]?.id || ''); const isMobile = useIsMobile(); const { isModerator } = useUserRole(); const { user } = useAuth(); const Container = isMobile ? Sheet : Dialog; // Phase 5: Bulk edit mode const bulkEditMode = items && items.length > 1; const currentItem = bulkEditMode ? items.find(i => i.id === activeTab) : item; if (!currentItem && !bulkEditMode) return null; const handleSubmit = async (data: Record, itemId?: string) => { if (!user?.id) { toast({ title: 'Authentication Required', description: 'You must be logged in to edit items', variant: 'destructive', }); return; } const targetItemId = itemId || currentItem?.id; if (!targetItemId) return; setSubmitting(true); try { await editSubmissionItem(targetItemId, data, user.id); toast({ title: isModerator() ? 'Item Updated' : 'Edit Submitted', description: isModerator() ? 'The item has been updated successfully.' : 'Your edit has been submitted and will be reviewed by a moderator.', }); if (bulkEditMode && items) { // Move to next tab or complete const currentIndex = items.findIndex(i => i.id === activeTab); if (currentIndex < items.length - 1) { setActiveTab(items[currentIndex + 1].id); } else { onComplete(); onOpenChange(false); } } else { onComplete(); onOpenChange(false); } } catch (error: unknown) { const errorMsg = getErrorMessage(error); toast({ title: 'Error', description: errorMsg, variant: 'destructive', }); } finally { setSubmitting(false); } }; const handlePhotoSubmit = async (caption: string, credit: string) => { if (!item?.item_data) { toast({ title: 'Error', description: 'No photo data available', variant: 'destructive', }); return; } const itemData = typeof item.item_data === 'object' && item.item_data !== null && !Array.isArray(item.item_data) ? item.item_data as Record : {}; const photos = 'photos' in itemData && Array.isArray(itemData.photos) ? itemData.photos : []; const photoData = { ...itemData, photos: photos.map((photo: unknown) => ({ ...(typeof photo === 'object' && photo !== null ? photo as Record : {}), caption, credit, })), }; await handleSubmit(photoData); }; const renderEditForm = (editItem: SubmissionItemWithDeps) => { const itemData = typeof editItem.item_data === 'object' && editItem.item_data !== null && !Array.isArray(editItem.item_data) ? editItem.item_data as Record : {}; switch (editItem.item_type) { case 'park': return ( onOpenChange(false)} initialData={jsonToFormData(editItem.item_data) as any} isEditing /> ); case 'ride': return ( onOpenChange(false)} initialData={jsonToFormData(editItem.item_data) as any} isEditing /> ); case 'manufacturer': return ( onOpenChange(false)} initialData={jsonToFormData(editItem.item_data) as any} /> ); case 'designer': return ( onOpenChange(false)} initialData={jsonToFormData(editItem.item_data) as any} /> ); case 'operator': return ( onOpenChange(false)} initialData={jsonToFormData(editItem.item_data) as any} /> ); case 'property_owner': return ( onOpenChange(false)} initialData={jsonToFormData(editItem.item_data) as any} /> ); case 'ride_model': const manufacturerName = 'manufacturer_name' in itemData && typeof itemData.manufacturer_name === 'string' ? itemData.manufacturer_name : 'Unknown'; const manufacturerId = 'manufacturer_id' in itemData && typeof itemData.manufacturer_id === 'string' ? itemData.manufacturer_id : ''; return ( onOpenChange(false)} initialData={itemData as any} /> ); case 'photo': const photos = 'photos' in itemData && Array.isArray(itemData.photos) // eslint-disable-next-line @typescript-eslint/no-explicit-any ? itemData.photos as any : []; return ( onOpenChange(false)} submitting={submitting} /> ); default: return (
No edit form available for this item type
); } }; return ( {isMobile ? ( {bulkEditMode ? `Edit ${items.length} Items` : `Edit ${currentItem?.item_type.replace('_', ' ')}`} {bulkEditMode ? 'Edit multiple submission items using tabs' : 'Make changes to this submission item'}
{bulkEditMode && items ? ( {items.map((tabItem, index) => ( {index + 1}. {tabItem.item_type.replace('_', ' ')} ))} {items.map(tabItem => ( {renderEditForm(tabItem)} ))} ) : currentItem ? ( renderEditForm(currentItem) ) : null}
) : ( {bulkEditMode ? `Edit ${items.length} Items` : `Edit ${currentItem?.item_type.replace('_', ' ')}`} {bulkEditMode ? 'Edit multiple submission items using tabs' : 'Make changes to this submission item'}
{bulkEditMode && items ? ( {items.map((tabItem, index) => ( {index + 1}. {tabItem.item_type.replace('_', ' ')} ))} {items.map(tabItem => ( {renderEditForm(tabItem)} ))} ) : currentItem ? ( renderEditForm(currentItem) ) : null}
)}
); } // Simple photo editing form for caption and credit interface PhotoItem { url: string; caption?: string | null; credit?: string | null; } function PhotoEditForm({ photos, onSubmit, onCancel, submitting }: { photos: PhotoItem[]; onSubmit: (caption: string, credit: string) => void; onCancel: () => void; submitting: boolean; }) { const [caption, setCaption] = useState(photos[0]?.caption || ''); const [credit, setCredit] = useState(photos[0]?.credit || ''); return (
{/* Photo Preview */}
{photos.slice(0, 3).map((photo, idx) => ( {photo.caption ))}
{/* Caption */}