From 639bb159fe7a79778cb5d0ac64b49ed9e64fe4ea Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 27 Nov 2025 14:38:05 +0100 Subject: [PATCH] feat: enhance session event handling by including userId for client-side filtering and updating SessionLiveWrapper with currentUserId --- dev.db | Bin 131072 -> 147456 bytes src/app/api/sessions/[id]/subscribe/route.ts | 1 + src/app/sessions/[id]/page.tsx | 1 + .../collaboration/SessionLiveWrapper.tsx | 3 +++ src/hooks/useSessionLive.ts | 18 ++++++++++++++++-- 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/dev.db b/dev.db index c7b9a98e8b83bc07e25f905dbeb17c88a59d819c..e22196a4850a77d09e3f9ca3a22a5f2583dfb557 100644 GIT binary patch literal 147456 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 diff --git a/src/app/api/sessions/[id]/subscribe/route.ts b/src/app/api/sessions/[id]/subscribe/route.ts index f29660d..29894fd 100644 --- a/src/app/api/sessions/[id]/subscribe/route.ts +++ b/src/app/api/sessions/[id]/subscribe/route.ts @@ -66,6 +66,7 @@ export async function GET( `data: ${JSON.stringify({ type: event.type, payload: JSON.parse(event.payload), + userId: event.userId, // Include userId for client-side filtering user: event.user, timestamp: event.createdAt, })}\n\n` diff --git a/src/app/sessions/[id]/page.tsx b/src/app/sessions/[id]/page.tsx index fc71aab..9b231b6 100644 --- a/src/app/sessions/[id]/page.tsx +++ b/src/app/sessions/[id]/page.tsx @@ -66,6 +66,7 @@ export default async function SessionPage({ params }: SessionPageProps) { ; + userId?: string; // ID of the user who created the event user?: { id: string; name: string | null; email: string }; timestamp: string; }; interface UseSessionLiveOptions { sessionId: string; + currentUserId?: string; // Current user ID for client-side filtering enabled?: boolean; onEvent?: (event: LiveEvent) => void; } @@ -24,6 +26,7 @@ interface UseSessionLiveReturn { export function useSessionLive({ sessionId, + currentUserId, enabled = true, onEvent, }: UseSessionLiveOptions): UseSessionLiveReturn { @@ -35,12 +38,17 @@ export function useSessionLive({ const reconnectTimeoutRef = useRef(null); const reconnectAttemptsRef = useRef(0); const onEventRef = useRef(onEvent); + const currentUserIdRef = useRef(currentUserId); - // Keep onEvent ref updated + // Keep refs updated useEffect(() => { onEventRef.current = onEvent; }, [onEvent]); + useEffect(() => { + currentUserIdRef.current = currentUserId; + }, [currentUserId]); + useEffect(() => { if (!enabled || typeof window === 'undefined') return; @@ -69,10 +77,16 @@ export function useSessionLive({ return; } + // Client-side filter: ignore events created by current user + // This prevents duplicates when revalidatePath already refreshed the data + if (currentUserIdRef.current && data.userId === currentUserIdRef.current) { + return; + } + setLastEvent(data); onEventRef.current?.(data); - // Refresh the page data when we receive an event + // Refresh the page data when we receive an event from another user router.refresh(); } catch (e) { console.error('Failed to parse SSE event:', e);