diff --git a/frontend/src/components/EventAdmin.tsx b/frontend/src/components/EventAdmin.tsx index 0b97b42..7d93ca4 100644 --- a/frontend/src/components/EventAdmin.tsx +++ b/frontend/src/components/EventAdmin.tsx @@ -205,21 +205,32 @@ const EventAdmin: React.FC = () => { await axios.put(`/api/events/${slug}/rsvps/${rsvpToEdit.id}`, submissionData); // Update the local state - const updatedRsvps = rsvps.map((r: RSVP) => - r.id === rsvpToEdit.id - ? { - ...r, - ...editForm, - items_bringing: editForm.items_bringing // Keep as array in local state - } - : r - ); + const updatedRsvps = rsvps.map((r: RSVP) => { + if (r.id === rsvpToEdit.id) { + return { + ...r, + ...editForm, + items_bringing: editForm.items_bringing // Keep as array in local state + }; + } + return r; + }); // Recalculate claimed items const claimed = new Set(); updatedRsvps.forEach((rsvp: RSVP) => { - if (Array.isArray(rsvp.items_bringing)) { - rsvp.items_bringing.forEach(item => claimed.add(item)); + let rsvpItems: string[] = []; + try { + if (typeof rsvp.items_bringing === 'string') { + const parsed = JSON.parse(rsvp.items_bringing); + rsvpItems = Array.isArray(parsed) ? parsed : []; + } else if (Array.isArray(rsvp.items_bringing)) { + rsvpItems = rsvp.items_bringing; + } + + rsvpItems.forEach(item => claimed.add(item)); + } catch (e) { + console.error('Error processing items for RSVP:', e); } }); @@ -227,11 +238,12 @@ const EventAdmin: React.FC = () => { let allItems: string[] = []; if (event?.needed_items) { try { - allItems = typeof event.needed_items === 'string' - ? JSON.parse(event.needed_items) - : Array.isArray(event.needed_items) - ? event.needed_items - : []; + if (typeof event.needed_items === 'string') { + const parsed = JSON.parse(event.needed_items); + allItems = Array.isArray(parsed) ? parsed : []; + } else if (Array.isArray(event.needed_items)) { + allItems = event.needed_items; + } } catch (e) { console.error('Error parsing event needed_items:', e); allItems = []; @@ -359,11 +371,18 @@ const EventAdmin: React.FC = () => { {(() => { - const items: string[] = Array.isArray(rsvp.items_bringing) - ? rsvp.items_bringing - : typeof rsvp.items_bringing === 'string' - ? JSON.parse(rsvp.items_bringing) - : []; + let items: string[] = []; + try { + if (typeof rsvp.items_bringing === 'string') { + const parsed = JSON.parse(rsvp.items_bringing); + items = Array.isArray(parsed) ? parsed : []; + } else if (Array.isArray(rsvp.items_bringing)) { + items = rsvp.items_bringing; + } + } catch (e) { + console.error('Error parsing items_bringing:', e); + } + return ( {items.map((item: string, index: number) => ( diff --git a/frontend/src/components/RSVPForm.tsx b/frontend/src/components/RSVPForm.tsx index 22e1474..efc7a94 100644 --- a/frontend/src/components/RSVPForm.tsx +++ b/frontend/src/components/RSVPForm.tsx @@ -72,14 +72,24 @@ const RSVPForm: React.FC = () => { const claimed = new Set(); rsvpsResponse.data.forEach((rsvp: any) => { try { - const rsvpItems = typeof rsvp.items_bringing === 'string' - ? JSON.parse(rsvp.items_bringing) - : Array.isArray(rsvp.items_bringing) - ? rsvp.items_bringing - : []; - rsvpItems.forEach((item: string) => claimed.add(item)); + let rsvpItems: string[] = []; + if (typeof rsvp.items_bringing === 'string') { + try { + const parsed = JSON.parse(rsvp.items_bringing); + rsvpItems = Array.isArray(parsed) ? parsed : []; + } catch (e) { + console.error('Error parsing items_bringing JSON:', e); + rsvpItems = []; + } + } else if (Array.isArray(rsvp.items_bringing)) { + rsvpItems = rsvp.items_bringing; + } + + if (Array.isArray(rsvpItems)) { + rsvpItems.forEach((item: string) => claimed.add(item)); + } } catch (e) { - console.error('Error parsing RSVP items:', e); + console.error('Error processing RSVP items:', e); } });