From cc7298bc5678645ce4e933c5e44b50bd02ee37c4 Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Sun, 16 Nov 2025 21:48:45 +0000 Subject: [PATCH] fix: handle events structure and prevent duplicate keys - Update events state to match backend response structure (registered/organized) - Display registered and organized events in separate sections - Use unique keys for all event mappings (registered-id, organized-id) - Fix duplicate key errors in activity timeline overview section This resolves all duplicate React key warnings --- src/pages/UserProfilePage.tsx | 135 +++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 43 deletions(-) diff --git a/src/pages/UserProfilePage.tsx b/src/pages/UserProfilePage.tsx index fb6d896..92a4a97 100644 --- a/src/pages/UserProfilePage.tsx +++ b/src/pages/UserProfilePage.tsx @@ -26,7 +26,7 @@ export function UserProfilePage() { const [profile, setProfile] = useState(null); const [reports, setReports] = useState([]); - const [events, setEvents] = useState([]); + const [events, setEvents] = useState<{ registered: CleanupEvent[]; organized: CleanupEvent[] }>({ registered: [], organized: [] }); const [activity, setActivity] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -310,8 +310,8 @@ export function UserProfilePage() {

Recent Activity

{activity.length > 0 ? (
- {activity.slice(0, 5).map((item) => ( -
+ {activity.slice(0, 5).map((item, index) => ( +
{item.type === 'report' && (
@@ -373,49 +373,98 @@ export function UserProfilePage() { )} {activeTab === 'events' && ( -
-

Events

- {events.length > 0 ? ( -
- {events.map((event) => ( -
-
-
-

{event.title}

-

{event.description}

-

- 📍 {event.locationName} -

-

- 🗓️ {formatDate(event.scheduledDate)} -

-

- 👥 {event.participantCount} participants -

- {event.litterCollected && ( -

- ♻️ {event.litterCollected} kg collected +

+ {/* Registered Events */} +
+

Registered Events

+ {events.registered.length > 0 ? ( +
+ {events.registered.map((event) => ( +
+
+
+

{event.title}

+

{event.description}

+

+ 📍 {event.locationName}

- )} +

+ 🗓️ {formatDate(event.scheduledDate)} +

+

+ 👥 {event.participantCount} participants +

+ {event.litterCollected && ( +

+ ♻️ {event.litterCollected} kg collected +

+ )} +
+ + {event.status} +
- - {event.status} -
-
- ))} -
- ) : ( -

No events yet

- )} + ))} +
+ ) : ( +

No registered events yet

+ )} +
+ + {/* Organized Events */} +
+

Organized Events

+ {events.organized.length > 0 ? ( +
+ {events.organized.map((event) => ( +
+
+
+

{event.title}

+

{event.description}

+

+ 📍 {event.locationName} +

+

+ 🗓️ {formatDate(event.scheduledDate)} +

+

+ 👥 {event.participantCount} participants +

+ {event.litterCollected && ( +

+ ♻️ {event.litterCollected} kg collected +

+ )} +
+ + {event.status} + +
+
+ ))} +
+ ) : ( +

No organized events yet

+ )} +
)}