react-native-tree-multi-select 1.6.1 → 1.7.0-beta.2
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/README.md +1 -3
- package/lib/commonjs/TreeView.js +4 -3
- package/lib/commonjs/TreeView.js.map +1 -1
- package/lib/commonjs/helpers/flattenTree.helper.js +6 -3
- package/lib/commonjs/helpers/flattenTree.helper.js.map +1 -1
- package/lib/commonjs/utils/useDeepCompareEffect.js +40 -0
- package/lib/commonjs/utils/useDeepCompareEffect.js.map +1 -0
- package/lib/module/TreeView.js +4 -3
- package/lib/module/TreeView.js.map +1 -1
- package/lib/module/helpers/flattenTree.helper.js +6 -3
- package/lib/module/helpers/flattenTree.helper.js.map +1 -1
- package/lib/module/utils/useDeepCompareEffect.js +36 -0
- package/lib/module/utils/useDeepCompareEffect.js.map +1 -0
- package/lib/typescript/TreeView.d.ts.map +1 -1
- package/lib/typescript/helpers/flattenTree.helper.d.ts.map +1 -1
- package/lib/typescript/utils/useDeepCompareEffect.d.ts +10 -0
- package/lib/typescript/utils/useDeepCompareEffect.d.ts.map +1 -0
- package/package.json +4 -2
- package/src/TreeView.tsx +5 -3
- package/src/helpers/flattenTree.helper.ts +6 -3
- package/src/utils/useDeepCompareEffect.ts +38 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
⚡️Super-fast Tree view with multi-selection capabilities, using checkboxes and search filtering.
|
|
4
4
|
|
|
5
|
-
[](https://badge.fury.io/js/react-native-tree-multi-select) [](https://github.com/JairajJangle/react-native-tree-multi-select/blob/main/LICENSE) [](https://github.com/JairajJangle/react-native-tree-multi-select/actions/workflows/ci.yml) [](https://github.com/JairajJangle/react-native-tree-multi-select/actions/workflows/ci.yml)    [](https://github.com/JairajJangle/react-native-tree-multi-select/issues?q=is%3Aopen+is%3Aissue)  [](https://snyk.io/test/github/jairajjangle/react-native-tree-multi-select) [](https://snack.expo.dev/@futurejj/react-native-tree-multi-select-example)
|
|
5
|
+
[](https://badge.fury.io/js/react-native-tree-multi-select) [](https://github.com/JairajJangle/react-native-tree-multi-select/blob/main/LICENSE) [](https://github.com/JairajJangle/react-native-tree-multi-select/actions/workflows/ci.yml) [](https://github.com/JairajJangle/react-native-tree-multi-select/actions/workflows/ci.yml)    [](https://github.com/JairajJangle/react-native-tree-multi-select/issues?q=is%3Aopen+is%3Aissue)  [](https://snyk.io/test/github/jairajjangle/react-native-tree-multi-select) [](https://snack.expo.dev/@futurejj/react-native-tree-multi-select-example) 
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
@@ -131,8 +131,6 @@ export function TreeViewUsageExample(){
|
|
|
131
131
|
| `ExpandCollapseTouchableComponent` | `ComponentType<`[TouchableOpacityProps](https://reactnative.dev/docs/touchableopacity#props)`>` | No | A custom expand/collapse touchable component |
|
|
132
132
|
| `CustomNodeRowComponent` | `React.ComponentType<`[NodeRowProps](#noderowprops)`>` | No | Custom row item component |
|
|
133
133
|
|
|
134
|
-
ℹ️ `data` prop is not stateful! You will need to update the `key` prop to force `TreeView` to re-render.
|
|
135
|
-
|
|
136
134
|
ℹ️ If `CustomNodeRowComponent` is provided then below props are not applied:
|
|
137
135
|
|
|
138
136
|
1. `indentationMultiplier`
|
package/lib/commonjs/TreeView.js
CHANGED
|
@@ -12,6 +12,7 @@ var _treeView = require("./store/treeView.store");
|
|
|
12
12
|
var _usePreviousState = _interopRequireDefault(require("./utils/usePreviousState"));
|
|
13
13
|
var _shallow = require("zustand/react/shallow");
|
|
14
14
|
var _reactNativeUuid = _interopRequireDefault(require("react-native-uuid"));
|
|
15
|
+
var _useDeepCompareEffect = _interopRequireDefault(require("./utils/useDeepCompareEffect"));
|
|
15
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
17
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
18
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
@@ -72,7 +73,8 @@ const _TreeView = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
72
73
|
setSearchText
|
|
73
74
|
}));
|
|
74
75
|
const prevSearchText = (0, _usePreviousState.default)(searchText);
|
|
75
|
-
|
|
76
|
+
(0, _useDeepCompareEffect.default)(() => {
|
|
77
|
+
cleanUpTreeViewStore();
|
|
76
78
|
updateInitialTreeViewData(data);
|
|
77
79
|
if (selectionPropagation) setSelectionPropagation(selectionPropagation);
|
|
78
80
|
(0, _helpers.initializeNodeMaps)(storeId, data);
|
|
@@ -82,8 +84,7 @@ const _TreeView = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
82
84
|
|
|
83
85
|
// Expand pre-expanded nodes
|
|
84
86
|
(0, _helpers.expandNodes)(storeId, preExpandedIds);
|
|
85
|
-
|
|
86
|
-
}, []);
|
|
87
|
+
}, [data]);
|
|
87
88
|
function selectNodes(ids) {
|
|
88
89
|
(0, _helpers.toggleCheckboxes)(storeId, ids, true);
|
|
89
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_NodeList","_interopRequireDefault","_helpers","_treeView","_usePreviousState","_shallow","_reactNativeUuid","_jsxRuntime","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_TreeView","React","forwardRef","props","ref","data","onCheck","onExpand","selectionPropagation","preselectedIds","preExpandedIds","treeFlashListProps","checkBoxViewStyleProps","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","ExpandCollapseTouchableComponent","CustomNodeRowComponent","storeId","useMemo","uuid","v4","expanded","updateExpanded","initialTreeViewData","updateInitialTreeViewData","searchText","updateSearchText","updateSearchKeys","checked","indeterminate","setSelectionPropagation","cleanUpTreeViewStore","useTreeViewStore","useShallow","state","useImperativeHandle","selectAll","unselectAll","selectAllFiltered","unselectAllFiltered","expandAll","collapseAll","expandNodes","ids","collapseNodes","selectNodes","unselectNodes","setSearchText","prevSearchText","usePreviousState","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_NodeList","_interopRequireDefault","_helpers","_treeView","_usePreviousState","_shallow","_reactNativeUuid","_useDeepCompareEffect","_jsxRuntime","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_TreeView","React","forwardRef","props","ref","data","onCheck","onExpand","selectionPropagation","preselectedIds","preExpandedIds","treeFlashListProps","checkBoxViewStyleProps","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","ExpandCollapseTouchableComponent","CustomNodeRowComponent","storeId","useMemo","uuid","v4","expanded","updateExpanded","initialTreeViewData","updateInitialTreeViewData","searchText","updateSearchText","updateSearchKeys","checked","indeterminate","setSelectionPropagation","cleanUpTreeViewStore","useTreeViewStore","useShallow","state","useImperativeHandle","selectAll","unselectAll","selectAllFiltered","unselectAllFiltered","expandAll","collapseAll","expandNodes","ids","collapseNodes","selectNodes","unselectNodes","setSearchText","prevSearchText","usePreviousState","useDeepCompareEffect","initializeNodeMaps","toggleCheckboxes","text","keys","getIds","useCallback","node","children","length","id","flatMap","item","useEffect","Array","from","InteractionManager","runAfterInteractions","Set","jsx","TreeView","exports","memo"],"sourceRoot":"../../src","sources":["TreeView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,8 +21,9 @@ function getFlattenedTreeData(nodes, expandedIds) {
|
|
|
21
21
|
// Initialize stack with the root nodes and level 0
|
|
22
22
|
for (let i = nodes.length - 1; i >= 0; i--) {
|
|
23
23
|
const node = nodes[i];
|
|
24
|
+
/* istanbul ignore next */
|
|
24
25
|
if (node) {
|
|
25
|
-
// Ensure node is not undefined
|
|
26
|
+
// Ensure node is not undefined - redundant safety
|
|
26
27
|
stack.push({
|
|
27
28
|
node,
|
|
28
29
|
level: 0
|
|
@@ -31,7 +32,8 @@ function getFlattenedTreeData(nodes, expandedIds) {
|
|
|
31
32
|
}
|
|
32
33
|
while (stack.length > 0) {
|
|
33
34
|
const item = stack.pop();
|
|
34
|
-
|
|
35
|
+
/* istanbul ignore next */
|
|
36
|
+
if (!item) continue; // Redundant safety check
|
|
35
37
|
|
|
36
38
|
const {
|
|
37
39
|
node,
|
|
@@ -48,8 +50,9 @@ function getFlattenedTreeData(nodes, expandedIds) {
|
|
|
48
50
|
if (node.children && expandedIds.has(node.id)) {
|
|
49
51
|
for (let i = node.children.length - 1; i >= 0; i--) {
|
|
50
52
|
const childNode = node.children[i];
|
|
53
|
+
/* istanbul ignore next */
|
|
51
54
|
if (childNode) {
|
|
52
|
-
// Ensure childNode is not undefined
|
|
55
|
+
// Ensure childNode is not undefined - redundant safety
|
|
53
56
|
stack.push({
|
|
54
57
|
node: childNode,
|
|
55
58
|
level: level + 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getFlattenedTreeData","nodes","expandedIds","flattened","stack","i","length","node","push","level","item","pop","children","has","id","childNode"],"sourceRoot":"../../../src","sources":["helpers/flattenTree.helper.ts"],"mappings":";;;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,oBAAoBA,CAChCC,KAAiB,EACjBC,WAAwB,EACD;EACvB,MAAMC,SAAkC,GAAG,EAAE;EAC7C,MAAMC,KAA2C,GAAG,EAAE;;EAEtD;EACA,KAAK,IAAIC,CAAC,GAAGJ,KAAK,CAACK,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;IACxC,MAAME,IAAI,GAAGN,KAAK,CAACI,CAAC,CAAC;IACrB,IAAIE,IAAI,EAAE;MAAE;MACRH,KAAK,CAACI,IAAI,CAAC;QAAED,IAAI;QAAEE,KAAK,EAAE;MAAE,CAAC,CAAC;IAClC;EACJ;EAEA,OAAOL,KAAK,CAACE,MAAM,GAAG,CAAC,EAAE;IACrB,MAAMI,IAAI,GAAGN,KAAK,CAACO,GAAG,CAAC,CAAC;IACxB,IAAI,CAACD,IAAI,EAAE,SAAS,CAAC;;IAErB,MAAM;MAAEH,IAAI;MAAEE;IAAM,CAAC,GAAGC,IAAI;;IAE5B;IACAP,SAAS,CAACK,IAAI,CAAC;MAAE,GAAGD,IAAI;MAAEE;IAAM,CAAC,CAAC;;IAElC;IACA,IAAIF,IAAI,CAACK,QAAQ,IAAIV,WAAW,CAACW,GAAG,CAACN,IAAI,CAACO,EAAE,CAAC,EAAE;MAC3C,KAAK,IAAIT,CAAC,GAAGE,IAAI,CAACK,QAAQ,CAACN,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;QAChD,MAAMU,SAAS,GAAGR,IAAI,CAACK,QAAQ,CAACP,CAAC,CAAC;QAClC,IAAIU,SAAS,EAAE;UAAE;UACbX,KAAK,CAACI,IAAI,CAAC;YAAED,IAAI,EAAEQ,SAAS;YAAEN,KAAK,EAAEA,KAAK,GAAG;UAAE,CAAC,CAAC;QACrD;MACJ;IACJ;EACJ;EAEA,OAAON,SAAS;AACpB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["getFlattenedTreeData","nodes","expandedIds","flattened","stack","i","length","node","push","level","item","pop","children","has","id","childNode"],"sourceRoot":"../../../src","sources":["helpers/flattenTree.helper.ts"],"mappings":";;;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,oBAAoBA,CAChCC,KAAiB,EACjBC,WAAwB,EACD;EACvB,MAAMC,SAAkC,GAAG,EAAE;EAC7C,MAAMC,KAA2C,GAAG,EAAE;;EAEtD;EACA,KAAK,IAAIC,CAAC,GAAGJ,KAAK,CAACK,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;IACxC,MAAME,IAAI,GAAGN,KAAK,CAACI,CAAC,CAAC;IACrB;IACA,IAAIE,IAAI,EAAE;MAAE;MACRH,KAAK,CAACI,IAAI,CAAC;QAAED,IAAI;QAAEE,KAAK,EAAE;MAAE,CAAC,CAAC;IAClC;EACJ;EAEA,OAAOL,KAAK,CAACE,MAAM,GAAG,CAAC,EAAE;IACrB,MAAMI,IAAI,GAAGN,KAAK,CAACO,GAAG,CAAC,CAAC;IACxB;IACA,IAAI,CAACD,IAAI,EAAE,SAAS,CAAC;;IAErB,MAAM;MAAEH,IAAI;MAAEE;IAAM,CAAC,GAAGC,IAAI;;IAE5B;IACAP,SAAS,CAACK,IAAI,CAAC;MAAE,GAAGD,IAAI;MAAEE;IAAM,CAAC,CAAC;;IAElC;IACA,IAAIF,IAAI,CAACK,QAAQ,IAAIV,WAAW,CAACW,GAAG,CAACN,IAAI,CAACO,EAAE,CAAC,EAAE;MAC3C,KAAK,IAAIT,CAAC,GAAGE,IAAI,CAACK,QAAQ,CAACN,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;QAChD,MAAMU,SAAS,GAAGR,IAAI,CAACK,QAAQ,CAACP,CAAC,CAAC;QAClC;QACA,IAAIU,SAAS,EAAE;UAAE;UACbX,KAAK,CAACI,IAAI,CAAC;YAAED,IAAI,EAAEQ,SAAS;YAAEN,KAAK,EAAEA,KAAK,GAAG;UAAE,CAAC,CAAC;QACrD;MACJ;IACJ;EACJ;EAEA,OAAON,SAAS;AACpB","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = useDeepCompareEffect;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
/**
|
|
11
|
+
* Deep compare effect hook.
|
|
12
|
+
* Ensures the effect runs on the first render and whenever dependencies deeply change.
|
|
13
|
+
*
|
|
14
|
+
* @param effect The effect callback function.
|
|
15
|
+
* @param deps The dependencies array to compare deeply.
|
|
16
|
+
*/
|
|
17
|
+
function useDeepCompareEffect(effect, deps) {
|
|
18
|
+
// Ref to track if it's the first render
|
|
19
|
+
const firstRenderRef = _react.default.useRef(true);
|
|
20
|
+
|
|
21
|
+
// Memoized dependencies to avoid redundant `isEqual` checks
|
|
22
|
+
const memoizedDependencies = _react.default.useMemo(() => deps, [deps]);
|
|
23
|
+
|
|
24
|
+
// Ref to store the previous dependencies
|
|
25
|
+
const dependenciesRef = _react.default.useRef(memoizedDependencies);
|
|
26
|
+
|
|
27
|
+
// Check for dependency changes
|
|
28
|
+
const dependenciesChanged = !(0, _isEqual.default)(dependenciesRef.current, memoizedDependencies);
|
|
29
|
+
if (dependenciesChanged) {
|
|
30
|
+
dependenciesRef.current = memoizedDependencies;
|
|
31
|
+
}
|
|
32
|
+
_react.default.useEffect(() => {
|
|
33
|
+
if (firstRenderRef.current) {
|
|
34
|
+
firstRenderRef.current = false;
|
|
35
|
+
}
|
|
36
|
+
return effect();
|
|
37
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
38
|
+
}, [dependenciesChanged]); // exclude the effect function from the dependencies
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=useDeepCompareEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_isEqual","e","__esModule","default","useDeepCompareEffect","effect","deps","firstRenderRef","React","useRef","memoizedDependencies","useMemo","dependenciesRef","dependenciesChanged","isEqual","current","useEffect"],"sourceRoot":"../../../src","sources":["utils/useDeepCompareEffect.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAqC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASG,oBAAoBA,CAC1CC,MAA4B,EAC5BC,IAA0B,EAC1B;EACA;EACA,MAAMC,cAAc,GAAGC,cAAK,CAACC,MAAM,CAAU,IAAI,CAAC;;EAElD;EACA,MAAMC,oBAAoB,GAAGF,cAAK,CAACG,OAAO,CAAC,MAAML,IAAI,EAAE,CAACA,IAAI,CAAC,CAAC;;EAE9D;EACA,MAAMM,eAAe,GAAGJ,cAAK,CAACC,MAAM,CAAuBC,oBAAoB,CAAC;;EAEhF;EACA,MAAMG,mBAAmB,GAAG,CAAC,IAAAC,gBAAO,EAACF,eAAe,CAACG,OAAO,EAAEL,oBAAoB,CAAC;EACnF,IAAIG,mBAAmB,EAAE;IACvBD,eAAe,CAACG,OAAO,GAAGL,oBAAoB;EAChD;EAEAF,cAAK,CAACQ,SAAS,CAAC,MAAM;IACpB,IAAIT,cAAc,CAACQ,OAAO,EAAE;MAC1BR,cAAc,CAACQ,OAAO,GAAG,KAAK;IAChC;IAEA,OAAOV,MAAM,CAAC,CAAC;IACf;EACF,CAAC,EAAE,CAACQ,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAC7B","ignoreList":[]}
|
package/lib/module/TreeView.js
CHANGED
|
@@ -8,6 +8,7 @@ import { useTreeViewStore } from './store/treeView.store';
|
|
|
8
8
|
import usePreviousState from './utils/usePreviousState';
|
|
9
9
|
import { useShallow } from "zustand/react/shallow";
|
|
10
10
|
import uuid from "react-native-uuid";
|
|
11
|
+
import useDeepCompareEffect from "./utils/useDeepCompareEffect";
|
|
11
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
13
|
const _TreeView = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
13
14
|
const {
|
|
@@ -65,7 +66,8 @@ const _TreeView = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
65
66
|
setSearchText
|
|
66
67
|
}));
|
|
67
68
|
const prevSearchText = usePreviousState(searchText);
|
|
68
|
-
|
|
69
|
+
useDeepCompareEffect(() => {
|
|
70
|
+
cleanUpTreeViewStore();
|
|
69
71
|
updateInitialTreeViewData(data);
|
|
70
72
|
if (selectionPropagation) setSelectionPropagation(selectionPropagation);
|
|
71
73
|
initializeNodeMaps(storeId, data);
|
|
@@ -75,8 +77,7 @@ const _TreeView = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
75
77
|
|
|
76
78
|
// Expand pre-expanded nodes
|
|
77
79
|
expandNodes(storeId, preExpandedIds);
|
|
78
|
-
|
|
79
|
-
}, []);
|
|
80
|
+
}, [data]);
|
|
80
81
|
function selectNodes(ids) {
|
|
81
82
|
toggleCheckboxes(storeId, ids, true);
|
|
82
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useMemo","InteractionManager","NodeList","selectAll","selectAllFiltered","unselectAll","unselectAllFiltered","initializeNodeMaps","expandAll","collapseAll","toggleCheckboxes","expandNodes","collapseNodes","useTreeViewStore","usePreviousState","useShallow","uuid","jsx","_jsx","_TreeView","forwardRef","props","ref","data","onCheck","onExpand","selectionPropagation","preselectedIds","preExpandedIds","treeFlashListProps","checkBoxViewStyleProps","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","ExpandCollapseTouchableComponent","CustomNodeRowComponent","storeId","v4","expanded","updateExpanded","initialTreeViewData","updateInitialTreeViewData","searchText","updateSearchText","updateSearchKeys","checked","indeterminate","setSelectionPropagation","cleanUpTreeViewStore","state","useImperativeHandle","ids","selectNodes","unselectNodes","setSearchText","prevSearchText","
|
|
1
|
+
{"version":3,"names":["React","useMemo","InteractionManager","NodeList","selectAll","selectAllFiltered","unselectAll","unselectAllFiltered","initializeNodeMaps","expandAll","collapseAll","toggleCheckboxes","expandNodes","collapseNodes","useTreeViewStore","usePreviousState","useShallow","uuid","useDeepCompareEffect","jsx","_jsx","_TreeView","forwardRef","props","ref","data","onCheck","onExpand","selectionPropagation","preselectedIds","preExpandedIds","treeFlashListProps","checkBoxViewStyleProps","indentationMultiplier","CheckboxComponent","ExpandCollapseIconComponent","ExpandCollapseTouchableComponent","CustomNodeRowComponent","storeId","v4","expanded","updateExpanded","initialTreeViewData","updateInitialTreeViewData","searchText","updateSearchText","updateSearchKeys","checked","indeterminate","setSelectionPropagation","cleanUpTreeViewStore","state","useImperativeHandle","ids","selectNodes","unselectNodes","setSearchText","prevSearchText","text","keys","getIds","useCallback","node","children","length","id","flatMap","item","useEffect","Array","from","runAfterInteractions","Set","TreeView","memo"],"sourceRoot":"../../src","sources":["TreeView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,8 +17,9 @@ export function getFlattenedTreeData(nodes, expandedIds) {
|
|
|
17
17
|
// Initialize stack with the root nodes and level 0
|
|
18
18
|
for (let i = nodes.length - 1; i >= 0; i--) {
|
|
19
19
|
const node = nodes[i];
|
|
20
|
+
/* istanbul ignore next */
|
|
20
21
|
if (node) {
|
|
21
|
-
// Ensure node is not undefined
|
|
22
|
+
// Ensure node is not undefined - redundant safety
|
|
22
23
|
stack.push({
|
|
23
24
|
node,
|
|
24
25
|
level: 0
|
|
@@ -27,7 +28,8 @@ export function getFlattenedTreeData(nodes, expandedIds) {
|
|
|
27
28
|
}
|
|
28
29
|
while (stack.length > 0) {
|
|
29
30
|
const item = stack.pop();
|
|
30
|
-
|
|
31
|
+
/* istanbul ignore next */
|
|
32
|
+
if (!item) continue; // Redundant safety check
|
|
31
33
|
|
|
32
34
|
const {
|
|
33
35
|
node,
|
|
@@ -44,8 +46,9 @@ export function getFlattenedTreeData(nodes, expandedIds) {
|
|
|
44
46
|
if (node.children && expandedIds.has(node.id)) {
|
|
45
47
|
for (let i = node.children.length - 1; i >= 0; i--) {
|
|
46
48
|
const childNode = node.children[i];
|
|
49
|
+
/* istanbul ignore next */
|
|
47
50
|
if (childNode) {
|
|
48
|
-
// Ensure childNode is not undefined
|
|
51
|
+
// Ensure childNode is not undefined - redundant safety
|
|
49
52
|
stack.push({
|
|
50
53
|
node: childNode,
|
|
51
54
|
level: level + 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getFlattenedTreeData","nodes","expandedIds","flattened","stack","i","length","node","push","level","item","pop","children","has","id","childNode"],"sourceRoot":"../../../src","sources":["helpers/flattenTree.helper.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,oBAAoBA,CAChCC,KAAiB,EACjBC,WAAwB,EACD;EACvB,MAAMC,SAAkC,GAAG,EAAE;EAC7C,MAAMC,KAA2C,GAAG,EAAE;;EAEtD;EACA,KAAK,IAAIC,CAAC,GAAGJ,KAAK,CAACK,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;IACxC,MAAME,IAAI,GAAGN,KAAK,CAACI,CAAC,CAAC;IACrB,IAAIE,IAAI,EAAE;MAAE;MACRH,KAAK,CAACI,IAAI,CAAC;QAAED,IAAI;QAAEE,KAAK,EAAE;MAAE,CAAC,CAAC;IAClC;EACJ;EAEA,OAAOL,KAAK,CAACE,MAAM,GAAG,CAAC,EAAE;IACrB,MAAMI,IAAI,GAAGN,KAAK,CAACO,GAAG,CAAC,CAAC;IACxB,IAAI,CAACD,IAAI,EAAE,SAAS,CAAC;;IAErB,MAAM;MAAEH,IAAI;MAAEE;IAAM,CAAC,GAAGC,IAAI;;IAE5B;IACAP,SAAS,CAACK,IAAI,CAAC;MAAE,GAAGD,IAAI;MAAEE;IAAM,CAAC,CAAC;;IAElC;IACA,IAAIF,IAAI,CAACK,QAAQ,IAAIV,WAAW,CAACW,GAAG,CAACN,IAAI,CAACO,EAAE,CAAC,EAAE;MAC3C,KAAK,IAAIT,CAAC,GAAGE,IAAI,CAACK,QAAQ,CAACN,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;QAChD,MAAMU,SAAS,GAAGR,IAAI,CAACK,QAAQ,CAACP,CAAC,CAAC;QAClC,IAAIU,SAAS,EAAE;UAAE;UACbX,KAAK,CAACI,IAAI,CAAC;YAAED,IAAI,EAAEQ,SAAS;YAAEN,KAAK,EAAEA,KAAK,GAAG;UAAE,CAAC,CAAC;QACrD;MACJ;IACJ;EACJ;EAEA,OAAON,SAAS;AACpB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["getFlattenedTreeData","nodes","expandedIds","flattened","stack","i","length","node","push","level","item","pop","children","has","id","childNode"],"sourceRoot":"../../../src","sources":["helpers/flattenTree.helper.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,oBAAoBA,CAChCC,KAAiB,EACjBC,WAAwB,EACD;EACvB,MAAMC,SAAkC,GAAG,EAAE;EAC7C,MAAMC,KAA2C,GAAG,EAAE;;EAEtD;EACA,KAAK,IAAIC,CAAC,GAAGJ,KAAK,CAACK,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;IACxC,MAAME,IAAI,GAAGN,KAAK,CAACI,CAAC,CAAC;IACrB;IACA,IAAIE,IAAI,EAAE;MAAE;MACRH,KAAK,CAACI,IAAI,CAAC;QAAED,IAAI;QAAEE,KAAK,EAAE;MAAE,CAAC,CAAC;IAClC;EACJ;EAEA,OAAOL,KAAK,CAACE,MAAM,GAAG,CAAC,EAAE;IACrB,MAAMI,IAAI,GAAGN,KAAK,CAACO,GAAG,CAAC,CAAC;IACxB;IACA,IAAI,CAACD,IAAI,EAAE,SAAS,CAAC;;IAErB,MAAM;MAAEH,IAAI;MAAEE;IAAM,CAAC,GAAGC,IAAI;;IAE5B;IACAP,SAAS,CAACK,IAAI,CAAC;MAAE,GAAGD,IAAI;MAAEE;IAAM,CAAC,CAAC;;IAElC;IACA,IAAIF,IAAI,CAACK,QAAQ,IAAIV,WAAW,CAACW,GAAG,CAACN,IAAI,CAACO,EAAE,CAAC,EAAE;MAC3C,KAAK,IAAIT,CAAC,GAAGE,IAAI,CAACK,QAAQ,CAACN,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;QAChD,MAAMU,SAAS,GAAGR,IAAI,CAACK,QAAQ,CAACP,CAAC,CAAC;QAClC;QACA,IAAIU,SAAS,EAAE;UAAE;UACbX,KAAK,CAACI,IAAI,CAAC;YAAED,IAAI,EAAEQ,SAAS;YAAEN,KAAK,EAAEA,KAAK,GAAG;UAAE,CAAC,CAAC;QACrD;MACJ;IACJ;EACJ;EAEA,OAAON,SAAS;AACpB","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import isEqual from "lodash/isEqual";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Deep compare effect hook.
|
|
8
|
+
* Ensures the effect runs on the first render and whenever dependencies deeply change.
|
|
9
|
+
*
|
|
10
|
+
* @param effect The effect callback function.
|
|
11
|
+
* @param deps The dependencies array to compare deeply.
|
|
12
|
+
*/
|
|
13
|
+
export default function useDeepCompareEffect(effect, deps) {
|
|
14
|
+
// Ref to track if it's the first render
|
|
15
|
+
const firstRenderRef = React.useRef(true);
|
|
16
|
+
|
|
17
|
+
// Memoized dependencies to avoid redundant `isEqual` checks
|
|
18
|
+
const memoizedDependencies = React.useMemo(() => deps, [deps]);
|
|
19
|
+
|
|
20
|
+
// Ref to store the previous dependencies
|
|
21
|
+
const dependenciesRef = React.useRef(memoizedDependencies);
|
|
22
|
+
|
|
23
|
+
// Check for dependency changes
|
|
24
|
+
const dependenciesChanged = !isEqual(dependenciesRef.current, memoizedDependencies);
|
|
25
|
+
if (dependenciesChanged) {
|
|
26
|
+
dependenciesRef.current = memoizedDependencies;
|
|
27
|
+
}
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
if (firstRenderRef.current) {
|
|
30
|
+
firstRenderRef.current = false;
|
|
31
|
+
}
|
|
32
|
+
return effect();
|
|
33
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
34
|
+
}, [dependenciesChanged]); // exclude the effect function from the dependencies
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=useDeepCompareEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","isEqual","useDeepCompareEffect","effect","deps","firstRenderRef","useRef","memoizedDependencies","useMemo","dependenciesRef","dependenciesChanged","current","useEffect"],"sourceRoot":"../../../src","sources":["utils/useDeepCompareEffect.ts"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,OAAO,MAAM,gBAAgB;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,oBAAoBA,CAC1CC,MAA4B,EAC5BC,IAA0B,EAC1B;EACA;EACA,MAAMC,cAAc,GAAGL,KAAK,CAACM,MAAM,CAAU,IAAI,CAAC;;EAElD;EACA,MAAMC,oBAAoB,GAAGP,KAAK,CAACQ,OAAO,CAAC,MAAMJ,IAAI,EAAE,CAACA,IAAI,CAAC,CAAC;;EAE9D;EACA,MAAMK,eAAe,GAAGT,KAAK,CAACM,MAAM,CAAuBC,oBAAoB,CAAC;;EAEhF;EACA,MAAMG,mBAAmB,GAAG,CAACT,OAAO,CAACQ,eAAe,CAACE,OAAO,EAAEJ,oBAAoB,CAAC;EACnF,IAAIG,mBAAmB,EAAE;IACvBD,eAAe,CAACE,OAAO,GAAGJ,oBAAoB;EAChD;EAEAP,KAAK,CAACY,SAAS,CAAC,MAAM;IACpB,IAAIP,cAAc,CAACM,OAAO,EAAE;MAC1BN,cAAc,CAACM,OAAO,GAAG,KAAK;IAChC;IAEA,OAAOR,MAAM,CAAC,CAAC;IACf;EACF,CAAC,EAAE,CAACO,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAC7B","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeView.d.ts","sourceRoot":"","sources":["../../src/TreeView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAEV,aAAa,EACb,WAAW,EACZ,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"TreeView.d.ts","sourceRoot":"","sources":["../../src/TreeView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAEV,aAAa,EACb,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAyMhC,eAAO,MAAM,QAAQ,8GAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flattenTree.helper.d.ts","sourceRoot":"","sources":["../../../src/helpers/flattenTree.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE1E;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,QAAQ,EAAE,EACjB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"flattenTree.helper.d.ts","sourceRoot":"","sources":["../../../src/helpers/flattenTree.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE1E;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,QAAQ,EAAE,EACjB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,qBAAqB,EAAE,CAoCzB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Deep compare effect hook.
|
|
4
|
+
* Ensures the effect runs on the first render and whenever dependencies deeply change.
|
|
5
|
+
*
|
|
6
|
+
* @param effect The effect callback function.
|
|
7
|
+
* @param deps The dependencies array to compare deeply.
|
|
8
|
+
*/
|
|
9
|
+
export default function useDeepCompareEffect(effect: React.EffectCallback, deps: React.DependencyList): void;
|
|
10
|
+
//# sourceMappingURL=useDeepCompareEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDeepCompareEffect.d.ts","sourceRoot":"","sources":["../../../src/utils/useDeepCompareEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,MAAM,EAAE,KAAK,CAAC,cAAc,EAC5B,IAAI,EAAE,KAAK,CAAC,cAAc,QAyB3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-tree-multi-select",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0-beta.2",
|
|
4
4
|
"description": "A super-fast, customizable tree view component for React Native with multi-selection, checkboxes, and search filtering capabilities.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -95,6 +95,7 @@
|
|
|
95
95
|
"@testing-library/react-native": "^12.6.1",
|
|
96
96
|
"@types/color": "^3.0.6",
|
|
97
97
|
"@types/jest": "^29.5.3",
|
|
98
|
+
"@types/lodash": "^4.17.13",
|
|
98
99
|
"@types/react": "~17.0.21",
|
|
99
100
|
"@types/react-native": "0.70.0",
|
|
100
101
|
"@types/react-native-vector-icons": "^6.4.18",
|
|
@@ -128,7 +129,7 @@
|
|
|
128
129
|
"react-native-vector-icons": "*"
|
|
129
130
|
},
|
|
130
131
|
"engines": {
|
|
131
|
-
"node": ">=
|
|
132
|
+
"node": ">= 18.0.0"
|
|
132
133
|
},
|
|
133
134
|
"packageManager": "yarn@1.22.22",
|
|
134
135
|
"jest": {
|
|
@@ -208,6 +209,7 @@
|
|
|
208
209
|
]
|
|
209
210
|
},
|
|
210
211
|
"dependencies": {
|
|
212
|
+
"lodash": "^4.17.21",
|
|
211
213
|
"react-native-uuid": "^2.0.3",
|
|
212
214
|
"zustand": "^4.5.5"
|
|
213
215
|
},
|
package/src/TreeView.tsx
CHANGED
|
@@ -22,6 +22,7 @@ import { useTreeViewStore } from './store/treeView.store';
|
|
|
22
22
|
import usePreviousState from './utils/usePreviousState';
|
|
23
23
|
import { useShallow } from "zustand/react/shallow";
|
|
24
24
|
import uuid from "react-native-uuid";
|
|
25
|
+
import useDeepCompareEffect from "./utils/useDeepCompareEffect";
|
|
25
26
|
|
|
26
27
|
const _TreeView = React.forwardRef<TreeViewRef, TreeViewProps>(
|
|
27
28
|
(props, ref) => {
|
|
@@ -111,7 +112,9 @@ const _TreeView = React.forwardRef<TreeViewRef, TreeViewProps>(
|
|
|
111
112
|
|
|
112
113
|
const prevSearchText = usePreviousState(searchText);
|
|
113
114
|
|
|
114
|
-
|
|
115
|
+
useDeepCompareEffect(() => {
|
|
116
|
+
cleanUpTreeViewStore();
|
|
117
|
+
|
|
115
118
|
updateInitialTreeViewData(data);
|
|
116
119
|
|
|
117
120
|
if (selectionPropagation)
|
|
@@ -124,8 +127,7 @@ const _TreeView = React.forwardRef<TreeViewRef, TreeViewProps>(
|
|
|
124
127
|
|
|
125
128
|
// Expand pre-expanded nodes
|
|
126
129
|
expandNodes(storeId, preExpandedIds);
|
|
127
|
-
|
|
128
|
-
}, []);
|
|
130
|
+
}, [data]);
|
|
129
131
|
|
|
130
132
|
function selectNodes(ids: string[]) {
|
|
131
133
|
toggleCheckboxes(storeId, ids, true);
|
|
@@ -20,14 +20,16 @@ export function getFlattenedTreeData(
|
|
|
20
20
|
// Initialize stack with the root nodes and level 0
|
|
21
21
|
for (let i = nodes.length - 1; i >= 0; i--) {
|
|
22
22
|
const node = nodes[i];
|
|
23
|
-
|
|
23
|
+
/* istanbul ignore next */
|
|
24
|
+
if (node) { // Ensure node is not undefined - redundant safety
|
|
24
25
|
stack.push({ node, level: 0 });
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
while (stack.length > 0) {
|
|
29
30
|
const item = stack.pop();
|
|
30
|
-
|
|
31
|
+
/* istanbul ignore next */
|
|
32
|
+
if (!item) continue; // Redundant safety check
|
|
31
33
|
|
|
32
34
|
const { node, level } = item;
|
|
33
35
|
|
|
@@ -38,7 +40,8 @@ export function getFlattenedTreeData(
|
|
|
38
40
|
if (node.children && expandedIds.has(node.id)) {
|
|
39
41
|
for (let i = node.children.length - 1; i >= 0; i--) {
|
|
40
42
|
const childNode = node.children[i];
|
|
41
|
-
|
|
43
|
+
/* istanbul ignore next */
|
|
44
|
+
if (childNode) { // Ensure childNode is not undefined - redundant safety
|
|
42
45
|
stack.push({ node: childNode, level: level + 1 });
|
|
43
46
|
}
|
|
44
47
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import isEqual from "lodash/isEqual";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Deep compare effect hook.
|
|
6
|
+
* Ensures the effect runs on the first render and whenever dependencies deeply change.
|
|
7
|
+
*
|
|
8
|
+
* @param effect The effect callback function.
|
|
9
|
+
* @param deps The dependencies array to compare deeply.
|
|
10
|
+
*/
|
|
11
|
+
export default function useDeepCompareEffect(
|
|
12
|
+
effect: React.EffectCallback,
|
|
13
|
+
deps: React.DependencyList
|
|
14
|
+
) {
|
|
15
|
+
// Ref to track if it's the first render
|
|
16
|
+
const firstRenderRef = React.useRef<boolean>(true);
|
|
17
|
+
|
|
18
|
+
// Memoized dependencies to avoid redundant `isEqual` checks
|
|
19
|
+
const memoizedDependencies = React.useMemo(() => deps, [deps]);
|
|
20
|
+
|
|
21
|
+
// Ref to store the previous dependencies
|
|
22
|
+
const dependenciesRef = React.useRef<React.DependencyList>(memoizedDependencies);
|
|
23
|
+
|
|
24
|
+
// Check for dependency changes
|
|
25
|
+
const dependenciesChanged = !isEqual(dependenciesRef.current, memoizedDependencies);
|
|
26
|
+
if (dependenciesChanged) {
|
|
27
|
+
dependenciesRef.current = memoizedDependencies;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
React.useEffect(() => {
|
|
31
|
+
if (firstRenderRef.current) {
|
|
32
|
+
firstRenderRef.current = false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return effect();
|
|
36
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
37
|
+
}, [dependenciesChanged]); // exclude the effect function from the dependencies
|
|
38
|
+
}
|