@helloworldqq/react-modal 1.0.3 → 1.1.0
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.
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -52
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +33 -52
- package/dist/index.modern.js.map +1 -1
- package/dist/provider/index.d.ts +3 -3
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/package.json +4 -3
package/dist/index.d.ts
CHANGED
|
@@ -3,13 +3,6 @@ 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
6
|
renderStrategy?: 'eager' | 'lazy';
|
|
14
7
|
};
|
|
15
8
|
export declare const ReactHookModalProvider: ({ children, modals, renderStrategy }: ReactHookModalProviderProps) => React.JSX.Element;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;IACtC
|
|
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,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
|
@@ -3,69 +3,50 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var React__default = _interopDefault(React);
|
|
5
5
|
var reactStore = require('@tanstack/react-store');
|
|
6
|
-
|
|
7
|
-
function _extends() {
|
|
8
|
-
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
9
|
-
for (var e = 1; e < arguments.length; e++) {
|
|
10
|
-
var t = arguments[e];
|
|
11
|
-
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
12
|
-
}
|
|
13
|
-
return n;
|
|
14
|
-
}, _extends.apply(null, arguments);
|
|
15
|
-
}
|
|
6
|
+
var immer = require('immer');
|
|
16
7
|
|
|
17
8
|
var store = new reactStore.Store({
|
|
18
9
|
modalTags: {}
|
|
19
10
|
});
|
|
20
11
|
var openModal = function openModal(tag, input) {
|
|
21
|
-
store.setState(function (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
};
|
|
28
|
-
});
|
|
12
|
+
store.setState(immer.produce(function (draft) {
|
|
13
|
+
if (!draft.modalTags[tag]) {
|
|
14
|
+
draft.modalTags[tag] = {};
|
|
15
|
+
}
|
|
16
|
+
draft.modalTags[tag].input = input != null ? input : true;
|
|
17
|
+
}));
|
|
29
18
|
};
|
|
30
19
|
var okModal = function okModal(tag, output) {
|
|
31
|
-
store.setState(function (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
};
|
|
38
|
-
});
|
|
20
|
+
store.setState(immer.produce(function (draft) {
|
|
21
|
+
if (!draft.modalTags[tag]) {
|
|
22
|
+
draft.modalTags[tag] = {};
|
|
23
|
+
}
|
|
24
|
+
draft.modalTags[tag].output = output;
|
|
25
|
+
}));
|
|
39
26
|
};
|
|
40
27
|
var closeModal = function closeModal(tag) {
|
|
41
|
-
store.setState(function (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
input: false,
|
|
46
|
-
output: undefined
|
|
47
|
-
}, _extends4))
|
|
28
|
+
store.setState(immer.produce(function (draft) {
|
|
29
|
+
draft.modalTags[tag] = {
|
|
30
|
+
input: false,
|
|
31
|
+
output: undefined
|
|
48
32
|
};
|
|
49
|
-
});
|
|
33
|
+
}));
|
|
50
34
|
};
|
|
51
35
|
var toggleModal = function toggleModal(tag) {
|
|
52
|
-
store.setState(function (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
36
|
+
store.setState(immer.produce(function (draft) {
|
|
37
|
+
if (!draft.modalTags[tag]) {
|
|
38
|
+
draft.modalTags[tag] = {
|
|
39
|
+
input: true
|
|
40
|
+
};
|
|
41
|
+
} else {
|
|
42
|
+
draft.modalTags[tag].input = !draft.modalTags[tag].input;
|
|
43
|
+
}
|
|
44
|
+
}));
|
|
60
45
|
};
|
|
61
46
|
var clearModalTag = function clearModalTag(tag) {
|
|
62
|
-
store.setState(function (
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return {
|
|
66
|
-
modalTags: newModalTags
|
|
67
|
-
};
|
|
68
|
-
});
|
|
47
|
+
store.setState(immer.produce(function (draft) {
|
|
48
|
+
delete draft.modalTags[tag];
|
|
49
|
+
}));
|
|
69
50
|
};
|
|
70
51
|
var clearAllModalTags = function clearAllModalTags() {
|
|
71
52
|
store.setState(function () {
|
|
@@ -91,7 +72,7 @@ var useModalActions = function useModalActions(actionCallback) {
|
|
|
91
72
|
var ModalWrapper = React.memo(function ModalWrapper(_ref) {
|
|
92
73
|
var modals = _ref.modals,
|
|
93
74
|
_ref$renderStrategy = _ref.renderStrategy,
|
|
94
|
-
renderStrategy = _ref$renderStrategy === void 0 ? '
|
|
75
|
+
renderStrategy = _ref$renderStrategy === void 0 ? 'lazy' : _ref$renderStrategy;
|
|
95
76
|
var modalTags = useModalStore(function (state) {
|
|
96
77
|
return state.modalTags;
|
|
97
78
|
});
|
|
@@ -125,7 +106,7 @@ var ModalWrapper = React.memo(function ModalWrapper(_ref) {
|
|
|
125
106
|
return null;
|
|
126
107
|
}
|
|
127
108
|
});
|
|
128
|
-
}, [renderStrategy
|
|
109
|
+
}, [renderStrategy, modalTags, modals]);
|
|
129
110
|
return React__default.createElement(React__default.Fragment, null, allModals);
|
|
130
111
|
});
|
|
131
112
|
|
|
@@ -226,7 +207,7 @@ var ReactHookModalProvider = function ReactHookModalProvider(_ref) {
|
|
|
226
207
|
var children = _ref.children,
|
|
227
208
|
modals = _ref.modals,
|
|
228
209
|
_ref$renderStrategy = _ref.renderStrategy,
|
|
229
|
-
renderStrategy = _ref$renderStrategy === void 0 ? '
|
|
210
|
+
renderStrategy = _ref$renderStrategy === void 0 ? 'lazy' : _ref$renderStrategy;
|
|
230
211
|
return React.createElement(React.Fragment, null, React.createElement(ModalWrapper, {
|
|
231
212
|
modals: modals,
|
|
232
213
|
renderStrategy: renderStrategy
|
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, 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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"}
|
|
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\";\nimport { produce } from \"immer\";\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}\n\nexport const store = new Store<State>({\n modalTags: {}\n});\n\n/**\n * ⚡ Performance: Sử dụng Immer produce để tối ưu immutable updates\n * - Chỉ tạo object mới cho phần thay đổi, không copy toàn bộ modalTags\n * - O(1) thay vì O(n) khi có nhiều modals\n */\nconst openModal = (tag: string, input?: Any) => {\n store.setState(produce((draft: State) => {\n if (!draft.modalTags[tag]) {\n draft.modalTags[tag] = {}\n }\n draft.modalTags[tag].input = input ?? true\n }))\n}\n\nconst okModal = (tag: string, output?: Any) => {\n store.setState(produce((draft: State) => {\n if (!draft.modalTags[tag]) {\n draft.modalTags[tag] = {}\n }\n draft.modalTags[tag].output = output\n }))\n}\n\nconst closeModal = (tag: string) => {\n store.setState(produce((draft: State) => {\n draft.modalTags[tag] = { input: false, output: undefined }\n }))\n}\n\nconst toggleModal = (tag: string) => {\n store.setState(produce((draft: State) => {\n if (!draft.modalTags[tag]) {\n draft.modalTags[tag] = { input: true }\n } else {\n draft.modalTags[tag].input = !draft.modalTags[tag].input\n }\n }))\n}\n\nconst clearModalTag = (tag: string) => {\n store.setState(produce((draft: State) => {\n delete draft.modalTags[tag]\n }))\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 * - 'lazy': Only mount modals that have been opened at least once (default, recommended)\n * - 'eager': Mount all modals upfront (use only if you need all modals pre-mounted)\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 = 'lazy'\n}: ModalWrapperProps) {\n const modalTags = useModalStore((state: State) => state.modalTags)\n\n /**\n * ⚡ Performance optimization:\n * - Dependency array đã được chuẩn hóa để tránh behavior không mong muốn\n * - LAZY mode: Chỉ re-compute khi modalTags thay đổi (modals đã mở)\n * - EAGER mode: Chỉ re-compute khi modals registry thay đổi\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 // - 50 modals: ~200ms faster initial render\n // - 100+ modals: ~500ms+ faster initial render\n // - Trade-off: First modal open has ~50-100ms delay for mounting\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 // ⚠️ Warning: Với 100+ modals, có thể gây memory pressure\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, modalTags, modals])\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 renderStrategy?: 'eager' | 'lazy'\n}\n\nexport const ReactHookModalProvider = ({\n children,\n modals,\n renderStrategy = 'lazy'\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","produce","draft","okModal","output","closeModal","undefined","toggleModal","clearModalTag","clearAllModalTags","useModalStore","stateCallback","useStore","useModalActions","actionCallback","ModalWrapper","memo","_ref","modals","_ref$renderStrategy","renderStrategy","state","allModals","useMemo","Object","keys","map","Modal","console","warn","React","key","error","entries","_ref2","Fragment","useDisclosure","disclosureHook","disclosureHookRef","useRef","current","inputSelector","_state$modalTags$tag","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":";;;;;;;AAyBO,IAAMA,KAAK,GAAG,IAAIC,gBAAK,CAAQ;EACpCC,SAAS,EAAE;CACZ,CAAC;AAOF,IAAMC,SAAS,GAAG,SAAZA,SAASA,CAAIC,GAAW,EAAEC,KAAW;EACzCL,KAAK,CAACM,QAAQ,CAACC,aAAO,CAAC,UAACC,KAAY;IAClC,IAAI,CAACA,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,EAAE;MACzBI,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,GAAG,EAAE;;IAE3BI,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,CAACC,KAAK,GAAGA,KAAK,WAALA,KAAK,GAAI,IAAI;GAC3C,CAAC,CAAC;AACL,CAAC;AAED,IAAMI,OAAO,GAAG,SAAVA,OAAOA,CAAIL,GAAW,EAAEM,MAAY;EACxCV,KAAK,CAACM,QAAQ,CAACC,aAAO,CAAC,UAACC,KAAY;IAClC,IAAI,CAACA,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,EAAE;MACzBI,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,GAAG,EAAE;;IAE3BI,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,CAACM,MAAM,GAAGA,MAAM;GACrC,CAAC,CAAC;AACL,CAAC;AAED,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAIP,GAAW;EAC7BJ,KAAK,CAACM,QAAQ,CAACC,aAAO,CAAC,UAACC,KAAY;IAClCA,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,GAAG;MAAEC,KAAK,EAAE,KAAK;MAAEK,MAAM,EAAEE;KAAW;GAC3D,CAAC,CAAC;AACL,CAAC;AAED,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIT,GAAW;EAC9BJ,KAAK,CAACM,QAAQ,CAACC,aAAO,CAAC,UAACC,KAAY;IAClC,IAAI,CAACA,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,EAAE;MACzBI,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,GAAG;QAAEC,KAAK,EAAE;OAAM;KACvC,MAAM;MACLG,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,CAACC,KAAK,GAAG,CAACG,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC,CAACC,KAAK;;GAE3D,CAAC,CAAC;AACL,CAAC;AAED,IAAMS,aAAa,GAAG,SAAhBA,aAAaA,CAAIV,GAAW;EAChCJ,KAAK,CAACM,QAAQ,CAACC,aAAO,CAAC,UAACC,KAAY;IAClC,OAAOA,KAAK,CAACN,SAAS,CAACE,GAAG,CAAC;GAC5B,CAAC,CAAC;AACL,CAAC;AAED,IAAMW,iBAAiB,GAAG,SAApBA,iBAAiBA;EACrBf,KAAK,CAACM,QAAQ,CAAC;IAAA,OAAO;MAAEJ,SAAS,EAAE;KAAI;GAAC,CAAC;AAC3C,CAAC;AAEM,IAAMc,aAAa,GAAG,SAAhBA,aAAaA,CACxBC,aAAkC;EAElC,OAAOC,mBAAQ,CAAClB,KAAK,EAAEiB,aAAa,CAAC;AACvC,CAAC;AAEM,IAAME,eAAe,GAAG,SAAlBA,eAAeA,CAC1BC,cAAqC;EAErC,OAAOA,cAAc,CACnB;IACEjB,SAAS,EAATA,SAAS;IACTM,OAAO,EAAPA,OAAO;IACPE,UAAU,EAAVA,UAAU;IACVE,WAAW,EAAXA,WAAW;IACXC,aAAa,EAAbA,aAAa;IACbC,iBAAiB,EAAjBA;GACD,CACF;AACH,CAAC;;IC1EYM,YAAY,GAAGC,UAAI,CAAC,SAASD,YAAYA,CAAAE,IAAA;MACpDC,MAAM,GAAAD,IAAA,CAANC,MAAM;IAAAC,mBAAA,GAAAF,IAAA,CACNG,cAAc;IAAdA,cAAc,GAAAD,mBAAA,cAAG,MAAM,GAAAA,mBAAA;EAEvB,IAAMvB,SAAS,GAAGc,aAAa,CAAC,UAACW,KAAY;IAAA,OAAKA,KAAK,CAACzB,SAAS;IAAC;EAQlE,IAAM0B,SAAS,GAAGC,aAAO,CAAC;IACxB,IAAIH,cAAc,KAAK,MAAM,EAAE;MAM7B,OAAOI,MAAM,CAACC,IAAI,CAAC7B,SAAS,CAAC,CAAC8B,GAAG,CAAC,UAAC5B,GAAG;QACpC,IAAM6B,KAAK,GAAGT,MAAM,CAACpB,GAAG,CAAC;QACzB,IAAI,CAAC6B,KAAK,EAAE;UACVC,OAAO,CAACC,IAAI,6BAA0B/B,GAAG,oCAAgC,CAAC;UAC1E,OAAO,IAAI;;QAGb,IAAI;UACF,OAAOgC,6BAACH,KAAK;YAACI,GAAG,EAAEjC;YAAO;SAC3B,CAAC,OAAOkC,KAAK,EAAE;UACdJ,OAAO,CAACI,KAAK,6CAA0ClC,GAAG,UAAMkC,KAAK,CAAC;UACtE,OAAO,IAAI;;OAEd,CAAC;;IAMJ,OAAOR,MAAM,CAACS,OAAO,CAACf,MAAM,CAAC,CAACQ,GAAG,CAAC,UAAAQ,KAAA;UAAEpC,GAAG,GAAAoC,KAAA;QAAEP,KAAK,GAAAO,KAAA;MAC5C,IAAI;QACF,OAAOJ,6BAACH,KAAK;UAACI,GAAG,EAAEjC;UAAO;OAC3B,CAAC,OAAOkC,KAAK,EAAE;QACdJ,OAAO,CAACI,KAAK,6CAA0ClC,GAAG,UAAMkC,KAAK,CAAC;QACtE,OAAO,IAAI;;KAEd,CAAC;GACH,EAAE,CAACZ,cAAc,EAAExB,SAAS,EAAEsB,MAAM,CAAC,CAAC;EAEvC,OAAOY,6BAACA,cAAK,CAACK,QAAQ,QAAEb,SAAS,CAAkB;AACrD,CAAC,CAAC;;ICvDWc,aAAa,GAAG,SAAhBA,aAAaA,CACxBC,cAA2C;EAE3C,IAAMvC,GAAG,GAAGuC,cAAc,CAACvC,GAAG;EAG9B,IAAMwC,iBAAiB,GAAGC,YAAM,CAACF,cAAc,CAAC;EAChDC,iBAAiB,CAACE,OAAO,GAAGH,cAAc;EAK1C,IAAMI,aAAa,GAAGlB,aAAO,CAC3B;IAAA,OAAM,UAACF,KAAmE;MAAA,IAAAqB,oBAAA;MAAA,QAAAA,oBAAA,GACxErB,KAAK,CAACzB,SAAS,CAACE,GAAG,CAAC,cAAA4C,oBAAA,uBAApBA,oBAAA,CAAsB3C,KAAK;;KAC7B,CAACD,GAAG,CAAC,CACN;EAED,IAAM6C,cAAc,GAAGpB,aAAO,CAC5B;IAAA,OAAM,UAACF,KAAmE;MAAA,IAAAuB,qBAAA;MAAA,QAAAA,qBAAA,GACxEvB,KAAK,CAACzB,SAAS,CAACE,GAAG,CAAC,cAAA8C,qBAAA,uBAApBA,qBAAA,CAAsBxC,MAAM;;KAC9B,CAACN,GAAG,CAAC,CACN;EAED,IAAM+C,UAAU,GAAGnC,aAAa,CAAC+B,aAAa,CAAU;EACxD,IAAMK,WAAW,GAAGpC,aAAa,CAACiC,cAAc,CAAW;EAC3D,IAAMI,kBAAkB,GAAGlC,eAAe,CACxC,UAACmC,OAAO;IAAA,OAAKA,OAAO,CAACxC,aAAa;IACnC;EAED,IAAMyC,YAAY,GAAGpC,eAAe,CAAC,UAACmC,OAAO;IAAA,OAAKA,OAAO,CAACnD,SAAS;IAAC;EACpE,IAAMqD,QAAQ,GAAGrC,eAAe,CAAC,UAACmC,OAAO;IAAA,OAAKA,OAAO,CAAC7C,OAAO;IAAC;EAC9D,IAAMgD,aAAa,GAAGtC,eAAe,CAAC,UAACmC,OAAO;IAAA,OAAKA,OAAO,CAAC3C,UAAU;IAAC;EACtE,IAAM+C,cAAc,GAAGvC,eAAe,CAAC,UAACmC,OAAO;IAAA,OAAKA,OAAO,CAACzC,WAAW;IAAC;EAExE,IAAM8C,WAAW,GAAGC,iBAAW,CAAC,UAACvD,KAAa;IAE5C,IAAIwD,cAAc,GAAGxD,KAAK;IAC1B,IAAIwD,cAAc,IAAI,OAAOA,cAAc,IAAI,QAAQ,IAAI,gBAAgB,IAAIA,cAAc,EAAE;MAC7FA,cAAc,GAAGjD,SAAS;;IAE5B2C,YAAY,CAACnD,GAAG,EAAEyD,cAAqB,CAAC;GACzC,EAAE,CAACzD,GAAG,EAAEmD,YAAY,CAAC,CAAC;EAEvB,IAAMO,MAAM,GAAGF,iBAAW,CAAC,UAACvD,KAAa;;IACvCsD,WAAW,CAACtD,KAAK,CAAC;IAClB,CAAA0D,qBAAA,GAAAnB,iBAAiB,CAACE,OAAO,cAAAiB,qBAAA,wBAAAC,sBAAA,GAAzBD,qBAAA,CAA2BD,MAAM,cAAAE,sBAAA,uBAAjCA,sBAAA,CAAAC,IAAA,CAAAF,sBAAqC;GACtC,EAAE,CAACJ,WAAW,CAAC,CAAC;EAEjB,IAAMO,OAAO,GAAGN,iBAAW,CAAC;;IAC1BH,aAAa,CAACrD,GAAG,CAAC;IAClB,CAAA+D,sBAAA,GAAAvB,iBAAiB,CAACE,OAAO,cAAAqB,sBAAA,wBAAAC,sBAAA,GAAzBD,sBAAA,CAA2BD,OAAO,cAAAE,sBAAA,uBAAlCA,sBAAA,CAAAH,IAAA,CAAAE,uBAAsC;GACvC,EAAE,CAAC/D,GAAG,EAAEqD,aAAa,CAAC,CAAC;EAExB,IAAMY,QAAQ,GAAGT,iBAAW,CAAC;;IAC3BF,cAAc,CAACtD,GAAG,CAAC;IACnB,CAAAkE,sBAAA,GAAA1B,iBAAiB,CAACE,OAAO,cAAAwB,sBAAA,wBAAAC,sBAAA,GAAzBD,sBAAA,CAA2BD,QAAQ,cAAAE,sBAAA,uBAAnCA,sBAAA,CAAAN,IAAA,CAAAK,uBAAuC;GACxC,EAAE,CAAClE,GAAG,EAAEsD,cAAc,CAAC,CAAC;EAEzB,IAAMc,IAAI,GAAGZ,iBAAW,CAAC,UAAClD,MAAe;;IACvC,CAAA+D,sBAAA,GAAA7B,iBAAiB,CAACE,OAAO,cAAA2B,sBAAA,wBAAAC,sBAAA,GAAzBD,sBAAA,CAA2BD,IAAI,cAAAE,sBAAA,uBAA/BA,sBAAA,CAAAT,IAAA,CAAAQ,sBAAA,EAAkC/D,MAAM,CAAC;IACzC8C,QAAQ,CAACpD,GAAG,EAAEM,MAAa,CAAC;GAC7B,EAAE,CAACN,GAAG,EAAEoD,QAAQ,CAAC,CAAC;EAEnB,IAAMmB,QAAQ,GAAGf,iBAAW,CAAC,UAACgB,MAAe;;IAC3C,IAAIA,MAAM,EAAE;MACVd,MAAM,EAAE;KACT,MAAM;MACLI,OAAO,EAAE;;IAEX,CAAAW,sBAAA,GAAAjC,iBAAiB,CAACE,OAAO,cAAA+B,sBAAA,wBAAAC,sBAAA,GAAzBD,sBAAA,CAA2BF,QAAQ,cAAAG,sBAAA,uBAAnCA,sBAAA,CAAAb,IAAA,CAAAY,sBAAA,EAAsCD,MAAM,CAAC;GAC9C,EAAE,CAACd,MAAM,EAAEI,OAAO,CAAC,CAAC;EAErBa,eAAS,CAAC;IACR,OAAO;MACL1B,kBAAkB,CAACjD,GAAG,CAAC;KACxB;GACF,EAAE,CAACA,GAAG,EAAEiD,kBAAkB,CAAC,CAAC;EAE7B0B,eAAS,CAAC;IACR,IAAI3B,WAAW,EAAE;MAAA,IAAA4B,sBAAA,EAAAC,uBAAA;MAEf,CAAAD,sBAAA,GAAApC,iBAAiB,CAACE,OAAO,cAAAkC,sBAAA,wBAAAC,uBAAA,GAAzBD,sBAAA,CAA2BR,IAAI,cAAAS,uBAAA,uBAA/BA,uBAAA,CAAAhB,IAAA,CAAAe,sBAAA,EAAkC5B,WAAqB,CAAC;;GAE3D,EAAE,CAACA,WAAW,CAAC,CAAC;EAEjB,OAAO;IACLwB,MAAM,EAAE,CAAC,CAACzB,UAAU;IACpB9C,KAAK,EAAE,OAAO8C,UAAU,KAAK,SAAS,GAAGvC,SAAS,GAAGuC,UAAU;IAC/DW,MAAM,EAANA,MAAM;IACNI,OAAO,EAAPA,OAAO;IACPG,QAAQ,EAARA,QAAQ;IACRG,IAAI,EAAJA,IAAI;IACJG,QAAQ,EAARA,QAAQ;IACRhB,WAAW,EAAXA,WAAW;IACX3D,KAAK,EAALA;GACD;AACH,CAAC;;ICvGYkF,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAA3D,IAAA;MACjC4D,QAAQ,GAAA5D,IAAA,CAAR4D,QAAQ;IACR3D,MAAM,GAAAD,IAAA,CAANC,MAAM;IAAAC,mBAAA,GAAAF,IAAA,CACNG,cAAc;IAAdA,cAAc,GAAAD,mBAAA,cAAG,MAAM,GAAAA,mBAAA;EAEvB,OACEW,oBAACA,cAAc,QACbA,oBAACf,YAAY;IAACG,MAAM,EAAEA,MAAM;IAAEE,cAAc,EAAEA;IAAkB,EAC/DyD,QAAQ,CACM;AAErB,CAAC;;;;;;"}
|
package/dist/index.modern.js
CHANGED
|
@@ -1,68 +1,49 @@
|
|
|
1
1
|
import React__default, { memo, useMemo, useRef, useCallback, useEffect, createElement, Fragment } from 'react';
|
|
2
2
|
import { Store, useStore } from '@tanstack/react-store';
|
|
3
|
-
|
|
4
|
-
function _extends() {
|
|
5
|
-
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
6
|
-
for (var e = 1; e < arguments.length; e++) {
|
|
7
|
-
var t = arguments[e];
|
|
8
|
-
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
9
|
-
}
|
|
10
|
-
return n;
|
|
11
|
-
}, _extends.apply(null, arguments);
|
|
12
|
-
}
|
|
3
|
+
import { produce } from 'immer';
|
|
13
4
|
|
|
14
5
|
var store = new Store({
|
|
15
6
|
modalTags: {}
|
|
16
7
|
});
|
|
17
8
|
var openModal = function openModal(tag, input) {
|
|
18
|
-
store.setState(function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
});
|
|
9
|
+
store.setState(produce(function (draft) {
|
|
10
|
+
if (!draft.modalTags[tag]) {
|
|
11
|
+
draft.modalTags[tag] = {};
|
|
12
|
+
}
|
|
13
|
+
draft.modalTags[tag].input = input != null ? input : true;
|
|
14
|
+
}));
|
|
26
15
|
};
|
|
27
16
|
var okModal = function okModal(tag, output) {
|
|
28
|
-
store.setState(function (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
35
|
-
});
|
|
17
|
+
store.setState(produce(function (draft) {
|
|
18
|
+
if (!draft.modalTags[tag]) {
|
|
19
|
+
draft.modalTags[tag] = {};
|
|
20
|
+
}
|
|
21
|
+
draft.modalTags[tag].output = output;
|
|
22
|
+
}));
|
|
36
23
|
};
|
|
37
24
|
var closeModal = function closeModal(tag) {
|
|
38
|
-
store.setState(function (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
input: false,
|
|
43
|
-
output: undefined
|
|
44
|
-
}, _extends4))
|
|
25
|
+
store.setState(produce(function (draft) {
|
|
26
|
+
draft.modalTags[tag] = {
|
|
27
|
+
input: false,
|
|
28
|
+
output: undefined
|
|
45
29
|
};
|
|
46
|
-
});
|
|
30
|
+
}));
|
|
47
31
|
};
|
|
48
32
|
var toggleModal = function toggleModal(tag) {
|
|
49
|
-
store.setState(function (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
33
|
+
store.setState(produce(function (draft) {
|
|
34
|
+
if (!draft.modalTags[tag]) {
|
|
35
|
+
draft.modalTags[tag] = {
|
|
36
|
+
input: true
|
|
37
|
+
};
|
|
38
|
+
} else {
|
|
39
|
+
draft.modalTags[tag].input = !draft.modalTags[tag].input;
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
57
42
|
};
|
|
58
43
|
var clearModalTag = function clearModalTag(tag) {
|
|
59
|
-
store.setState(function (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return {
|
|
63
|
-
modalTags: newModalTags
|
|
64
|
-
};
|
|
65
|
-
});
|
|
44
|
+
store.setState(produce(function (draft) {
|
|
45
|
+
delete draft.modalTags[tag];
|
|
46
|
+
}));
|
|
66
47
|
};
|
|
67
48
|
var clearAllModalTags = function clearAllModalTags() {
|
|
68
49
|
store.setState(function () {
|
|
@@ -88,7 +69,7 @@ var useModalActions = function useModalActions(actionCallback) {
|
|
|
88
69
|
var ModalWrapper = memo(function ModalWrapper(_ref) {
|
|
89
70
|
var modals = _ref.modals,
|
|
90
71
|
_ref$renderStrategy = _ref.renderStrategy,
|
|
91
|
-
renderStrategy = _ref$renderStrategy === void 0 ? '
|
|
72
|
+
renderStrategy = _ref$renderStrategy === void 0 ? 'lazy' : _ref$renderStrategy;
|
|
92
73
|
var modalTags = useModalStore(function (state) {
|
|
93
74
|
return state.modalTags;
|
|
94
75
|
});
|
|
@@ -122,7 +103,7 @@ var ModalWrapper = memo(function ModalWrapper(_ref) {
|
|
|
122
103
|
return null;
|
|
123
104
|
}
|
|
124
105
|
});
|
|
125
|
-
}, [renderStrategy
|
|
106
|
+
}, [renderStrategy, modalTags, modals]);
|
|
126
107
|
return React__default.createElement(React__default.Fragment, null, allModals);
|
|
127
108
|
});
|
|
128
109
|
|
|
@@ -223,7 +204,7 @@ var ReactHookModalProvider = function ReactHookModalProvider(_ref) {
|
|
|
223
204
|
var children = _ref.children,
|
|
224
205
|
modals = _ref.modals,
|
|
225
206
|
_ref$renderStrategy = _ref.renderStrategy,
|
|
226
|
-
renderStrategy = _ref$renderStrategy === void 0 ? '
|
|
207
|
+
renderStrategy = _ref$renderStrategy === void 0 ? 'lazy' : _ref$renderStrategy;
|
|
227
208
|
return createElement(Fragment, null, createElement(ModalWrapper, {
|
|
228
209
|
modals: modals,
|
|
229
210
|
renderStrategy: renderStrategy
|
package/dist/index.modern.js.map
CHANGED
|
@@ -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, 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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"}
|
|
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\";\nimport { produce } from \"immer\";\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}\n\nexport const store = new Store<State>({\n modalTags: {}\n});\n\n/**\n * ⚡ Performance: Sử dụng Immer produce để tối ưu immutable updates\n * - Chỉ tạo object mới cho phần thay đổi, không copy toàn bộ modalTags\n * - O(1) thay vì O(n) khi có nhiều modals\n */\nconst openModal = (tag: string, input?: Any) => {\n store.setState(produce((draft: State) => {\n if (!draft.modalTags[tag]) {\n draft.modalTags[tag] = {}\n }\n draft.modalTags[tag].input = input ?? true\n }))\n}\n\nconst okModal = (tag: string, output?: Any) => {\n store.setState(produce((draft: State) => {\n if (!draft.modalTags[tag]) {\n draft.modalTags[tag] = {}\n }\n draft.modalTags[tag].output = output\n }))\n}\n\nconst closeModal = (tag: string) => {\n store.setState(produce((draft: State) => {\n draft.modalTags[tag] = { input: false, output: undefined }\n }))\n}\n\nconst toggleModal = (tag: string) => {\n store.setState(produce((draft: State) => {\n if (!draft.modalTags[tag]) {\n draft.modalTags[tag] = { input: true }\n } else {\n draft.modalTags[tag].input = !draft.modalTags[tag].input\n }\n }))\n}\n\nconst clearModalTag = (tag: string) => {\n store.setState(produce((draft: State) => {\n delete draft.modalTags[tag]\n }))\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 * - 'lazy': Only mount modals that have been opened at least once (default, recommended)\n * - 'eager': Mount all modals upfront (use only if you need all modals pre-mounted)\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 = 'lazy'\n}: ModalWrapperProps) {\n const modalTags = useModalStore((state: State) => state.modalTags)\n\n /**\n * ⚡ Performance optimization:\n * - Dependency array đã được chuẩn hóa để tránh behavior không mong muốn\n * - LAZY mode: Chỉ re-compute khi modalTags thay đổi (modals đã mở)\n * - EAGER mode: Chỉ re-compute khi modals registry thay đổi\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 // - 50 modals: ~200ms faster initial render\n // - 100+ modals: ~500ms+ faster initial render\n // - Trade-off: First modal open has ~50-100ms delay for mounting\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 // ⚠️ Warning: Với 100+ modals, có thể gây memory pressure\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, modalTags, modals])\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 renderStrategy?: 'eager' | 'lazy'\n}\n\nexport const ReactHookModalProvider = ({\n children,\n modals,\n renderStrategy = 'lazy'\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","produce","draft","okModal","output","closeModal","undefined","toggleModal","clearModalTag","clearAllModalTags","useModalStore","stateCallback","useStore","useModalActions","actionCallback","ModalWrapper","memo","_ref","modals","_ref$renderStrategy","renderStrategy","state","allModals","useMemo","Object","keys","map","Modal","console","warn","React","key","error","entries","_ref2","Fragment","useDisclosure","disclosureHook","disclosureHookRef","useRef","current","inputSelector","_state$modalTags$tag","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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"}
|
package/dist/provider/index.d.ts
CHANGED
|
@@ -4,10 +4,10 @@ export interface ModalWrapperProps {
|
|
|
4
4
|
modals: Record<string, ModalComponent>;
|
|
5
5
|
/**
|
|
6
6
|
* Strategy for rendering modals:
|
|
7
|
-
* - '
|
|
8
|
-
* - '
|
|
7
|
+
* - 'lazy': Only mount modals that have been opened at least once (default, recommended)
|
|
8
|
+
* - 'eager': Mount all modals upfront (use only if you need all modals pre-mounted)
|
|
9
9
|
*
|
|
10
|
-
* Performance comparison:
|
|
10
|
+
* ⚡ Performance comparison:
|
|
11
11
|
* - 10 modals: Both strategies are fine
|
|
12
12
|
* - 50 modals: Lazy recommended (~200ms faster initial render)
|
|
13
13
|
* - 100+ modals: Lazy strongly recommended (~500ms+ faster initial render)
|
|
@@ -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;IACtC;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAClC;AAED,eAAO,MAAM,YAAY,+
|
|
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,+CAiDvB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,MAAM,uBAAuB,CAAC;AAKxD,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAE7B,oBAAY,KAAK,GAAG;IAClB,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,KAAK,CAAC,EAAE,GAAG,CAAA;YACX,MAAM,CAAC,EAAE,GAAG,CAAA;SACb,CAAA;KACF,CAAA;CACF,CAAA;AAED,oBAAY,MAAM,GAAG;IACnB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7C,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IAC5C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,iBAAiB,EAAE,MAAM,IAAI,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,KAAK,oCAEhB,CAAC;AAmDH,eAAO,MAAM,aAAa,6BACD,KAAK,YAG7B,CAAA;AAED,eAAO,MAAM,eAAe,+BACD,MAAM,YAYhC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helloworldqq/react-modal",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
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",
|
|
@@ -79,7 +79,8 @@
|
|
|
79
79
|
"dist"
|
|
80
80
|
],
|
|
81
81
|
"dependencies": {
|
|
82
|
-
"@tanstack/react-store": "^0.7.3"
|
|
82
|
+
"@tanstack/react-store": "^0.7.3",
|
|
83
|
+
"immer": "^11.1.3"
|
|
83
84
|
},
|
|
84
85
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
|
85
|
-
}
|
|
86
|
+
}
|