"use client" import { useEffect, useRef } from "react" import { useQueryClient } from "@tanstack/react-query" import { createSupabaseBrowserClient } from "@/lib/supabase/client" import { queryKeys } from "@/lib/queries/query-keys" import { toast } from "sonner" import { useNotificationStore } from "@/lib/stores/notification-store" const DEBOUNCE_MILLISECONDS = 3000 export function useRealtimeEntries() { const queryClient = useQueryClient() const supabaseClientReference = useRef(createSupabaseBrowserClient()) const pendingCountReference = useRef(0) const debounceTimerReference = useRef | null>(null) useEffect(() => { function flushPendingNotifications() { const count = pendingCountReference.current if (count === 0) return pendingCountReference.current = 0 debounceTimerReference.current = null const message = count === 1 ? "1 new entry" : `${count} new entries` useNotificationStore.getState().addNotification(message) toast(message, { action: { label: "refresh", onClick: () => { queryClient.invalidateQueries({ queryKey: queryKeys.timeline.all, }) }, }, }) } const channel = supabaseClientReference.current .channel("entries-realtime") .on( "postgres_changes", { event: "INSERT", schema: "public", table: "entries", }, () => { pendingCountReference.current++ if (debounceTimerReference.current) { clearTimeout(debounceTimerReference.current) } debounceTimerReference.current = setTimeout( flushPendingNotifications, DEBOUNCE_MILLISECONDS ) } ) .subscribe() return () => { if (debounceTimerReference.current) { clearTimeout(debounceTimerReference.current) } supabaseClientReference.current.removeChannel(channel) } }, [queryClient]) }