UNPKG

@ryo-98/react-api-bridge

Version:
104 lines (103 loc) 4.42 kB
"use strict"; 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); var useRegister_exports = {}; __export(useRegister_exports, { useRegister: () => useRegister }); module.exports = __toCommonJS(useRegister_exports); var import_react = require("react"); var import_core = require("../../core/index.js"); var import_useUniqueElementRef = require("../../utils/useUniqueElementRef.js"); var import_useHookId = require("../../utils/useHookId.js"); var import_tryInvoke = require("../../utils/tryInvoke.js"); var import_mappedSet = require("../../utils/mappedSet.js"); function useRegister(apiBridge, name, init, deps, hookOptions) { const isMulti = (0, import_core.getIsMulti)(name, apiBridge.bridgeOptions); const contextValue = (0, import_core.useFinalContextValue)(hookOptions, apiBridge.BridgeContext); const { apiNList } = (0, import_react.useMemo)(() => (0, import_core.getApiDesc)(name, contextValue.bridge, apiBridge.bridgeOptions), [name, contextValue]); const apiRef = (0, import_useUniqueElementRef.useUniqueElementRef)(apiNList); const hookId = (0, import_useHookId.useHookId)(); const localApiRef = (0, import_react.useRef)(null); const isOwnerRef = (0, import_react.useRef)(false); const hasWarnedRef = (0, import_react.useRef)(false); (0, import_react.useImperativeHandle)(isMulti ? apiRef : localApiRef, () => { return init(); }, deps); (0, import_react.useLayoutEffect)(() => { if (isMulti) return; const entry = contextValue.bridge[name]; if (!entry) return; if (entry.ownerId === void 0 || entry.ownerId === hookId) { entry.ownerId = hookId; isOwnerRef.current = true; } else { isOwnerRef.current = false; if (!hasWarnedRef.current) { hasWarnedRef.current = true; console.warn( `[react-api-bridge] useRegister: the API "${String(name)}" is already registered by another component (only the first registered component can provide it in non-multi mode). The new registration is ignored to avoid overriding the existing API. If multiple registrations on the same field are intended, enable "isMulti: true" in the bridge options for this field.` ); } } return () => { if (isOwnerRef.current) { if (entry.ownerId === hookId) { entry.ownerId = void 0; } apiNList.current = null; isOwnerRef.current = false; } }; }, []); (0, import_react.useLayoutEffect)(() => { if (isMulti) return; if (isOwnerRef.current) { apiNList.current = localApiRef.current; } }); (0, import_react.useEffect)(() => { let clearFns = []; const { bucket } = (0, import_core.getResolverOrCreateWhenMissing)(apiNList, contextValue, true, apiBridge.pendingResolverMap); bucket.initialResolver?.resolve(apiNList); bucket.waiters.forEach((resolver) => { resolver.resolve(apiNList); }); bucket.waiters.clear(); const callbacks = apiBridge.cacheInitCbMap.get(apiNList); callbacks?.forEach((initInfo, hookId2) => { if (apiBridge.initializedOnInitMap.get(apiRef)?.has(hookId2)) return; initInfo.touchedRefs.add(apiRef); clearFns.push((0, import_mappedSet.appendToMappedSet)(apiBridge.initializedOnInitMap, apiRef, hookId2)); const onInit = initInfo.onInit; if (isMulti) { const _assertedOnInit = onInit; clearFns.push(_assertedOnInit(apiRef, apiNList)); } else { const _assertedOnInit = onInit; clearFns.push(_assertedOnInit(apiRef)); } }); return () => { clearFns.forEach(import_tryInvoke.tryInvoke); apiBridge.initializedOnInitMap.delete(apiRef); }; }, []); }