@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
JavaScript
// 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