@helloworldqq/react-modal 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/hook/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,oBAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEtF,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,eAAO,MAAM,aAAa;;;;;;;uBAqDc,OAAO;;;CAgC9C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/hook/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,oBAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEtF,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,eAAO,MAAM,aAAa;;;;;;;uBAgEc,OAAO;;;CAiC9C,CAAA"}
package/dist/index.d.ts CHANGED
@@ -3,8 +3,16 @@ declare type ModalComponent = React.FunctionComponent<any> | React.ComponentType
3
3
  export declare type ReactHookModalProviderProps = {
4
4
  children: React.ReactNode;
5
5
  modals: Record<string, ModalComponent>;
6
+ /**
7
+ * Strategy for rendering modals:
8
+ * - 'eager': Mount all modals upfront (default, backward compatible)
9
+ * - 'lazy': Only mount modals that have been opened at least once
10
+ *
11
+ * Use 'lazy' if you have 50+ modals for better performance.
12
+ */
13
+ renderStrategy?: 'eager' | 'lazy';
6
14
  };
7
- export declare const ReactHookModalProvider: ({ children, modals }: ReactHookModalProviderProps) => React.JSX.Element;
15
+ export declare const ReactHookModalProvider: ({ children, modals, renderStrategy }: ReactHookModalProviderProps) => React.JSX.Element;
8
16
  export * from './hook';
9
17
  export * from './provider';
10
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,aAAK,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAE7E,oBAAY,2BAA2B,GAAG;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;CACvC,CAAA;AAED,eAAO,MAAM,sBAAsB,yBAGhC,2BAA2B,sBAO7B,CAAA;AAED,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,aAAK,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAE7E,oBAAY,2BAA2B,GAAG;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACtC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAClC,CAAA;AAED,eAAO,MAAM,sBAAsB,yCAIhC,2BAA2B,sBAO7B,CAAA;AAED,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA"}
package/dist/index.js CHANGED
@@ -42,7 +42,8 @@ var closeModal = function closeModal(tag) {
42
42
  var _extends4;
43
43
  return {
44
44
  modalTags: _extends({}, state.modalTags, (_extends4 = {}, _extends4[tag] = {
45
- input: false
45
+ input: false,
46
+ output: undefined
46
47
  }, _extends4))
47
48
  };
48
49
  });
@@ -88,38 +89,64 @@ var useModalActions = function useModalActions(actionCallback) {
88
89
  };
89
90
 
90
91
  var ModalWrapper = React.memo(function ModalWrapper(_ref) {
91
- var modals = _ref.modals;
92
+ var modals = _ref.modals,
93
+ _ref$renderStrategy = _ref.renderStrategy,
94
+ renderStrategy = _ref$renderStrategy === void 0 ? 'eager' : _ref$renderStrategy;
92
95
  var modalTags = useModalStore(function (state) {
93
96
  return state.modalTags;
94
97
  });
95
- var modalOpened = React.useMemo(function () {
96
- return Object.entries(modals).filter(function (_ref2) {
97
- var _modalTags$tag;
98
- var tag = _ref2[0];
99
- return !!((_modalTags$tag = modalTags[tag]) !== null && _modalTags$tag !== void 0 && _modalTags$tag.input);
100
- }).map(function (_ref3) {
101
- var tag = _ref3[0],
102
- Modal = _ref3[1];
103
- return React__default.createElement(Modal, {
104
- key: tag
98
+ var allModals = React.useMemo(function () {
99
+ if (renderStrategy === 'lazy') {
100
+ return Object.keys(modalTags).map(function (tag) {
101
+ var Modal = modals[tag];
102
+ if (!Modal) {
103
+ console.warn("[ModalWrapper] Modal \"" + tag + "\" not found in modals registry");
104
+ return null;
105
+ }
106
+ try {
107
+ return React__default.createElement(Modal, {
108
+ key: tag
109
+ });
110
+ } catch (error) {
111
+ console.error("[ModalWrapper] Error rendering modal \"" + tag + "\":", error);
112
+ return null;
113
+ }
105
114
  });
115
+ }
116
+ return Object.entries(modals).map(function (_ref2) {
117
+ var tag = _ref2[0],
118
+ Modal = _ref2[1];
119
+ try {
120
+ return React__default.createElement(Modal, {
121
+ key: tag
122
+ });
123
+ } catch (error) {
124
+ console.error("[ModalWrapper] Error rendering modal \"" + tag + "\":", error);
125
+ return null;
126
+ }
106
127
  });
107
- }, [modals, modalTags]);
108
- return React__default.createElement(React__default.Fragment, null, modalOpened);
128
+ }, [renderStrategy === 'lazy' ? modalTags : modals, modals, renderStrategy]);
129
+ return React__default.createElement(React__default.Fragment, null, allModals);
109
130
  });
110
131
 
111
132
  var useDisclosure = function useDisclosure(disclosureHook) {
112
133
  var tag = disclosureHook.tag;
113
134
  var disclosureHookRef = React.useRef(disclosureHook);
114
135
  disclosureHookRef.current = disclosureHook;
115
- var inputState = useModalStore(function (state) {
116
- var _state$modalTags$tag;
117
- return (_state$modalTags$tag = state.modalTags[tag]) === null || _state$modalTags$tag === void 0 ? void 0 : _state$modalTags$tag.input;
118
- });
119
- var outputState = useModalStore(function (state) {
120
- var _state$modalTags$tag2;
121
- return (_state$modalTags$tag2 = state.modalTags[tag]) === null || _state$modalTags$tag2 === void 0 ? void 0 : _state$modalTags$tag2.output;
122
- });
136
+ var inputSelector = React.useMemo(function () {
137
+ return function (state) {
138
+ var _state$modalTags$tag;
139
+ return (_state$modalTags$tag = state.modalTags[tag]) === null || _state$modalTags$tag === void 0 ? void 0 : _state$modalTags$tag.input;
140
+ };
141
+ }, [tag]);
142
+ var outputSelector = React.useMemo(function () {
143
+ return function (state) {
144
+ var _state$modalTags$tag2;
145
+ return (_state$modalTags$tag2 = state.modalTags[tag]) === null || _state$modalTags$tag2 === void 0 ? void 0 : _state$modalTags$tag2.output;
146
+ };
147
+ }, [tag]);
148
+ var inputState = useModalStore(inputSelector);
149
+ var outputState = useModalStore(outputSelector);
123
150
  var clearDisclosureTag = useModalActions(function (actions) {
124
151
  return actions.clearModalTag;
125
152
  });
@@ -178,9 +205,10 @@ var useDisclosure = function useDisclosure(disclosureHook) {
178
205
  }, [tag, clearDisclosureTag]);
179
206
  React.useEffect(function () {
180
207
  if (outputState) {
181
- onOk(outputState);
208
+ var _disclosureHookRef$cu1, _disclosureHookRef$cu10;
209
+ (_disclosureHookRef$cu1 = disclosureHookRef.current) === null || _disclosureHookRef$cu1 === void 0 ? void 0 : (_disclosureHookRef$cu10 = _disclosureHookRef$cu1.onOk) === null || _disclosureHookRef$cu10 === void 0 ? void 0 : _disclosureHookRef$cu10.call(_disclosureHookRef$cu1, outputState);
182
210
  }
183
- }, [outputState, onOk]);
211
+ }, [outputState]);
184
212
  return {
185
213
  isOpen: !!inputState,
186
214
  input: typeof inputState === 'boolean' ? undefined : inputState,
@@ -196,9 +224,12 @@ var useDisclosure = function useDisclosure(disclosureHook) {
196
224
 
197
225
  var ReactHookModalProvider = function ReactHookModalProvider(_ref) {
198
226
  var children = _ref.children,
199
- modals = _ref.modals;
227
+ modals = _ref.modals,
228
+ _ref$renderStrategy = _ref.renderStrategy,
229
+ renderStrategy = _ref$renderStrategy === void 0 ? 'eager' : _ref$renderStrategy;
200
230
  return React.createElement(React.Fragment, null, React.createElement(ModalWrapper, {
201
- modals: modals
231
+ modals: modals,
232
+ renderStrategy: renderStrategy
202
233
  }), children);
203
234
  };
204
235
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/store/index.ts","../src/provider/index.tsx","../src/hook/index.ts","../src/index.tsx"],"sourcesContent":["import { Store, useStore } from \"@tanstack/react-store\";\n\n// You can instantiate the store outside of React components too!\n\nimport { Any } from '../hook'\n\nexport type State = {\n modalTags: {\n [tag: string]: {\n input?: Any\n output?: Any\n }\n }\n}\n\nexport type Action = {\n openModal: (tag: string, input?: Any) => void\n okModal: (tag: string, output?: Any) => void\n closeModal: (tag: string) => void\n toggleModal: (tag: string) => void\n clearModalTag: (tag: string) => void\n clearAllModalTags: () => void\n}\nexport const store = new Store<State>({\n modalTags: {}\n});\n\n\nconst openModal = (tag: string, input?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: input ?? true // Default to true if no input is provided\n }\n }\n }))\n}\nconst okModal = (tag: string, output?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n output\n }\n }\n }))\n}\nconst closeModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: { input: false }\n }\n }))\n}\nconst toggleModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: !state.modalTags[tag]?.input\n }\n }\n }))\n}\nconst clearModalTag = (tag: string) => {\n store.setState((state) => {\n const newModalTags = { ...state.modalTags };\n delete newModalTags[tag];\n return { modalTags: newModalTags };\n })\n}\nconst clearAllModalTags = () => {\n store.setState(() => ({ modalTags: {} }))\n}\n\nexport const useModalStore = <T>(\n stateCallback: (state: State) => T,\n): T => {\n return useStore(store, stateCallback)\n}\n\nexport const useModalActions = <T>(\n actionCallback: (action: Action) => T\n): T => {\n return actionCallback(\n {\n openModal,\n okModal,\n closeModal,\n toggleModal,\n clearModalTag,\n clearAllModalTags\n }\n )\n}","import React, { useMemo, memo } from 'react'\nimport { useModalStore, State } from '../store'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport interface ModalWrapperProps {\n modals: Record<string, ModalComponent>\n}\n\nexport const ModalWrapper = memo(function ModalWrapper({\n modals\n}: ModalWrapperProps) {\n const modalTags = useModalStore((state: State) => state.modalTags)\n \n const modalOpened = useMemo(() => {\n return Object.entries(modals)\n .filter(([tag]) => !!modalTags[tag]?.input)\n .map(([tag, Modal]) => <Modal key={tag} />)\n }, [modals, modalTags])\n \n return <React.Fragment>{modalOpened}</React.Fragment>\n})\n","import { useEffect, useCallback, useRef } from 'react'\nimport { TagType } from './tag'\nimport { useModalStore, useModalActions, store } from '../store'\n\nexport type Any = string | number | boolean | object | undefined | Record<string, any>\n\nexport interface DisclosureHookProps<O> {\n tag: TagType\n isOpen?: boolean\n onOpen?: () => void\n onClose?: () => void\n onToggle?: () => void\n onChange?: (isOpen: boolean) => void\n onOk?: (output?: O) => void\n onCancel?: () => void\n}\n\nexport const useDisclosure = <Input = Any, Output = Any>(\n disclosureHook: DisclosureHookProps<Output>\n) => {\n const tag = disclosureHook.tag\n \n // Use refs to store callbacks to avoid stale closures\n const disclosureHookRef = useRef(disclosureHook)\n disclosureHookRef.current = disclosureHook\n\n const inputState = useModalStore(\n (state) => state.modalTags[tag]?.input\n ) as Input\n const outputState = useModalStore(\n (state) => state.modalTags[tag]?.output\n ) as Output\n const clearDisclosureTag = useModalActions(\n (actions) => actions.clearModalTag\n )\n\n const onOpenAction = useModalActions((actions) => actions.openModal)\n const okAction = useModalActions((actions) => actions.okModal)\n const onCloseAction = useModalActions((actions) => actions.closeModal)\n const onToggleAction = useModalActions((actions) => actions.toggleModal)\n\n const updateInput = useCallback((input?: Input) => {\n // If input is a function, call it and set the result as input\n let processedInput = input\n if (processedInput && typeof processedInput == 'object' && 'preventDefault' in processedInput) {\n processedInput = undefined\n }\n onOpenAction(tag, processedInput as Any)\n }, [tag, onOpenAction])\n\n const onOpen = useCallback((input?: Input) => {\n updateInput(input)\n disclosureHookRef.current?.onOpen?.()\n }, [updateInput])\n\n const onClose = useCallback(() => {\n onCloseAction(tag)\n disclosureHookRef.current?.onClose?.()\n }, [tag, onCloseAction])\n\n const onToggle = useCallback(() => {\n onToggleAction(tag)\n disclosureHookRef.current?.onToggle?.()\n }, [tag, onToggleAction])\n\n const onOk = useCallback((output?: Output) => {\n disclosureHookRef.current?.onOk?.(output)\n okAction(tag, output as Any)\n }, [tag, okAction])\n\n const onChange = useCallback((isOpen: boolean) => {\n if (isOpen) {\n onOpen()\n } else {\n onClose()\n }\n disclosureHookRef.current?.onChange?.(isOpen)\n }, [onOpen, onClose])\n\n useEffect(() => {\n return () => {\n clearDisclosureTag(tag)\n }\n }, [tag, clearDisclosureTag])\n\n useEffect(() => {\n if (outputState) {\n onOk(outputState as Output)\n }\n }, [outputState, onOk])\n\n return {\n isOpen: !!inputState,\n input: typeof inputState === 'boolean' ? undefined : inputState,\n onOpen,\n onClose,\n onToggle,\n onOk,\n onChange,\n updateInput,\n store\n }\n}\n","import * as React from 'react'\nimport { ModalWrapper } from './provider'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport type ReactHookModalProviderProps = {\n children: React.ReactNode\n modals: Record<string, ModalComponent>\n}\n\nexport const ReactHookModalProvider = ({\n children,\n modals\n}: ReactHookModalProviderProps) => {\n return (\n <React.Fragment>\n <ModalWrapper modals={modals} />\n {children}\n </React.Fragment>\n )\n}\n\nexport * from './hook'\nexport * from './provider'\n"],"names":["store","Store","modalTags","openModal","tag","input","setState","state","_extends2","_extends","okModal","output","_extends3","closeModal","_extends4","toggleModal","_state$modalTags$tag","_extends5","clearModalTag","newModalTags","clearAllModalTags","useModalStore","stateCallback","useStore","useModalActions","actionCallback","ModalWrapper","memo","_ref","modals","modalOpened","useMemo","Object","entries","filter","_ref2","_modalTags$tag","map","_ref3","Modal","React","key","Fragment","useDisclosure","disclosureHook","disclosureHookRef","useRef","current","inputState","outputState","_state$modalTags$tag2","clearDisclosureTag","actions","onOpenAction","okAction","onCloseAction","onToggleAction","updateInput","useCallback","processedInput","undefined","onOpen","_disclosureHookRef$cu","_disclosureHookRef$cu2","call","onClose","_disclosureHookRef$cu3","_disclosureHookRef$cu4","onToggle","_disclosureHookRef$cu5","_disclosureHookRef$cu6","onOk","_disclosureHookRef$cu7","_disclosureHookRef$cu8","onChange","isOpen","_disclosureHookRef$cu9","_disclosureHookRef$cu0","useEffect","ReactHookModalProvider","children"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/store/index.ts","../src/provider/index.tsx","../src/hook/index.ts","../src/index.tsx"],"sourcesContent":["import { Store, useStore } from \"@tanstack/react-store\";\n\n// You can instantiate the store outside of React components too!\n\nimport { Any } from '../hook'\n\nexport type State = {\n modalTags: {\n [tag: string]: {\n input?: Any\n output?: Any\n }\n }\n}\n\nexport type Action = {\n openModal: (tag: string, input?: Any) => void\n okModal: (tag: string, output?: Any) => void\n closeModal: (tag: string) => void\n toggleModal: (tag: string) => void\n clearModalTag: (tag: string) => void\n clearAllModalTags: () => void\n}\nexport const store = new Store<State>({\n modalTags: {}\n});\n\n\nconst openModal = (tag: string, input?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: input ?? true // Default to true if no input is provided\n }\n }\n }))\n}\nconst okModal = (tag: string, output?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n output\n }\n }\n }))\n}\nconst closeModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: { input: false, output: undefined }\n }\n }))\n}\nconst toggleModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: !state.modalTags[tag]?.input\n }\n }\n }))\n}\nconst clearModalTag = (tag: string) => {\n store.setState((state) => {\n const newModalTags = { ...state.modalTags };\n delete newModalTags[tag];\n return { modalTags: newModalTags };\n })\n}\nconst clearAllModalTags = () => {\n store.setState(() => ({ modalTags: {} }))\n}\n\nexport const useModalStore = <T>(\n stateCallback: (state: State) => T,\n): T => {\n return useStore(store, stateCallback)\n}\n\nexport const useModalActions = <T>(\n actionCallback: (action: Action) => T\n): T => {\n return actionCallback(\n {\n openModal,\n okModal,\n closeModal,\n toggleModal,\n clearModalTag,\n clearAllModalTags\n }\n )\n}","import React, { useMemo, memo } from 'react'\nimport { useModalStore, State } from '../store'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport interface ModalWrapperProps {\n modals: Record<string, ModalComponent>\n /**\n * Strategy for rendering modals:\n * - 'eager': Mount all modals upfront (default, backward compatible)\n * - 'lazy': Only mount modals that have been opened at least once\n * \n * Performance comparison:\n * - 10 modals: Both strategies are fine\n * - 50 modals: Lazy recommended (~200ms faster initial render)\n * - 100+ modals: Lazy strongly recommended (~500ms+ faster initial render)\n * - 1000 modals: Lazy is mandatory (~10s faster initial render, ~100MB less memory)\n * \n * Trade-off: With lazy mode, first modal open has ~50-100ms delay for mounting.\n */\n renderStrategy?: 'eager' | 'lazy'\n}\n\nexport const ModalWrapper = memo(function ModalWrapper({\n modals,\n renderStrategy = 'eager'\n}: ModalWrapperProps) {\n const modalTags = useModalStore((state: State) => state.modalTags)\n\n const allModals = useMemo(() => {\n if (renderStrategy === 'lazy') {\n // LAZY MODE: Chỉ render modals đã được mở ít nhất 1 lần\n // Significantly faster for apps with many modals!\n return Object.keys(modalTags).map((tag) => {\n const Modal = modals[tag]\n if (!Modal) {\n console.warn(`[ModalWrapper] Modal \"${tag}\" not found in modals registry`)\n return null\n }\n\n try {\n return <Modal key={tag} />\n } catch (error) {\n console.error(`[ModalWrapper] Error rendering modal \"${tag}\":`, error)\n return null\n }\n })\n }\n\n // EAGER MODE: Render tất cả modals ngay từ đầu (backward compatible)\n // Modal components tự control hiển thị qua isOpen prop\n return Object.entries(modals).map(([tag, Modal]) => {\n try {\n return <Modal key={tag} />\n } catch (error) {\n console.error(`[ModalWrapper] Error rendering modal \"${tag}\":`, error)\n return null\n }\n })\n }, [renderStrategy === 'lazy' ? modalTags : modals, modals, renderStrategy])\n\n return <React.Fragment>{allModals}</React.Fragment>\n})\n","import { useEffect, useCallback, useRef, useMemo } from 'react'\nimport { TagType } from './tag'\nimport { useModalStore, useModalActions, store } from '../store'\n\nexport type Any = string | number | boolean | object | undefined | Record<string, any>\n\nexport interface DisclosureHookProps<O> {\n tag: TagType\n isOpen?: boolean\n onOpen?: () => void\n onClose?: () => void\n onToggle?: () => void\n onChange?: (isOpen: boolean) => void\n onOk?: (output?: O) => void\n onCancel?: () => void\n}\n\nexport const useDisclosure = <Input = Any, Output = Any>(\n disclosureHook: DisclosureHookProps<Output>\n) => {\n const tag = disclosureHook.tag\n\n // Use refs to store callbacks to avoid stale closures\n const disclosureHookRef = useRef(disclosureHook)\n disclosureHookRef.current = disclosureHook\n\n // ⚡ Selective Subscription: Memoize selectors để TanStack Store\n // chỉ trigger re-render khi state của MODAL NÀY thay đổi\n // Không re-render khi modal khác thay đổi state\n const inputSelector = useMemo(\n () => (state: { modalTags: Record<string, { input?: Any; output?: Any }> }) =>\n state.modalTags[tag]?.input,\n [tag]\n )\n\n const outputSelector = useMemo(\n () => (state: { modalTags: Record<string, { input?: Any; output?: Any }> }) =>\n state.modalTags[tag]?.output,\n [tag]\n )\n\n const inputState = useModalStore(inputSelector) as Input\n const outputState = useModalStore(outputSelector) as Output\n const clearDisclosureTag = useModalActions(\n (actions) => actions.clearModalTag\n )\n\n const onOpenAction = useModalActions((actions) => actions.openModal)\n const okAction = useModalActions((actions) => actions.okModal)\n const onCloseAction = useModalActions((actions) => actions.closeModal)\n const onToggleAction = useModalActions((actions) => actions.toggleModal)\n\n const updateInput = useCallback((input?: Input) => {\n // If input is a function, call it and set the result as input\n let processedInput = input\n if (processedInput && typeof processedInput == 'object' && 'preventDefault' in processedInput) {\n processedInput = undefined\n }\n onOpenAction(tag, processedInput as Any)\n }, [tag, onOpenAction])\n\n const onOpen = useCallback((input?: Input) => {\n updateInput(input)\n disclosureHookRef.current?.onOpen?.()\n }, [updateInput])\n\n const onClose = useCallback(() => {\n onCloseAction(tag)\n disclosureHookRef.current?.onClose?.()\n }, [tag, onCloseAction])\n\n const onToggle = useCallback(() => {\n onToggleAction(tag)\n disclosureHookRef.current?.onToggle?.()\n }, [tag, onToggleAction])\n\n const onOk = useCallback((output?: Output) => {\n disclosureHookRef.current?.onOk?.(output)\n okAction(tag, output as Any)\n }, [tag, okAction])\n\n const onChange = useCallback((isOpen: boolean) => {\n if (isOpen) {\n onOpen()\n } else {\n onClose()\n }\n disclosureHookRef.current?.onChange?.(isOpen)\n }, [onOpen, onClose])\n\n useEffect(() => {\n return () => {\n clearDisclosureTag(tag)\n }\n }, [tag, clearDisclosureTag])\n\n useEffect(() => {\n if (outputState) {\n // Use ref instead of direct callback to avoid infinite loop\n disclosureHookRef.current?.onOk?.(outputState as Output)\n }\n }, [outputState])\n\n return {\n isOpen: !!inputState,\n input: typeof inputState === 'boolean' ? undefined : inputState,\n onOpen,\n onClose,\n onToggle,\n onOk,\n onChange,\n updateInput,\n store\n }\n}\n","import * as React from 'react'\nimport { ModalWrapper } from './provider'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport type ReactHookModalProviderProps = {\n children: React.ReactNode\n modals: Record<string, ModalComponent>\n /**\n * Strategy for rendering modals:\n * - 'eager': Mount all modals upfront (default, backward compatible)\n * - 'lazy': Only mount modals that have been opened at least once\n * \n * Use 'lazy' if you have 50+ modals for better performance.\n */\n renderStrategy?: 'eager' | 'lazy'\n}\n\nexport const ReactHookModalProvider = ({\n children,\n modals,\n renderStrategy = 'eager'\n}: ReactHookModalProviderProps) => {\n return (\n <React.Fragment>\n <ModalWrapper modals={modals} renderStrategy={renderStrategy} />\n {children}\n </React.Fragment>\n )\n}\n\nexport * from './hook'\nexport * from './provider'\n"],"names":["store","Store","modalTags","openModal","tag","input","setState","state","_extends2","_extends","okModal","output","_extends3","closeModal","_extends4","undefined","toggleModal","_state$modalTags$tag","_extends5","clearModalTag","newModalTags","clearAllModalTags","useModalStore","stateCallback","useStore","useModalActions","actionCallback","ModalWrapper","memo","_ref","modals","_ref$renderStrategy","renderStrategy","allModals","useMemo","Object","keys","map","Modal","console","warn","React","key","error","entries","_ref2","Fragment","useDisclosure","disclosureHook","disclosureHookRef","useRef","current","inputSelector","outputSelector","_state$modalTags$tag2","inputState","outputState","clearDisclosureTag","actions","onOpenAction","okAction","onCloseAction","onToggleAction","updateInput","useCallback","processedInput","onOpen","_disclosureHookRef$cu","_disclosureHookRef$cu2","call","onClose","_disclosureHookRef$cu3","_disclosureHookRef$cu4","onToggle","_disclosureHookRef$cu5","_disclosureHookRef$cu6","onOk","_disclosureHookRef$cu7","_disclosureHookRef$cu8","onChange","isOpen","_disclosureHookRef$cu9","_disclosureHookRef$cu0","useEffect","_disclosureHookRef$cu1","_disclosureHookRef$cu10","ReactHookModalProvider","children"],"mappings":"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"}
@@ -39,7 +39,8 @@ var closeModal = function closeModal(tag) {
39
39
  var _extends4;
40
40
  return {
41
41
  modalTags: _extends({}, state.modalTags, (_extends4 = {}, _extends4[tag] = {
42
- input: false
42
+ input: false,
43
+ output: undefined
43
44
  }, _extends4))
44
45
  };
45
46
  });
@@ -85,38 +86,64 @@ var useModalActions = function useModalActions(actionCallback) {
85
86
  };
86
87
 
87
88
  var ModalWrapper = memo(function ModalWrapper(_ref) {
88
- var modals = _ref.modals;
89
+ var modals = _ref.modals,
90
+ _ref$renderStrategy = _ref.renderStrategy,
91
+ renderStrategy = _ref$renderStrategy === void 0 ? 'eager' : _ref$renderStrategy;
89
92
  var modalTags = useModalStore(function (state) {
90
93
  return state.modalTags;
91
94
  });
92
- var modalOpened = useMemo(function () {
93
- return Object.entries(modals).filter(function (_ref2) {
94
- var _modalTags$tag;
95
- var tag = _ref2[0];
96
- return !!((_modalTags$tag = modalTags[tag]) !== null && _modalTags$tag !== void 0 && _modalTags$tag.input);
97
- }).map(function (_ref3) {
98
- var tag = _ref3[0],
99
- Modal = _ref3[1];
100
- return React__default.createElement(Modal, {
101
- key: tag
95
+ var allModals = useMemo(function () {
96
+ if (renderStrategy === 'lazy') {
97
+ return Object.keys(modalTags).map(function (tag) {
98
+ var Modal = modals[tag];
99
+ if (!Modal) {
100
+ console.warn("[ModalWrapper] Modal \"" + tag + "\" not found in modals registry");
101
+ return null;
102
+ }
103
+ try {
104
+ return React__default.createElement(Modal, {
105
+ key: tag
106
+ });
107
+ } catch (error) {
108
+ console.error("[ModalWrapper] Error rendering modal \"" + tag + "\":", error);
109
+ return null;
110
+ }
102
111
  });
112
+ }
113
+ return Object.entries(modals).map(function (_ref2) {
114
+ var tag = _ref2[0],
115
+ Modal = _ref2[1];
116
+ try {
117
+ return React__default.createElement(Modal, {
118
+ key: tag
119
+ });
120
+ } catch (error) {
121
+ console.error("[ModalWrapper] Error rendering modal \"" + tag + "\":", error);
122
+ return null;
123
+ }
103
124
  });
104
- }, [modals, modalTags]);
105
- return React__default.createElement(React__default.Fragment, null, modalOpened);
125
+ }, [renderStrategy === 'lazy' ? modalTags : modals, modals, renderStrategy]);
126
+ return React__default.createElement(React__default.Fragment, null, allModals);
106
127
  });
107
128
 
108
129
  var useDisclosure = function useDisclosure(disclosureHook) {
109
130
  var tag = disclosureHook.tag;
110
131
  var disclosureHookRef = useRef(disclosureHook);
111
132
  disclosureHookRef.current = disclosureHook;
112
- var inputState = useModalStore(function (state) {
113
- var _state$modalTags$tag;
114
- return (_state$modalTags$tag = state.modalTags[tag]) === null || _state$modalTags$tag === void 0 ? void 0 : _state$modalTags$tag.input;
115
- });
116
- var outputState = useModalStore(function (state) {
117
- var _state$modalTags$tag2;
118
- return (_state$modalTags$tag2 = state.modalTags[tag]) === null || _state$modalTags$tag2 === void 0 ? void 0 : _state$modalTags$tag2.output;
119
- });
133
+ var inputSelector = useMemo(function () {
134
+ return function (state) {
135
+ var _state$modalTags$tag;
136
+ return (_state$modalTags$tag = state.modalTags[tag]) === null || _state$modalTags$tag === void 0 ? void 0 : _state$modalTags$tag.input;
137
+ };
138
+ }, [tag]);
139
+ var outputSelector = useMemo(function () {
140
+ return function (state) {
141
+ var _state$modalTags$tag2;
142
+ return (_state$modalTags$tag2 = state.modalTags[tag]) === null || _state$modalTags$tag2 === void 0 ? void 0 : _state$modalTags$tag2.output;
143
+ };
144
+ }, [tag]);
145
+ var inputState = useModalStore(inputSelector);
146
+ var outputState = useModalStore(outputSelector);
120
147
  var clearDisclosureTag = useModalActions(function (actions) {
121
148
  return actions.clearModalTag;
122
149
  });
@@ -175,9 +202,10 @@ var useDisclosure = function useDisclosure(disclosureHook) {
175
202
  }, [tag, clearDisclosureTag]);
176
203
  useEffect(function () {
177
204
  if (outputState) {
178
- onOk(outputState);
205
+ var _disclosureHookRef$cu1, _disclosureHookRef$cu10;
206
+ (_disclosureHookRef$cu1 = disclosureHookRef.current) === null || _disclosureHookRef$cu1 === void 0 ? void 0 : (_disclosureHookRef$cu10 = _disclosureHookRef$cu1.onOk) === null || _disclosureHookRef$cu10 === void 0 ? void 0 : _disclosureHookRef$cu10.call(_disclosureHookRef$cu1, outputState);
179
207
  }
180
- }, [outputState, onOk]);
208
+ }, [outputState]);
181
209
  return {
182
210
  isOpen: !!inputState,
183
211
  input: typeof inputState === 'boolean' ? undefined : inputState,
@@ -193,9 +221,12 @@ var useDisclosure = function useDisclosure(disclosureHook) {
193
221
 
194
222
  var ReactHookModalProvider = function ReactHookModalProvider(_ref) {
195
223
  var children = _ref.children,
196
- modals = _ref.modals;
224
+ modals = _ref.modals,
225
+ _ref$renderStrategy = _ref.renderStrategy,
226
+ renderStrategy = _ref$renderStrategy === void 0 ? 'eager' : _ref$renderStrategy;
197
227
  return createElement(Fragment, null, createElement(ModalWrapper, {
198
- modals: modals
228
+ modals: modals,
229
+ renderStrategy: renderStrategy
199
230
  }), children);
200
231
  };
201
232
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.modern.js","sources":["../src/store/index.ts","../src/provider/index.tsx","../src/hook/index.ts","../src/index.tsx"],"sourcesContent":["import { Store, useStore } from \"@tanstack/react-store\";\n\n// You can instantiate the store outside of React components too!\n\nimport { Any } from '../hook'\n\nexport type State = {\n modalTags: {\n [tag: string]: {\n input?: Any\n output?: Any\n }\n }\n}\n\nexport type Action = {\n openModal: (tag: string, input?: Any) => void\n okModal: (tag: string, output?: Any) => void\n closeModal: (tag: string) => void\n toggleModal: (tag: string) => void\n clearModalTag: (tag: string) => void\n clearAllModalTags: () => void\n}\nexport const store = new Store<State>({\n modalTags: {}\n});\n\n\nconst openModal = (tag: string, input?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: input ?? true // Default to true if no input is provided\n }\n }\n }))\n}\nconst okModal = (tag: string, output?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n output\n }\n }\n }))\n}\nconst closeModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: { input: false }\n }\n }))\n}\nconst toggleModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: !state.modalTags[tag]?.input\n }\n }\n }))\n}\nconst clearModalTag = (tag: string) => {\n store.setState((state) => {\n const newModalTags = { ...state.modalTags };\n delete newModalTags[tag];\n return { modalTags: newModalTags };\n })\n}\nconst clearAllModalTags = () => {\n store.setState(() => ({ modalTags: {} }))\n}\n\nexport const useModalStore = <T>(\n stateCallback: (state: State) => T,\n): T => {\n return useStore(store, stateCallback)\n}\n\nexport const useModalActions = <T>(\n actionCallback: (action: Action) => T\n): T => {\n return actionCallback(\n {\n openModal,\n okModal,\n closeModal,\n toggleModal,\n clearModalTag,\n clearAllModalTags\n }\n )\n}","import React, { useMemo, memo } from 'react'\nimport { useModalStore, State } from '../store'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport interface ModalWrapperProps {\n modals: Record<string, ModalComponent>\n}\n\nexport const ModalWrapper = memo(function ModalWrapper({\n modals\n}: ModalWrapperProps) {\n const modalTags = useModalStore((state: State) => state.modalTags)\n \n const modalOpened = useMemo(() => {\n return Object.entries(modals)\n .filter(([tag]) => !!modalTags[tag]?.input)\n .map(([tag, Modal]) => <Modal key={tag} />)\n }, [modals, modalTags])\n \n return <React.Fragment>{modalOpened}</React.Fragment>\n})\n","import { useEffect, useCallback, useRef } from 'react'\nimport { TagType } from './tag'\nimport { useModalStore, useModalActions, store } from '../store'\n\nexport type Any = string | number | boolean | object | undefined | Record<string, any>\n\nexport interface DisclosureHookProps<O> {\n tag: TagType\n isOpen?: boolean\n onOpen?: () => void\n onClose?: () => void\n onToggle?: () => void\n onChange?: (isOpen: boolean) => void\n onOk?: (output?: O) => void\n onCancel?: () => void\n}\n\nexport const useDisclosure = <Input = Any, Output = Any>(\n disclosureHook: DisclosureHookProps<Output>\n) => {\n const tag = disclosureHook.tag\n \n // Use refs to store callbacks to avoid stale closures\n const disclosureHookRef = useRef(disclosureHook)\n disclosureHookRef.current = disclosureHook\n\n const inputState = useModalStore(\n (state) => state.modalTags[tag]?.input\n ) as Input\n const outputState = useModalStore(\n (state) => state.modalTags[tag]?.output\n ) as Output\n const clearDisclosureTag = useModalActions(\n (actions) => actions.clearModalTag\n )\n\n const onOpenAction = useModalActions((actions) => actions.openModal)\n const okAction = useModalActions((actions) => actions.okModal)\n const onCloseAction = useModalActions((actions) => actions.closeModal)\n const onToggleAction = useModalActions((actions) => actions.toggleModal)\n\n const updateInput = useCallback((input?: Input) => {\n // If input is a function, call it and set the result as input\n let processedInput = input\n if (processedInput && typeof processedInput == 'object' && 'preventDefault' in processedInput) {\n processedInput = undefined\n }\n onOpenAction(tag, processedInput as Any)\n }, [tag, onOpenAction])\n\n const onOpen = useCallback((input?: Input) => {\n updateInput(input)\n disclosureHookRef.current?.onOpen?.()\n }, [updateInput])\n\n const onClose = useCallback(() => {\n onCloseAction(tag)\n disclosureHookRef.current?.onClose?.()\n }, [tag, onCloseAction])\n\n const onToggle = useCallback(() => {\n onToggleAction(tag)\n disclosureHookRef.current?.onToggle?.()\n }, [tag, onToggleAction])\n\n const onOk = useCallback((output?: Output) => {\n disclosureHookRef.current?.onOk?.(output)\n okAction(tag, output as Any)\n }, [tag, okAction])\n\n const onChange = useCallback((isOpen: boolean) => {\n if (isOpen) {\n onOpen()\n } else {\n onClose()\n }\n disclosureHookRef.current?.onChange?.(isOpen)\n }, [onOpen, onClose])\n\n useEffect(() => {\n return () => {\n clearDisclosureTag(tag)\n }\n }, [tag, clearDisclosureTag])\n\n useEffect(() => {\n if (outputState) {\n onOk(outputState as Output)\n }\n }, [outputState, onOk])\n\n return {\n isOpen: !!inputState,\n input: typeof inputState === 'boolean' ? undefined : inputState,\n onOpen,\n onClose,\n onToggle,\n onOk,\n onChange,\n updateInput,\n store\n }\n}\n","import * as React from 'react'\nimport { ModalWrapper } from './provider'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport type ReactHookModalProviderProps = {\n children: React.ReactNode\n modals: Record<string, ModalComponent>\n}\n\nexport const ReactHookModalProvider = ({\n children,\n modals\n}: ReactHookModalProviderProps) => {\n return (\n <React.Fragment>\n <ModalWrapper modals={modals} />\n {children}\n </React.Fragment>\n )\n}\n\nexport * from './hook'\nexport * from './provider'\n"],"names":["store","Store","modalTags","openModal","tag","input","setState","state","_extends2","_extends","okModal","output","_extends3","closeModal","_extends4","toggleModal","_state$modalTags$tag","_extends5","clearModalTag","newModalTags","clearAllModalTags","useModalStore","stateCallback","useStore","useModalActions","actionCallback","ModalWrapper","memo","_ref","modals","modalOpened","useMemo","Object","entries","filter","_ref2","_modalTags$tag","map","_ref3","Modal","React","key","Fragment","useDisclosure","disclosureHook","disclosureHookRef","useRef","current","inputState","outputState","_state$modalTags$tag2","clearDisclosureTag","actions","onOpenAction","okAction","onCloseAction","onToggleAction","updateInput","useCallback","processedInput","undefined","onOpen","_disclosureHookRef$cu","_disclosureHookRef$cu2","call","onClose","_disclosureHookRef$cu3","_disclosureHookRef$cu4","onToggle","_disclosureHookRef$cu5","_disclosureHookRef$cu6","onOk","_disclosureHookRef$cu7","_disclosureHookRef$cu8","onChange","isOpen","_disclosureHookRef$cu9","_disclosureHookRef$cu0","useEffect","ReactHookModalProvider","children"],"mappings":"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"}
1
+ {"version":3,"file":"index.modern.js","sources":["../src/store/index.ts","../src/provider/index.tsx","../src/hook/index.ts","../src/index.tsx"],"sourcesContent":["import { Store, useStore } from \"@tanstack/react-store\";\n\n// You can instantiate the store outside of React components too!\n\nimport { Any } from '../hook'\n\nexport type State = {\n modalTags: {\n [tag: string]: {\n input?: Any\n output?: Any\n }\n }\n}\n\nexport type Action = {\n openModal: (tag: string, input?: Any) => void\n okModal: (tag: string, output?: Any) => void\n closeModal: (tag: string) => void\n toggleModal: (tag: string) => void\n clearModalTag: (tag: string) => void\n clearAllModalTags: () => void\n}\nexport const store = new Store<State>({\n modalTags: {}\n});\n\n\nconst openModal = (tag: string, input?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: input ?? true // Default to true if no input is provided\n }\n }\n }))\n}\nconst okModal = (tag: string, output?: Any) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n output\n }\n }\n }))\n}\nconst closeModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: { input: false, output: undefined }\n }\n }))\n}\nconst toggleModal = (tag: string) => {\n store.setState((state) => ({\n modalTags: {\n ...state.modalTags,\n [tag]: {\n ...state.modalTags[tag],\n input: !state.modalTags[tag]?.input\n }\n }\n }))\n}\nconst clearModalTag = (tag: string) => {\n store.setState((state) => {\n const newModalTags = { ...state.modalTags };\n delete newModalTags[tag];\n return { modalTags: newModalTags };\n })\n}\nconst clearAllModalTags = () => {\n store.setState(() => ({ modalTags: {} }))\n}\n\nexport const useModalStore = <T>(\n stateCallback: (state: State) => T,\n): T => {\n return useStore(store, stateCallback)\n}\n\nexport const useModalActions = <T>(\n actionCallback: (action: Action) => T\n): T => {\n return actionCallback(\n {\n openModal,\n okModal,\n closeModal,\n toggleModal,\n clearModalTag,\n clearAllModalTags\n }\n )\n}","import React, { useMemo, memo } from 'react'\nimport { useModalStore, State } from '../store'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport interface ModalWrapperProps {\n modals: Record<string, ModalComponent>\n /**\n * Strategy for rendering modals:\n * - 'eager': Mount all modals upfront (default, backward compatible)\n * - 'lazy': Only mount modals that have been opened at least once\n * \n * Performance comparison:\n * - 10 modals: Both strategies are fine\n * - 50 modals: Lazy recommended (~200ms faster initial render)\n * - 100+ modals: Lazy strongly recommended (~500ms+ faster initial render)\n * - 1000 modals: Lazy is mandatory (~10s faster initial render, ~100MB less memory)\n * \n * Trade-off: With lazy mode, first modal open has ~50-100ms delay for mounting.\n */\n renderStrategy?: 'eager' | 'lazy'\n}\n\nexport const ModalWrapper = memo(function ModalWrapper({\n modals,\n renderStrategy = 'eager'\n}: ModalWrapperProps) {\n const modalTags = useModalStore((state: State) => state.modalTags)\n\n const allModals = useMemo(() => {\n if (renderStrategy === 'lazy') {\n // LAZY MODE: Chỉ render modals đã được mở ít nhất 1 lần\n // Significantly faster for apps with many modals!\n return Object.keys(modalTags).map((tag) => {\n const Modal = modals[tag]\n if (!Modal) {\n console.warn(`[ModalWrapper] Modal \"${tag}\" not found in modals registry`)\n return null\n }\n\n try {\n return <Modal key={tag} />\n } catch (error) {\n console.error(`[ModalWrapper] Error rendering modal \"${tag}\":`, error)\n return null\n }\n })\n }\n\n // EAGER MODE: Render tất cả modals ngay từ đầu (backward compatible)\n // Modal components tự control hiển thị qua isOpen prop\n return Object.entries(modals).map(([tag, Modal]) => {\n try {\n return <Modal key={tag} />\n } catch (error) {\n console.error(`[ModalWrapper] Error rendering modal \"${tag}\":`, error)\n return null\n }\n })\n }, [renderStrategy === 'lazy' ? modalTags : modals, modals, renderStrategy])\n\n return <React.Fragment>{allModals}</React.Fragment>\n})\n","import { useEffect, useCallback, useRef, useMemo } from 'react'\nimport { TagType } from './tag'\nimport { useModalStore, useModalActions, store } from '../store'\n\nexport type Any = string | number | boolean | object | undefined | Record<string, any>\n\nexport interface DisclosureHookProps<O> {\n tag: TagType\n isOpen?: boolean\n onOpen?: () => void\n onClose?: () => void\n onToggle?: () => void\n onChange?: (isOpen: boolean) => void\n onOk?: (output?: O) => void\n onCancel?: () => void\n}\n\nexport const useDisclosure = <Input = Any, Output = Any>(\n disclosureHook: DisclosureHookProps<Output>\n) => {\n const tag = disclosureHook.tag\n\n // Use refs to store callbacks to avoid stale closures\n const disclosureHookRef = useRef(disclosureHook)\n disclosureHookRef.current = disclosureHook\n\n // ⚡ Selective Subscription: Memoize selectors để TanStack Store\n // chỉ trigger re-render khi state của MODAL NÀY thay đổi\n // Không re-render khi modal khác thay đổi state\n const inputSelector = useMemo(\n () => (state: { modalTags: Record<string, { input?: Any; output?: Any }> }) =>\n state.modalTags[tag]?.input,\n [tag]\n )\n\n const outputSelector = useMemo(\n () => (state: { modalTags: Record<string, { input?: Any; output?: Any }> }) =>\n state.modalTags[tag]?.output,\n [tag]\n )\n\n const inputState = useModalStore(inputSelector) as Input\n const outputState = useModalStore(outputSelector) as Output\n const clearDisclosureTag = useModalActions(\n (actions) => actions.clearModalTag\n )\n\n const onOpenAction = useModalActions((actions) => actions.openModal)\n const okAction = useModalActions((actions) => actions.okModal)\n const onCloseAction = useModalActions((actions) => actions.closeModal)\n const onToggleAction = useModalActions((actions) => actions.toggleModal)\n\n const updateInput = useCallback((input?: Input) => {\n // If input is a function, call it and set the result as input\n let processedInput = input\n if (processedInput && typeof processedInput == 'object' && 'preventDefault' in processedInput) {\n processedInput = undefined\n }\n onOpenAction(tag, processedInput as Any)\n }, [tag, onOpenAction])\n\n const onOpen = useCallback((input?: Input) => {\n updateInput(input)\n disclosureHookRef.current?.onOpen?.()\n }, [updateInput])\n\n const onClose = useCallback(() => {\n onCloseAction(tag)\n disclosureHookRef.current?.onClose?.()\n }, [tag, onCloseAction])\n\n const onToggle = useCallback(() => {\n onToggleAction(tag)\n disclosureHookRef.current?.onToggle?.()\n }, [tag, onToggleAction])\n\n const onOk = useCallback((output?: Output) => {\n disclosureHookRef.current?.onOk?.(output)\n okAction(tag, output as Any)\n }, [tag, okAction])\n\n const onChange = useCallback((isOpen: boolean) => {\n if (isOpen) {\n onOpen()\n } else {\n onClose()\n }\n disclosureHookRef.current?.onChange?.(isOpen)\n }, [onOpen, onClose])\n\n useEffect(() => {\n return () => {\n clearDisclosureTag(tag)\n }\n }, [tag, clearDisclosureTag])\n\n useEffect(() => {\n if (outputState) {\n // Use ref instead of direct callback to avoid infinite loop\n disclosureHookRef.current?.onOk?.(outputState as Output)\n }\n }, [outputState])\n\n return {\n isOpen: !!inputState,\n input: typeof inputState === 'boolean' ? undefined : inputState,\n onOpen,\n onClose,\n onToggle,\n onOk,\n onChange,\n updateInput,\n store\n }\n}\n","import * as React from 'react'\nimport { ModalWrapper } from './provider'\n\ntype ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>\n\nexport type ReactHookModalProviderProps = {\n children: React.ReactNode\n modals: Record<string, ModalComponent>\n /**\n * Strategy for rendering modals:\n * - 'eager': Mount all modals upfront (default, backward compatible)\n * - 'lazy': Only mount modals that have been opened at least once\n * \n * Use 'lazy' if you have 50+ modals for better performance.\n */\n renderStrategy?: 'eager' | 'lazy'\n}\n\nexport const ReactHookModalProvider = ({\n children,\n modals,\n renderStrategy = 'eager'\n}: ReactHookModalProviderProps) => {\n return (\n <React.Fragment>\n <ModalWrapper modals={modals} renderStrategy={renderStrategy} />\n {children}\n </React.Fragment>\n )\n}\n\nexport * from './hook'\nexport * from './provider'\n"],"names":["store","Store","modalTags","openModal","tag","input","setState","state","_extends2","_extends","okModal","output","_extends3","closeModal","_extends4","undefined","toggleModal","_state$modalTags$tag","_extends5","clearModalTag","newModalTags","clearAllModalTags","useModalStore","stateCallback","useStore","useModalActions","actionCallback","ModalWrapper","memo","_ref","modals","_ref$renderStrategy","renderStrategy","allModals","useMemo","Object","keys","map","Modal","console","warn","React","key","error","entries","_ref2","Fragment","useDisclosure","disclosureHook","disclosureHookRef","useRef","current","inputSelector","outputSelector","_state$modalTags$tag2","inputState","outputState","clearDisclosureTag","actions","onOpenAction","okAction","onCloseAction","onToggleAction","updateInput","useCallback","processedInput","onOpen","_disclosureHookRef$cu","_disclosureHookRef$cu2","call","onClose","_disclosureHookRef$cu3","_disclosureHookRef$cu4","onToggle","_disclosureHookRef$cu5","_disclosureHookRef$cu6","onOk","_disclosureHookRef$cu7","_disclosureHookRef$cu8","onChange","isOpen","_disclosureHookRef$cu9","_disclosureHookRef$cu0","useEffect","_disclosureHookRef$cu1","_disclosureHookRef$cu10","ReactHookModalProvider","children"],"mappings":"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"}
@@ -2,6 +2,20 @@ import React from 'react';
2
2
  declare type ModalComponent = React.FunctionComponent<any> | React.ComponentType<any>;
3
3
  export interface ModalWrapperProps {
4
4
  modals: Record<string, ModalComponent>;
5
+ /**
6
+ * Strategy for rendering modals:
7
+ * - 'eager': Mount all modals upfront (default, backward compatible)
8
+ * - 'lazy': Only mount modals that have been opened at least once
9
+ *
10
+ * Performance comparison:
11
+ * - 10 modals: Both strategies are fine
12
+ * - 50 modals: Lazy recommended (~200ms faster initial render)
13
+ * - 100+ modals: Lazy strongly recommended (~500ms+ faster initial render)
14
+ * - 1000 modals: Lazy is mandatory (~10s faster initial render, ~100MB less memory)
15
+ *
16
+ * Trade-off: With lazy mode, first modal open has ~50-100ms delay for mounting.
17
+ */
18
+ renderStrategy?: 'eager' | 'lazy';
5
19
  }
6
20
  export declare const ModalWrapper: React.NamedExoticComponent<ModalWrapperProps>;
7
21
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/provider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAA;AAG5C,aAAK,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAE7E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;CACvC;AAED,eAAO,MAAM,YAAY,+CAYvB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/provider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAA;AAG5C,aAAK,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAE7E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACtC;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAClC;AAED,eAAO,MAAM,YAAY,+CAuCvB,CAAA"}
@@ -0,0 +1,21 @@
1
+ export declare type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
2
+ export interface LoggerConfig {
3
+ enabled: boolean;
4
+ level: LogLevel;
5
+ prefix: string;
6
+ }
7
+ export declare const logger: {
8
+ configure: (newConfig: Partial<LoggerConfig>) => void;
9
+ getConfig: () => {
10
+ enabled: boolean;
11
+ level: LogLevel;
12
+ prefix: string;
13
+ };
14
+ debug: (message: string, ...args: any[]) => void;
15
+ info: (message: string, ...args: any[]) => void;
16
+ warn: (message: string, ...args: any[]) => void;
17
+ error: (message: string, ...args: any[]) => void;
18
+ group: (label: string) => void;
19
+ groupEnd: () => void;
20
+ };
21
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/utils/logger.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAEnE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAuBD,eAAO,MAAM,MAAM;2BACM,OAAO,CAAC,YAAY,CAAC;;iBA3BnC,OAAO;eACT,QAAQ;gBACP,MAAM;;qBA+BG,MAAM,WAAW,GAAG,EAAE;oBAMvB,MAAM,WAAW,GAAG,EAAE;oBAMtB,MAAM,WAAW,GAAG,EAAE;qBAMrB,MAAM,WAAW,GAAG,EAAE;mBAMxB,MAAM;;CAWtB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helloworldqq/react-modal",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "React hook disclosure modal - A powerful and flexible React hook library for managing modals",
5
5
  "author": "helloworldqq",
6
6
  "license": "MIT",
@@ -48,6 +48,9 @@
48
48
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
49
49
  },
50
50
  "devDependencies": {
51
+ "@babel/core": "^7.28.5",
52
+ "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
53
+ "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
51
54
  "@testing-library/jest-dom": "^6.4.2",
52
55
  "@testing-library/react": "^14.2.1",
53
56
  "@testing-library/user-event": "^14.5.2",
@@ -79,4 +82,4 @@
79
82
  "@tanstack/react-store": "^0.7.3"
80
83
  },
81
84
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
82
- }
85
+ }