@aiszlab/relax 1.2.11-beta.5 → 1.2.11-beta.6

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.
@@ -30,13 +30,17 @@ type Options = {
30
30
  * toggled keys
31
31
  */
32
32
  toggledKeys?: Key[];
33
+ /**
34
+ * @description
35
+ * on toggle callback
36
+ */
37
+ onToggle?: (keys: Key[]) => void;
33
38
  };
34
39
  /**
35
40
  * @description
36
41
  * toggle able
37
42
  */
38
- export declare const useToggleable: (toggleableKeys: ToggleableKey[], options?: Options) => {
39
- isAllToggled: boolean;
43
+ export declare const useToggleable: (toggleableKeys: ToggleableKey[], { onToggle, ...options }?: Options) => {
40
44
  toggledKeys: Set<Key>;
41
45
  isToggled: (key: Key) => boolean;
42
46
  toggle: (key: Key) => void;
@@ -1,97 +1,63 @@
1
- import { __classPrivateFieldSet, __classPrivateFieldGet } from '../node_modules/tslib/tslib.es6.js';
2
- import { useRef, useMemo, useEffect, useCallback } from 'react';
1
+ import { __rest, __classPrivateFieldSet, __classPrivateFieldGet } from '../node_modules/tslib/tslib.es6.js';
2
+ import { useMemo, useCallback } from 'react';
3
+ import { useControlledState } from './use-controlled-state.js';
3
4
 
4
- var _Tree_leaves, _Tree_toggledLeaves, _Tree_groupedLeaves, _Tree_isDefaultToggled, _Leaf_key, _Leaf_belongTo, _Leaf_parent, _Leaf_children, _Leaf_toggledChildren;
5
+ var _Tree_groupedLeaves, _Leaf_key, _Leaf_belongTo, _Leaf_parent, _Leaf_children;
5
6
  class Tree {
6
- constructor({ isDefaultToggled }) {
7
- _Tree_leaves.set(this, void 0);
8
- _Tree_toggledLeaves.set(this, void 0);
7
+ constructor() {
9
8
  _Tree_groupedLeaves.set(this, void 0);
10
- _Tree_isDefaultToggled.set(this, void 0);
11
- __classPrivateFieldSet(this, _Tree_leaves, new Set(), "f");
12
- __classPrivateFieldSet(this, _Tree_toggledLeaves, new Set(), "f");
13
9
  __classPrivateFieldSet(this, _Tree_groupedLeaves, new Map(), "f");
14
- __classPrivateFieldSet(this, _Tree_isDefaultToggled, !!isDefaultToggled, "f");
15
- }
16
- get isAllToggled() {
17
- return __classPrivateFieldGet(this, _Tree_leaves, "f").size === __classPrivateFieldGet(this, _Tree_toggledLeaves, "f").size;
18
- }
19
- get toggledLeaves() {
20
- return __classPrivateFieldGet(this, _Tree_toggledLeaves, "f");
21
10
  }
22
11
  get groupedLeaves() {
23
12
  return __classPrivateFieldGet(this, _Tree_groupedLeaves, "f");
24
13
  }
25
14
  grow(toggleableKey) {
26
- __classPrivateFieldGet(this, _Tree_leaves, "f").add(new Leaf({
15
+ // create leaf, leaf will auto trigger tree collect callback
16
+ new Leaf({
27
17
  key: toggleableKey.key,
28
18
  parent: null,
29
19
  belongTo: this
30
- }).grow(toggleableKey.children));
20
+ }).grow(toggleableKey.children);
31
21
  return this;
32
22
  }
33
23
  collect(leaf) {
34
24
  __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").has(leaf.key)
35
25
  ? __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").set(leaf.key, new Set([leaf]))
36
26
  : __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").get(leaf.key).add(leaf);
37
- // if default toggled, add leaf to toggled leaves
38
- __classPrivateFieldGet(this, _Tree_isDefaultToggled, "f") && this.toggledLeaves.add(leaf);
39
27
  }
40
- toggle(key) {
41
- const leaves = __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").get(key);
42
- if (!(leaves === null || leaves === void 0 ? void 0 : leaves.size))
43
- return;
44
- leaves.forEach((leaf) => {
45
- const _isToggled = this.toggledLeaves.has(leaf);
46
- leaf.toggleBy(!_isToggled);
47
- });
28
+ toggle(key, toggledKeys) {
29
+ const hasToggled = toggledKeys.has(key);
30
+ const _isToggled = !hasToggled;
31
+ return this.toggleBy(key, _isToggled, toggledKeys);
48
32
  }
49
- toggleWith(keys) {
50
- this.toggledLeaves.clear();
51
- keys.forEach((key) => {
52
- var _a;
53
- (_a = __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").get(key)) === null || _a === void 0 ? void 0 : _a.forEach((leaf) => {
54
- __classPrivateFieldGet(this, _Tree_toggledLeaves, "f").add(leaf);
55
- });
56
- });
33
+ toggleBy(key, isToggled, toggledKeys) {
34
+ var _a;
35
+ return Array.from((_a = __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").get(key)) !== null && _a !== void 0 ? _a : []).reduce((prev, leaf) => {
36
+ // deep fall, add or remove child key
37
+ const fell = leaf.fall(isToggled, prev);
38
+ // deep rise, add or remove parent key
39
+ const rised = leaf.rise(fell);
40
+ return rised;
41
+ }, new Set(toggledKeys));
57
42
  }
58
43
  }
59
- _Tree_leaves = new WeakMap(), _Tree_toggledLeaves = new WeakMap(), _Tree_groupedLeaves = new WeakMap(), _Tree_isDefaultToggled = new WeakMap();
44
+ _Tree_groupedLeaves = new WeakMap();
60
45
  class Leaf {
61
46
  constructor(props) {
62
47
  _Leaf_key.set(this, void 0);
63
48
  _Leaf_belongTo.set(this, void 0);
64
49
  _Leaf_parent.set(this, void 0);
65
50
  _Leaf_children.set(this, void 0);
66
- _Leaf_toggledChildren.set(this, void 0);
67
51
  __classPrivateFieldSet(this, _Leaf_key, props.key, "f");
68
52
  __classPrivateFieldSet(this, _Leaf_parent, props.parent, "f");
69
53
  __classPrivateFieldSet(this, _Leaf_belongTo, props.belongTo, "f");
70
- __classPrivateFieldSet(this, _Leaf_children, new Set(), "f");
71
- __classPrivateFieldSet(this, _Leaf_toggledChildren, new Set(), "f");
54
+ __classPrivateFieldSet(this, _Leaf_children, [], "f");
72
55
  // when leaf has grew, let tree collect leaf
73
56
  __classPrivateFieldGet(this, _Leaf_belongTo, "f").collect(this);
74
57
  }
75
58
  get key() {
76
59
  return __classPrivateFieldGet(this, _Leaf_key, "f");
77
60
  }
78
- toggleBy(isToggled, isPrevent = false) {
79
- var _a;
80
- if (isToggled) {
81
- __classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.add(this);
82
- }
83
- else {
84
- __classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.delete(this);
85
- }
86
- if (isPrevent)
87
- return;
88
- // fall to every child
89
- Array.from(__classPrivateFieldGet(this, _Leaf_children, "f").values()).forEach((child) => {
90
- child.fall(isToggled);
91
- });
92
- // rise to parent
93
- (_a = __classPrivateFieldGet(this, _Leaf_parent, "f")) === null || _a === void 0 ? void 0 : _a.rise(this, isToggled);
94
- }
95
61
  grow(toggleableKeys = []) {
96
62
  if (toggleableKeys.length > 0) {
97
63
  toggleableKeys.forEach((_toggleableKey) => {
@@ -100,71 +66,83 @@ class Leaf {
100
66
  parent: this,
101
67
  belongTo: __classPrivateFieldGet(this, _Leaf_belongTo, "f")
102
68
  }).grow(_toggleableKey.children);
103
- __classPrivateFieldGet(this, _Leaf_children, "f").add(child);
69
+ __classPrivateFieldGet(this, _Leaf_children, "f").push(child);
104
70
  });
105
71
  }
106
72
  return this;
107
73
  }
108
- rise(child, isToggled) {
109
- var _a;
74
+ rise(toggledKeys) {
75
+ // if current key is toggled or children is all toggled
76
+ // just add current key into toggled keys
77
+ // else remove current key
78
+ const isToggled = toggledKeys.has(__classPrivateFieldGet(this, _Leaf_key, "f")) || __classPrivateFieldGet(this, _Leaf_children, "f").every((child) => toggledKeys.has(child.key));
79
+ const rised = new Set(toggledKeys);
110
80
  if (isToggled) {
111
- __classPrivateFieldGet(this, _Leaf_toggledChildren, "f").add(child);
81
+ rised.add(__classPrivateFieldGet(this, _Leaf_key, "f"));
112
82
  }
113
83
  else {
114
- __classPrivateFieldGet(this, _Leaf_toggledChildren, "f").delete(child);
84
+ rised.delete(__classPrivateFieldGet(this, _Leaf_key, "f"));
85
+ }
86
+ if (__classPrivateFieldGet(this, _Leaf_parent, "f")) {
87
+ return __classPrivateFieldGet(this, _Leaf_parent, "f").rise(rised);
115
88
  }
116
- // if toggled state is same, stop
117
- const _isToggled = __classPrivateFieldGet(this, _Leaf_children, "f").size === __classPrivateFieldGet(this, _Leaf_toggledChildren, "f").size;
118
- const _hasToggled = !!__classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.has(this);
119
- if (_hasToggled === _isToggled)
120
- return;
121
- this.toggleBy(_isToggled, true);
122
- // rise to parent
123
- (_a = __classPrivateFieldGet(this, _Leaf_parent, "f")) === null || _a === void 0 ? void 0 : _a.rise(this, _isToggled);
89
+ return rised;
124
90
  }
125
- fall(isToggled) {
126
- // if toggled state is same, stop
127
- const _hasToggled = !!__classPrivateFieldGet(this, _Leaf_belongTo, "f").toggledLeaves.has(this);
128
- if (_hasToggled === isToggled)
129
- return;
130
- this.toggleBy(isToggled, true);
131
- // fall to every child
132
- Array.from(__classPrivateFieldGet(this, _Leaf_children, "f").values()).forEach((child) => {
133
- child.fall(isToggled);
134
- });
91
+ fall(isToggled, toggledKeys) {
92
+ return __classPrivateFieldGet(this, _Leaf_children, "f").reduce((prev, leaf) => {
93
+ // deep loop, remove or add key
94
+ const fell = leaf.fall(isToggled, prev);
95
+ // toggle true, add key
96
+ // toggle false, remove key
97
+ if (isToggled) {
98
+ fell.add(__classPrivateFieldGet(this, _Leaf_key, "f"));
99
+ }
100
+ else {
101
+ fell.delete(__classPrivateFieldGet(this, _Leaf_key, "f"));
102
+ }
103
+ return fell;
104
+ }, new Set(toggledKeys));
135
105
  }
136
106
  }
137
- _Leaf_key = new WeakMap(), _Leaf_belongTo = new WeakMap(), _Leaf_parent = new WeakMap(), _Leaf_children = new WeakMap(), _Leaf_toggledChildren = new WeakMap();
107
+ _Leaf_key = new WeakMap(), _Leaf_belongTo = new WeakMap(), _Leaf_parent = new WeakMap(), _Leaf_children = new WeakMap();
138
108
  /**
139
109
  * @description
140
110
  * toggle able
141
111
  */
142
- const useToggleable = (toggleableKeys, options = {}) => {
143
- /// use once
144
- const _isDefaultToggled = useRef(!!options.isDefaultToggled);
112
+ const useToggleable = (toggleableKeys, _a = {}) => {
113
+ var { onToggle } = _a, options = __rest(_a, ["onToggle"]);
145
114
  /// re-create tree when toggleable keys changed
146
115
  const tree = useMemo(() => {
147
- return toggleableKeys.reduce((_tree, toggleable) => _tree.grow(toggleable), new Tree({
148
- isDefaultToggled: _isDefaultToggled.current
149
- }));
116
+ return toggleableKeys.reduce((_tree, toggleable) => {
117
+ return _tree.grow(toggleable);
118
+ }, new Tree());
150
119
  }, [toggleableKeys]);
151
- /// toggled keys
152
- useEffect(() => {
153
- if (!options.toggledKeys)
154
- return;
155
- tree.toggleWith(options.toggledKeys);
156
- }, [options.toggledKeys]);
157
- /// toggled keys
158
- const _toggledKeys = useMemo(() => {
159
- return new Set(Array.from(tree.toggledLeaves).map((leaf) => leaf.key));
160
- }, [tree]);
120
+ /// use controlled state to record toggled keys
121
+ const [_toggledKeys, _setToggledKeys] = useControlledState(options.toggledKeys, {
122
+ defaultState: () => {
123
+ return options.isDefaultToggled
124
+ ? Array.from(Array.from(tree.groupedLeaves.values()).reduce((prev, leaves) => {
125
+ leaves.forEach((leaf) => prev.add(leaf.key));
126
+ return prev;
127
+ }, new Set()))
128
+ : [];
129
+ }
130
+ });
131
+ /// use set for toggled keys to make it read-only
132
+ const readableToggledKeys = useMemo(() => new Set(_toggledKeys), [_toggledKeys]);
161
133
  /// check current key is toggled
162
- const isToggled = useCallback((key) => _toggledKeys.has(key), [tree]);
134
+ const isToggled = useCallback((key) => !readableToggledKeys || readableToggledKeys.has(key), [readableToggledKeys]);
163
135
  /// toggle one key
164
- const toggle = useCallback((key) => tree.toggle(key), [tree]);
136
+ const toggle = useCallback((key) => {
137
+ // get new toggled keys by toggle current key
138
+ const _toggledKeys = Array.from(tree.toggle(key, readableToggledKeys));
139
+ // set state
140
+ _setToggledKeys(_toggledKeys);
141
+ // trigger on toggle callback
142
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(_toggledKeys);
143
+ }, [tree, readableToggledKeys, _setToggledKeys, onToggle]);
165
144
  return {
166
- isAllToggled: tree.isAllToggled,
167
- toggledKeys: _toggledKeys,
145
+ toggledKeys: readableToggledKeys,
168
146
  isToggled,
169
147
  toggle
170
148
  };
package/dist/index.d.ts CHANGED
@@ -32,3 +32,10 @@ export { isMobile } from './is/is-mobile';
32
32
  export { isOverflow } from './is/is-overflow';
33
33
  export { isStyleElement } from './is/is-style-element';
34
34
  export { isFunction } from './is/is-function';
35
+ /**
36
+ * @description
37
+ * utils
38
+ */
39
+ export { type Nullable } from './utils/null-able';
40
+ export { type Partialable } from './utils/partial-able';
41
+ export { unique, uniqueBy } from './utils/unique';
package/dist/index.js CHANGED
@@ -24,3 +24,4 @@ export { isMobile } from './is/is-mobile.js';
24
24
  export { isOverflow } from './is/is-overflow.js';
25
25
  export { isStyleElement } from './is/is-style-element.js';
26
26
  export { isFunction } from './is/is-function.js';
27
+ export { unique, uniqueBy } from './utils/unique.js';
@@ -1,3 +1,11 @@
1
+ function __rest(s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
4
+ if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
5
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
6
+ }
7
+ return t;
8
+ }
1
9
  function __classPrivateFieldGet(receiver, state, kind, f) {
2
10
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
11
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
@@ -14,4 +22,4 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
14
22
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
15
23
  };
16
24
 
17
- export { __classPrivateFieldGet, __classPrivateFieldSet };
25
+ export { __classPrivateFieldGet, __classPrivateFieldSet, __rest };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @description
3
+ * unique
4
+ */
5
+ export declare const unique: <T = unknown>(value: Iterable<T>) => T[];
6
+ /**
7
+ * @description
8
+ * unique by
9
+ */
10
+ export declare const uniqueBy: <T, P>(value: Iterable<T>, callback: (item: T) => P) => P[];
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @description
3
+ * unique
4
+ */
5
+ const unique = (value) => {
6
+ return Array.from(new Set(value));
7
+ };
8
+ /**
9
+ * @description
10
+ * unique by
11
+ */
12
+ const uniqueBy = (value, callback) => {
13
+ return Array.from(new Set(Array.from(value).map(callback)));
14
+ };
15
+
16
+ export { unique, uniqueBy };
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "@aiszlab/relax",
3
- "version": "1.2.11-beta.5",
3
+ "version": "1.2.11-beta.6",
4
4
  "description": "react utils collection",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": "./dist/index.js",
8
- "./dom": "./dist/dom/index.js",
9
- "./types": "./dist/types/index.d.ts"
8
+ "./dom": "./dist/dom/index.js"
10
9
  },
11
10
  "scripts": {
12
11
  "dev": "rollup -c -w",
@@ -1,2 +0,0 @@
1
- export { Nullable } from './null-able';
2
- export { Partialable } from './partial-able';
@@ -1 +0,0 @@
1
-
File without changes
File without changes