From 7e85ffe548072768ea5ab44061753847f1752d78 Mon Sep 17 00:00:00 2001 From: byGalax Date: Sat, 16 May 2026 17:43:45 +0200 Subject: [PATCH] feat(desktop): usePinnedMessages live hook --- apps/desktop/src/lib/usePinnedMessages.ts | 48 +++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 apps/desktop/src/lib/usePinnedMessages.ts diff --git a/apps/desktop/src/lib/usePinnedMessages.ts b/apps/desktop/src/lib/usePinnedMessages.ts new file mode 100644 index 0000000..dcb310c --- /dev/null +++ b/apps/desktop/src/lib/usePinnedMessages.ts @@ -0,0 +1,48 @@ +import { listPinnedMessages, type PinnedMessage } from '@chat-app/shared/chat'; +import { useEffect, useState } from 'react'; + +import { supabase } from './supabase'; + +// Live list of pinned messages for one conversation. Subscribes to the +// `pinned_messages` realtime channel for the conv so the header pill + +// side-panel update without a refetch. +export function usePinnedMessages(conversationId: string | undefined): PinnedMessage[] { + const [pins, setPins] = useState([]); + + useEffect(() => { + if (!conversationId) { + setPins([]); + return; + } + let cancelled = false; + + void listPinnedMessages(supabase, conversationId).then((rows) => { + if (!cancelled) setPins(rows); + }); + + const channel = supabase + .channel('pinned_messages:' + conversationId) + .on( + 'postgres_changes', + { + event: '*', + schema: 'public', + table: 'pinned_messages', + filter: 'conversation_id=eq.' + conversationId, + }, + () => { + void listPinnedMessages(supabase, conversationId).then((rows) => { + if (!cancelled) setPins(rows); + }); + }, + ) + .subscribe(); + + return () => { + cancelled = true; + void supabase.removeChannel(channel); + }; + }, [conversationId]); + + return pins; +}