UNPKG

@adventurelabs/scout-core

Version:

Core utilities and helpers for Adventure Labs Scout applications

67 lines (66 loc) 2.73 kB
"use client"; import { useEffect, useRef, useCallback, useState } from "react"; import { EnumRealtimeOperation } from "../types/realtime"; export function useScoutRealtimeVersionsSoftware(scoutSupabase) { const channels = useRef([]); const [latestVersionUpdate, setLatestVersionUpdate] = useState(null); // Handle versions software broadcasts const handleVersionsSoftwareBroadcast = useCallback((payload) => { const { event, payload: data } = payload; const versionData = data.record || data.old_record; if (!versionData) { return; } let operation; switch (data.operation) { case "INSERT": operation = EnumRealtimeOperation.INSERT; break; case "UPDATE": operation = EnumRealtimeOperation.UPDATE; break; case "DELETE": operation = EnumRealtimeOperation.DELETE; break; default: return; } console.log(`[scout-core realtime] VERSIONS_SOFTWARE ${data.operation} received for version ${versionData.system}@${versionData.version}:`, JSON.stringify(versionData)); const realtimeData = { data: versionData, operation, }; setLatestVersionUpdate(realtimeData); }, []); // Clear latest update const clearLatestUpdate = useCallback(() => { setLatestVersionUpdate(null); }, []); useEffect(() => { if (!scoutSupabase) return; // Clean up existing channels channels.current.forEach((channel) => scoutSupabase.removeChannel(channel)); channels.current = []; // Clear previous update when setting up clearLatestUpdate(); // Create versions_software channel const channel = scoutSupabase .channel("versions_software_changes", { config: { private: true } }) .on("broadcast", { event: "*" }, handleVersionsSoftwareBroadcast) .subscribe((status) => { if (status === "SUBSCRIBED") { console.log("[VERSIONS_SOFTWARE] ✅ Connected to software versions broadcasts"); } else if (status === "CHANNEL_ERROR") { console.warn("[VERSIONS_SOFTWARE] 🟡 Failed to connect to software versions broadcasts"); } }); channels.current.push(channel); return () => { channels.current.forEach((ch) => scoutSupabase.removeChannel(ch)); channels.current = []; }; }, [scoutSupabase, handleVersionsSoftwareBroadcast, clearLatestUpdate]); return [latestVersionUpdate, clearLatestUpdate]; }