@adventurelabs/scout-core
Version:
Core utilities and helpers for Adventure Labs Scout applications
67 lines (66 loc) • 2.73 kB
JavaScript
"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];
}