@techolution-ai/computer-vision
Version:
A JavaScript/TypeScript library for computer vision applications, providing tools for image processing, scanning, and MQTT-based messaging.
104 lines (103 loc) • 3.35 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/messages/use-messages.tsx
var use_messages_exports = {};
__export(use_messages_exports, {
default: () => use_messages_default
});
module.exports = __toCommonJS(use_messages_exports);
var import_react = require("react");
var import_messages_provider = require("./messages-provider.cjs");
var useMessages = ({
topics,
onConnect = () => {
},
onError = () => {
},
onMessage,
onClose = () => {
}
}) => {
const context = (0, import_react.useContext)(import_messages_provider.MessagesContext);
if (!context) {
throw new Error("MessagesProvider not found in the context");
}
const [map, setMap] = (0, import_react.useState)({});
const onMessageRef = (0, import_react.useRef)(onMessage);
(0, import_react.useEffect)(() => {
onMessageRef.current = onMessage;
}, [onMessage]);
const handleOnMessageReceiveFromContext = (0, import_react.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 = (0, import_react.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 = (0, import_react.useCallback)((topic) => {
setMap((prev) => {
if (!prev[topic]) return prev;
prev[topic].removeListener();
const newMap = { ...prev };
delete newMap[topic];
return newMap;
});
}, []);
(0, import_react.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 (0, import_react.useMemo)(
() => ({ messages: map, removeListener, registerListener }),
[map, removeListener, registerListener]
);
};
var use_messages_default = useMessages;
//# sourceMappingURL=use-messages.cjs.map