@trap_stevo/legendarybuilderproreact-ui
Version:
The legendary UI & utility API that makes your application a legendary application. ~ Created by Steven Compton
92 lines • 3.16 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import React, { createContext, useContext, useState, useEffect, useRef, useCallback } from "react";
import { GetHUDInteractionHandlers } from "../HUDManagers/HUDInteractionManager.js";
var HUDInteractionContext = /*#__PURE__*/createContext(null);
export function HUDInteractionProvider(_ref) {
var children = _ref.children;
var _useState = useState(new Map()),
_useState2 = _slicedToArray(_useState, 2),
interactions = _useState2[0],
setInteractions = _useState2[1];
var registerInteraction = useCallback(function (node, config) {
if (!node) {
return;
}
var handlers = GetHUDInteractionHandlers(config);
Object.entries(handlers).forEach(function (_ref2) {
var _ref3 = _slicedToArray(_ref2, 2),
key = _ref3[0],
handler = _ref3[1];
var eventType = key.replace(/^on/, "").toLowerCase();
node.addEventListener(eventType, handler);
});
setInteractions(function (prev) {
var next = new Map(prev);
next.set(node, {
config: config,
handlers: handlers
});
return next;
});
}, []);
var unregisterInteraction = useCallback(function (node) {
setInteractions(function (prev) {
var next = new Map(prev);
var data = next.get(node);
if (data !== null && data !== void 0 && data.handlers) {
Object.entries(data.handlers).forEach(function (_ref4) {
var _ref5 = _slicedToArray(_ref4, 2),
key = _ref5[0],
handler = _ref5[1];
var eventType = key.replace(/^on/, "").toLowerCase();
node.removeEventListener(eventType, handler);
});
}
next["delete"](node);
return next;
});
}, []);
return /*#__PURE__*/React.createElement(HUDInteractionContext.Provider, {
value: {
unregisterInteraction: unregisterInteraction,
registerInteraction: registerInteraction,
interactions: interactions
}
}, children);
}
;
export function useHUDInteraction(nodeRef) {
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var context = useContext(HUDInteractionContext);
if (!context) {
throw new Error("Must be used within a HUDInteractionProvider.");
}
var registerInteraction = context.registerInteraction,
unregisterInteraction = context.unregisterInteraction;
var lastConfigRef = useRef();
useEffect(function () {
var node = nodeRef === null || nodeRef === void 0 ? void 0 : nodeRef.current;
if (!node) {
return;
}
var serializedConfig = JSON.stringify(config);
if (lastConfigRef.current === serializedConfig) {
return;
}
lastConfigRef.current = serializedConfig;
registerInteraction(node, config);
return function () {
unregisterInteraction(node);
lastConfigRef.current = null;
};
}, [nodeRef, registerInteraction, unregisterInteraction]);
}
;
export function useHUDInteractions() {
var context = useContext(HUDInteractionContext);
if (!context) {
throw new Error("Must use within a HUDInteractionProvider.");
}
return context;
}
;