From ae22a48ce2b3759572a0b13243601b3827d38284 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 22:57:49 +0000 Subject: [PATCH] Fix null safety issues --- .../moderation/SubmissionItemsList.tsx | 19 +++++++++++++------ .../moderation/ValidationSummary.tsx | 7 +++++-- .../moderation/displays/RichParkDisplay.tsx | 3 +++ .../moderation/displays/RichRideDisplay.tsx | 3 +++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/components/moderation/SubmissionItemsList.tsx b/src/components/moderation/SubmissionItemsList.tsx index 30cf75f3..053d62a0 100644 --- a/src/components/moderation/SubmissionItemsList.tsx +++ b/src/components/moderation/SubmissionItemsList.tsx @@ -56,12 +56,19 @@ export const SubmissionItemsList = memo(function SubmissionItemsList({ if (itemsError) throw itemsError; - // Transform to expected format - const transformedItems = (itemsData || []).map((item: any) => ({ - ...item, - item_data: item.entity_data || {}, - entity_data: item.entity_data - })); + // Transform to expected format with better null handling + const transformedItems = (itemsData || []).map((item: any) => { + // Ensure entity_data is at least an empty object, never null + const safeEntityData = item.entity_data && typeof item.entity_data === 'object' + ? item.entity_data + : {}; + + return { + ...item, + item_data: safeEntityData, + entity_data: item.entity_data // Keep original for debugging + }; + }); // Check for photo submissions (using array query to avoid 406) const { data: photoData, error: photoError } = await supabase diff --git a/src/components/moderation/ValidationSummary.tsx b/src/components/moderation/ValidationSummary.tsx index b9bf6d98..c7d42664 100644 --- a/src/components/moderation/ValidationSummary.tsx +++ b/src/components/moderation/ValidationSummary.tsx @@ -30,9 +30,12 @@ export function ValidationSummary({ item, onValidationChange, compact = false, v // Helper to extract the correct entity ID based on entity type const getEntityId = ( itemType: string, - itemData: SubmissionItemData, + itemData: SubmissionItemData | null | undefined, fallbackId?: string ): string | undefined => { + // Guard against null/undefined itemData + if (!itemData) return fallbackId; + // Try entity-specific ID fields first const entityIdField = `${itemType}_id`; const typedData = itemData as unknown as Record; @@ -84,7 +87,7 @@ export function ValidationSummary({ item, onValidationChange, compact = false, v const result = await validateEntityData( item.item_type as ValidEntityType, { - ...item.item_data, + ...(item.item_data || {}), // Add null coalescing id: getEntityId(item.item_type, item.item_data, item.id) } ); diff --git a/src/components/moderation/displays/RichParkDisplay.tsx b/src/components/moderation/displays/RichParkDisplay.tsx index cc1cb80c..4b7ff988 100644 --- a/src/components/moderation/displays/RichParkDisplay.tsx +++ b/src/components/moderation/displays/RichParkDisplay.tsx @@ -17,6 +17,9 @@ export function RichParkDisplay({ data, actionType, showAllFields = true }: Rich const [propertyOwner, setPropertyOwner] = useState(null); useEffect(() => { + // Guard against null/undefined data + if (!data) return; + const fetchRelatedData = async () => { // Fetch location if (data.location_id) { diff --git a/src/components/moderation/displays/RichRideDisplay.tsx b/src/components/moderation/displays/RichRideDisplay.tsx index 4e0b3f90..434d194f 100644 --- a/src/components/moderation/displays/RichRideDisplay.tsx +++ b/src/components/moderation/displays/RichRideDisplay.tsx @@ -22,6 +22,9 @@ export function RichRideDisplay({ data, actionType, showAllFields = true }: Rich const [showTechnical, setShowTechnical] = useState(false); useEffect(() => { + // Guard against null/undefined data + if (!data) return; + const fetchRelatedData = async () => { if (data.park_id) { const { data: parkData } = await supabase