UNPKG

@react-navigation/core

Version:

Core utilities for building navigators

105 lines (103 loc) 3.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useEventEmitter = useEventEmitter; var React = _interopRequireWildcard(require("react")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /** * Hook to manage the event system used by the navigator to notify screens of various events. */ function useEventEmitter(listen) { const listenRef = React.useRef(listen); React.useEffect(() => { listenRef.current = listen; }); const listeners = React.useRef(Object.create(null)); const create = React.useCallback(target => { const removeListener = (type, callback) => { const callbacks = listeners.current[type] ? listeners.current[type][target] : undefined; if (!callbacks) { return; } const index = callbacks.indexOf(callback); if (index > -1) { callbacks.splice(index, 1); } }; const addListener = (type, callback) => { listeners.current[type] = listeners.current[type] || {}; listeners.current[type][target] = listeners.current[type][target] || []; listeners.current[type][target].push(callback); let removed = false; return () => { // Prevent removing other listeners when unsubscribing same listener multiple times if (!removed) { removed = true; removeListener(type, callback); } }; }; return { addListener, removeListener }; }, []); const emit = React.useCallback(({ type, data, target, canPreventDefault }) => { const items = listeners.current[type] || {}; // Copy the current list of callbacks in case they are mutated during execution const callbacks = target !== undefined ? items[target]?.slice() : [].concat(...Object.keys(items).map(t => items[t])).filter((cb, i, self) => self.lastIndexOf(cb) === i); const event = { get type() { return type; } }; if (target !== undefined) { Object.defineProperty(event, 'target', { enumerable: true, get() { return target; } }); } if (data !== undefined) { Object.defineProperty(event, 'data', { enumerable: true, get() { return data; } }); } if (canPreventDefault) { let defaultPrevented = false; Object.defineProperties(event, { defaultPrevented: { enumerable: true, get() { return defaultPrevented; } }, preventDefault: { enumerable: true, value() { defaultPrevented = true; } } }); } listenRef.current?.(event); callbacks?.forEach(cb => cb(event)); return event; }, []); return React.useMemo(() => ({ create, emit }), [create, emit]); } //# sourceMappingURL=useEventEmitter.js.map