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})
)}