UNPKG

@yamada-ui/react

Version:

React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion

77 lines (73 loc) 2.54 kB
"use client"; const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs'); let react = require("react"); react = require_rolldown_runtime.__toESM(react); let __yamada_ui_utils = require("@yamada-ui/utils"); __yamada_ui_utils = require_rolldown_runtime.__toESM(__yamada_ui_utils); //#region src/utils/store.ts const DEFAULT_IDENTIFIER = "default"; function createStore(initialState, additionalMethods, options = {}) { const queue = /* @__PURE__ */ new Map(); const ref = new Proxy({ current: (0, __yamada_ui_utils.runIfFn)(initialState) }, { ...options.proxyHandler }); function get() { return ref.current; } function executeQueue(key) { const listeners = queue.get(key) ?? []; if (!listeners.length) console.warn(`createStore: ${key} is not subscribed.`); listeners.forEach((listener) => listener()); } function update(key) { if (!(0, __yamada_ui_utils.isUndefined)(key)) (0, __yamada_ui_utils.toArray)(key).forEach(executeQueue); executeQueue(DEFAULT_IDENTIFIER); } function set(nextState, key) { ref.current = (0, __yamada_ui_utils.runIfFn)(nextState, ref.current); update(key); } const methods = { ref, get, queue, set, update }; function useStore(path, key) { const customSubscribe = options.subscribe?.({ key, ...methods }); const subscribe = function(listener) { if (key) { if ((queue.get(key) ?? []).length) console.warn(`createStore: ${key} is already subscribed.`); queue.set(key, [listener]); } else { const listeners = queue.get(DEFAULT_IDENTIFIER) ?? []; queue.set(DEFAULT_IDENTIFIER, [...listeners, listener]); } return function() { if (key) queue.delete(key); else { const listeners = queue.get(DEFAULT_IDENTIFIER) ?? []; queue.set(DEFAULT_IDENTIFIER, listeners.filter((fn) => fn !== listener)); } }; }; function getSnapshot() { if (!(0, __yamada_ui_utils.isUndefined)(path)) { if ((0, __yamada_ui_utils.isObject)(ref.current)) return (0, __yamada_ui_utils.getMemoizedObject)(ref.current, path); else if ((0, __yamada_ui_utils.isArray)(ref.current)) return ref.current[path]; } return ref.current; } return (0, react.useSyncExternalStore)(customSubscribe ?? subscribe, getSnapshot, getSnapshot); } const customMethods = Object.fromEntries(Object.entries(additionalMethods ?? {}).map(([key, value]) => [key, value(methods)])); return [useStore, { ...methods, ...customMethods }]; } //#endregion exports.createStore = createStore; //# sourceMappingURL=store.cjs.map