UNPKG

@techolution-ai/computer-vision

Version:

A JavaScript/TypeScript library for computer vision applications, providing tools for image processing, scanning, and MQTT-based messaging.

84 lines 2.31 kB
// src/messages/use-messages.tsx import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; import { MessagesContext } from "./messages-provider.js"; var useMessages = ({ topics, onConnect = () => { }, onError = () => { }, onMessage, onClose = () => { } }) => { const context = useContext(MessagesContext); if (!context) { throw new Error("MessagesProvider not found in the context"); } const [map, setMap] = useState({}); const onMessageRef = useRef(onMessage); useEffect(() => { onMessageRef.current = onMessage; }, [onMessage]); const handleOnMessageReceiveFromContext = useCallback( (topic, message) => { setMap((prev) => { const newMap = { ...prev }; if (!newMap[topic]) { newMap[topic] = { messages: [], removeListener: () => { } }; } newMap[topic].messages.push(message); return newMap; }); if (onMessageRef.current) onMessageRef.current(topic, message); }, [] ); const registerListener = useCallback( (topic) => { setMap((prev) => { if (prev[topic]) return prev; const removeFn = context?.registerListener( topic, handleOnMessageReceiveFromContext ); if (!removeFn) return prev; return { ...prev, [topic]: { messages: [], removeListener: removeFn } }; }); }, [context, handleOnMessageReceiveFromContext] ); const removeListener = useCallback((topic) => { setMap((prev) => { if (!prev[topic]) return prev; prev[topic].removeListener(); const newMap = { ...prev }; delete newMap[topic]; return newMap; }); }, []); useEffect(() => { topics.forEach((topic) => { if (!map[topic]) { registerListener(topic); } }); return () => { Object.keys(map).forEach((topic) => { if (!topics.includes(topic)) { removeListener(topic); } }); }; }, [topics, registerListener, removeListener]); return useMemo( () => ({ messages: map, removeListener, registerListener }), [map, removeListener, registerListener] ); }; var use_messages_default = useMessages; export { use_messages_default as default }; //# sourceMappingURL=use-messages.js.map