diff --git a/src/components/moderation/ActivityCard.tsx b/src/components/moderation/ActivityCard.tsx index 98d46460..861b023d 100644 --- a/src/components/moderation/ActivityCard.tsx +++ b/src/components/moderation/ActivityCard.tsx @@ -97,7 +97,7 @@ export function ActivityCard({ activity }: ActivityCardProps) {
- + {moderatorInitial} diff --git a/src/components/moderation/EntityEditPreview.tsx b/src/components/moderation/EntityEditPreview.tsx index bad0682a..04d11842 100644 --- a/src/components/moderation/EntityEditPreview.tsx +++ b/src/components/moderation/EntityEditPreview.tsx @@ -200,7 +200,7 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
- {itemData?.cloudflare_image_url && typeof itemData.cloudflare_image_url === 'string' && ( + {(itemData?.cloudflare_image_url && typeof itemData.cloudflare_image_url === 'string' && ( - )} + )) as React.ReactNode} {isEdit && (
@@ -229,12 +229,12 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
)} - {!isEdit && itemData?.reason && typeof itemData.reason === 'string' && ( + {(!isEdit && itemData?.reason && typeof itemData.reason === 'string' && (
Reason: {itemData.reason}
- )} + )) as React.ReactNode}
Click "Review Items" for full details @@ -244,7 +244,7 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti } // Build photos array for modal - const photos = []; + const photos: Array<{ id: string; url: string; caption: string | null }> = []; if (bannerImageUrl) { photos.push({ id: 'banner', @@ -336,7 +336,10 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
({ + ...photo, + caption: photo.caption ?? undefined + }))} initialIndex={selectedImageIndex} isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} diff --git a/src/components/moderation/FieldComparison.tsx b/src/components/moderation/FieldComparison.tsx index f5ca8675..44bdf68b 100644 --- a/src/components/moderation/FieldComparison.tsx +++ b/src/components/moderation/FieldComparison.tsx @@ -221,11 +221,11 @@ export function LocationDiff({ oldLocation, newLocation, compact = false }: Loca } if (typeof loc === 'object') { - const parts = []; - if (loc.city) parts.push(loc.city); - if (loc.state_province) parts.push(loc.state_province); - if (loc.country && loc.country !== loc.state_province) parts.push(loc.country); - if (loc.postal_code) parts.push(loc.postal_code); + const parts: string[] = []; + if (loc.city) parts.push(String(loc.city)); + if (loc.state_province) parts.push(String(loc.state_province)); + if (loc.country && loc.country !== loc.state_province) parts.push(String(loc.country)); + if (loc.postal_code) parts.push(String(loc.postal_code)); let locationStr = parts.join(', ') || 'Unknown'; diff --git a/src/components/moderation/ItemEditDialog.tsx b/src/components/moderation/ItemEditDialog.tsx index acfbb30c..19c9d10f 100644 --- a/src/components/moderation/ItemEditDialog.tsx +++ b/src/components/moderation/ItemEditDialog.tsx @@ -8,6 +8,7 @@ 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'; @@ -93,6 +94,11 @@ export function ItemEditDialog({ item, items, open, onOpenChange, onComplete }: }; const handlePhotoSubmit = async (caption: string, credit: string) => { + if (!item?.item_data) { + logger.error('No item data available for photo submission'); + return; + } + const itemData = typeof item.item_data === 'object' && item.item_data !== null && !Array.isArray(item.item_data) ? item.item_data as Record : {}; diff --git a/src/components/moderation/ItemReviewCard.tsx b/src/components/moderation/ItemReviewCard.tsx index 9e5de45a..2dcd0a3b 100644 --- a/src/components/moderation/ItemReviewCard.tsx +++ b/src/components/moderation/ItemReviewCard.tsx @@ -86,12 +86,12 @@ export function ItemReviewCard({ item, onEdit, onStatusChange, submissionId }: I {item.item_type.replace('_', ' ').toUpperCase()} - {item.original_data && Object.keys(item.original_data).length > 0 && ( + {(item.original_data && Object.keys(item.original_data).length > 0 && ( Moderator Edited - )} + )) as React.ReactNode} {hasBlockingErrors && ( Blocked diff --git a/src/components/moderation/ModerationQueue.tsx b/src/components/moderation/ModerationQueue.tsx index f39bdedf..12be5670 100644 --- a/src/components/moderation/ModerationQueue.tsx +++ b/src/components/moderation/ModerationQueue.tsx @@ -315,7 +315,7 @@ export const ModerationQueue = forwardRef @@ -475,7 +475,10 @@ export const ModerationQueue = forwardRef ({ + ...photo, + caption: photo.caption ?? undefined + }))} initialIndex={selectedPhotoIndex} isOpen={photoModalOpen} onClose={() => setPhotoModalOpen(false)} diff --git a/src/components/moderation/QueueItem.tsx b/src/components/moderation/QueueItem.tsx index c3560f1d..49ea041f 100644 --- a/src/components/moderation/QueueItem.tsx +++ b/src/components/moderation/QueueItem.tsx @@ -134,7 +134,7 @@ export const QueueItem = memo(({ -
Attached Photos:
- +
+
Attached Photos:
+ onOpenPhotos(photos as any, index)} + maxDisplay={isMobile ? 3 : 4} + className="grid-cols-2 md:grid-cols-3" + /> {item.content.photos[0]?.caption && (

{item.content.photos[0].caption} @@ -231,7 +231,7 @@ export const QueueItem = memo(({

Type:{' '} - {getSubmissionTypeLabel(item.submission_type)} + {getSubmissionTypeLabel(item.submission_type || 'unknown')}
{item.submission_items && item.submission_items.length > 0 && (
diff --git a/src/components/moderation/RecentActivity.tsx b/src/components/moderation/RecentActivity.tsx index c2298ef9..02be5117 100644 --- a/src/components/moderation/RecentActivity.tsx +++ b/src/components/moderation/RecentActivity.tsx @@ -83,11 +83,11 @@ export const RecentActivity = forwardRef((props, ref) => { if (reviewsError) throw reviewsError; // Get unique moderator IDs - const moderatorIds = [ - ...(submissions?.map(s => s.reviewer_id).filter(Boolean) || []), - ...(reports?.map(r => r.reviewed_by).filter(Boolean) || []), - ...(reviews?.map(r => r.moderated_by).filter(Boolean) || []), - ].filter((id, index, arr) => id && arr.indexOf(id) === index); + const moderatorIds: string[] = [ + ...(submissions?.map(s => s.reviewer_id).filter((id): id is string => id != null) || []), + ...(reports?.map(r => r.reviewed_by).filter((id): id is string => id != null) || []), + ...(reviews?.map(r => r.moderated_by).filter((id): id is string => id != null) || []), + ].filter((id, index, arr) => arr.indexOf(id) === index); // Fetch moderator profiles const { data: profiles } = await supabase diff --git a/src/components/moderation/SubmissionItemsList.tsx b/src/components/moderation/SubmissionItemsList.tsx index 8ccb5d3e..e3d6d53b 100644 --- a/src/components/moderation/SubmissionItemsList.tsx +++ b/src/components/moderation/SubmissionItemsList.tsx @@ -61,7 +61,7 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({ } setItems((itemsData || []) as SubmissionItemData[]); - setHasPhotos(photoData && photoData.length > 0); + setHasPhotos(!!(photoData && photoData.length > 0)); } catch (err) { logger.error('Failed to fetch submission items', { error: getErrorMessage(err) }); setError('Failed to load submission details'); diff --git a/src/components/moderation/SubmissionReviewManager.tsx b/src/components/moderation/SubmissionReviewManager.tsx index f2439e45..eafab536 100644 --- a/src/components/moderation/SubmissionReviewManager.tsx +++ b/src/components/moderation/SubmissionReviewManager.tsx @@ -634,7 +634,10 @@ export function SubmissionReviewManager({ { if (strategy === 'keep-mine') { // Log conflict resolution diff --git a/src/components/moderation/renderers/EntitySubmissionDisplay.tsx b/src/components/moderation/renderers/EntitySubmissionDisplay.tsx index 098f64dc..d6d2bce4 100644 --- a/src/components/moderation/renderers/EntitySubmissionDisplay.tsx +++ b/src/components/moderation/renderers/EntitySubmissionDisplay.tsx @@ -30,7 +30,7 @@ export const EntitySubmissionDisplay = memo(({ item, isMobile }: EntitySubmissio
Type:{' '} - {getSubmissionTypeLabel(item.submission_type)} + {getSubmissionTypeLabel(item.submission_type || 'unknown')}
{item.submission_items && item.submission_items.length > 0 && (
diff --git a/src/components/moderation/renderers/PhotoSubmissionDisplay.tsx b/src/components/moderation/renderers/PhotoSubmissionDisplay.tsx index fa1a8612..b557cc91 100644 --- a/src/components/moderation/renderers/PhotoSubmissionDisplay.tsx +++ b/src/components/moderation/renderers/PhotoSubmissionDisplay.tsx @@ -54,7 +54,7 @@ export const PhotoSubmissionDisplay = memo(({ title: photo.title, date_taken: photo.date_taken, }))} - onPhotoClick={onOpenPhotos} + onPhotoClick={(photos, index) => onOpenPhotos(photos as any, index)} />
) : ( diff --git a/src/components/moderation/renderers/ReviewDisplay.tsx b/src/components/moderation/renderers/ReviewDisplay.tsx index 337ad48d..9544599c 100644 --- a/src/components/moderation/renderers/ReviewDisplay.tsx +++ b/src/components/moderation/renderers/ReviewDisplay.tsx @@ -52,7 +52,7 @@ export const ReviewDisplay = memo(({ item, isMobile, onOpenPhotos }: ReviewDispl
Attached Photos:
onOpenPhotos(photos as any, index)} maxDisplay={isMobile ? 3 : 4} className="grid-cols-2 md:grid-cols-3" /> diff --git a/src/components/notifications/NotificationCenter.tsx b/src/components/notifications/NotificationCenter.tsx index 68e57724..56be0bc4 100644 --- a/src/components/notifications/NotificationCenter.tsx +++ b/src/components/notifications/NotificationCenter.tsx @@ -36,7 +36,7 @@ export function NotificationCenter() { > diff --git a/src/components/operators/OperatorCard.tsx b/src/components/operators/OperatorCard.tsx index 351edfa5..681ae83b 100644 --- a/src/components/operators/OperatorCard.tsx +++ b/src/components/operators/OperatorCard.tsx @@ -30,7 +30,7 @@ const OperatorCard = ({ company }: OperatorCardProps) => {
{(company.card_image_url || company.card_image_id) ? ( { )}
- {company.average_rating > 0 && ( + {company.average_rating != null && company.average_rating > 0 && (
{company.average_rating.toFixed(1)} - {company.review_count > 0 && ( + {company.review_count != null && company.review_count > 0 && ( ({company.review_count}) )}
diff --git a/src/components/park-owners/ParkOwnerCard.tsx b/src/components/park-owners/ParkOwnerCard.tsx index eadd2bca..7cc5abb9 100644 --- a/src/components/park-owners/ParkOwnerCard.tsx +++ b/src/components/park-owners/ParkOwnerCard.tsx @@ -30,7 +30,7 @@ const ParkOwnerCard = ({ company }: ParkOwnerCardProps) => {
{(company.card_image_url || company.card_image_id) ? ( { )}
- {company.average_rating > 0 && ( + {company.average_rating != null && company.average_rating > 0 && (
{company.average_rating.toFixed(1)} - {company.review_count > 0 && ( + {company.review_count != null && company.review_count > 0 && ( ({company.review_count}) )}