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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,44 @@
1
1
  import { Key } from 'react';
2
- type Dependencies = {
3
- keys?: Key[];
4
- isAllDefaultToggled?: boolean;
2
+ /**
3
+ * @description
4
+ * toggleable key
5
+ */
6
+ type ToggleableKey = {
7
+ /**
8
+ * @description
9
+ * unique key
10
+ */
11
+ key: Key;
12
+ /**
13
+ * @description
14
+ * children
15
+ */
16
+ children?: ToggleableKey[];
17
+ };
18
+ /**
19
+ * @description
20
+ * extra options
21
+ */
22
+ type Options = {
23
+ /**
24
+ * @description
25
+ * default toggled
26
+ */
27
+ isDefaultToggled?: boolean;
28
+ /**
29
+ * @description
30
+ * toggled keys
31
+ */
32
+ toggledKeys?: Key[];
5
33
  };
6
34
  /**
7
35
  * @description
8
36
  * toggle able
9
37
  */
10
- export declare const useToggleable: ({ keys, isAllDefaultToggled }?: Dependencies) => {
11
- toggleBy: (key: Key, isToggled: boolean) => void;
12
- toggle: (key: Key) => void;
13
- toggleAll: () => void;
14
- isToggled: (key: Key) => boolean;
15
- toggledKeys: Map<Key, true>;
38
+ export declare const useToggleable: (toggleableKeys: ToggleableKey[], options?: Options) => {
16
39
  isAllToggled: boolean;
40
+ toggledKeys: Set<Key>;
41
+ isToggled: (key: Key) => boolean;
42
+ toggle: (key: Key) => void;
17
43
  };
18
44
  export {};
@@ -1,55 +1,172 @@
1
- import { useState, useCallback, useMemo } from 'react';
1
+ import { __classPrivateFieldSet, __classPrivateFieldGet } from '../node_modules/tslib/tslib.es6.js';
2
+ import { useRef, useMemo, useEffect, useCallback } from 'react';
2
3
 
3
- /**
4
- * @description
5
- * toggle able
6
- */
7
- const useToggleable = ({ keys, isAllDefaultToggled } = {}) => {
8
- const [toggledKeys, setToggledKeys] = useState(() => {
9
- if (isAllDefaultToggled) {
10
- return new Map(keys === null || keys === void 0 ? void 0 : keys.map((key) => [key, true]));
4
+ var _Tree_leaves, _Tree_toggledLeaves, _Tree_groupedLeaves, _Tree_isDefaultToggled, _Leaf_key, _Leaf_belongTo, _Leaf_parent, _Leaf_children, _Leaf_toggledChildren;
5
+ class Tree {
6
+ constructor({ isDefaultToggled }) {
7
+ _Tree_leaves.set(this, void 0);
8
+ _Tree_toggledLeaves.set(this, void 0);
9
+ _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
+ __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
+ }
22
+ get groupedLeaves() {
23
+ return __classPrivateFieldGet(this, _Tree_groupedLeaves, "f");
24
+ }
25
+ grow(toggleableKey) {
26
+ __classPrivateFieldGet(this, _Tree_leaves, "f").add(new Leaf({
27
+ key: toggleableKey.key,
28
+ parent: null,
29
+ belongTo: this
30
+ }).grow(toggleableKey.children));
31
+ return this;
32
+ }
33
+ collect(leaf) {
34
+ __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").has(leaf.key)
35
+ ? __classPrivateFieldGet(this, _Tree_groupedLeaves, "f").set(leaf.key, new Set([leaf]))
36
+ : __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
+ }
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
+ });
48
+ }
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
+ });
57
+ }
58
+ }
59
+ _Tree_leaves = new WeakMap(), _Tree_toggledLeaves = new WeakMap(), _Tree_groupedLeaves = new WeakMap(), _Tree_isDefaultToggled = new WeakMap();
60
+ class Leaf {
61
+ constructor(props) {
62
+ _Leaf_key.set(this, void 0);
63
+ _Leaf_belongTo.set(this, void 0);
64
+ _Leaf_parent.set(this, void 0);
65
+ _Leaf_children.set(this, void 0);
66
+ _Leaf_toggledChildren.set(this, void 0);
67
+ __classPrivateFieldSet(this, _Leaf_key, props.key, "f");
68
+ __classPrivateFieldSet(this, _Leaf_parent, props.parent, "f");
69
+ __classPrivateFieldSet(this, _Leaf_belongTo, props.belongTo, "f");
70
+ __classPrivateFieldSet(this, _Leaf_children, new Set(), "f");
71
+ __classPrivateFieldSet(this, _Leaf_toggledChildren, new Set(), "f");
72
+ // when leaf has grew, let tree collect leaf
73
+ __classPrivateFieldGet(this, _Leaf_belongTo, "f").collect(this);
74
+ }
75
+ get key() {
76
+ return __classPrivateFieldGet(this, _Leaf_key, "f");
77
+ }
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);
11
85
  }
12
- return new Map();
13
- });
14
- /// toggle by flag
15
- const toggleBy = useCallback((key, isToggled) => {
16
- setToggledKeys((prev) => {
17
- if (isToggled) {
18
- return new Map(prev).set(key, true);
19
- }
20
- const _toggledKeys = new Map(prev);
21
- _toggledKeys.delete(key);
22
- return _toggledKeys;
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);
23
91
  });
24
- }, []);
25
- /// if all key is toggled
26
- const isAllToggled = useMemo(() => {
27
- return toggledKeys.size === (keys === null || keys === void 0 ? void 0 : keys.length);
28
- }, [toggledKeys, keys]);
29
- /// is toggled
30
- const isToggled = useCallback((key) => {
31
- return toggledKeys.has(key);
32
- }, [toggledKeys]);
33
- /// toggle
34
- const toggle = useCallback((key) => {
35
- toggleBy(key, !isToggled(key));
36
- }, [toggleBy, isToggled]);
37
- /// toggle all
38
- const toggleAll = useCallback(() => {
39
- if (isAllToggled) {
40
- setToggledKeys(new Map());
92
+ // rise to parent
93
+ (_a = __classPrivateFieldGet(this, _Leaf_parent, "f")) === null || _a === void 0 ? void 0 : _a.rise(this, isToggled);
94
+ }
95
+ grow(toggleableKeys = []) {
96
+ if (toggleableKeys.length > 0) {
97
+ toggleableKeys.forEach((_toggleableKey) => {
98
+ const child = new Leaf({
99
+ key: _toggleableKey.key,
100
+ parent: this,
101
+ belongTo: __classPrivateFieldGet(this, _Leaf_belongTo, "f")
102
+ }).grow(_toggleableKey.children);
103
+ __classPrivateFieldGet(this, _Leaf_children, "f").add(child);
104
+ });
105
+ }
106
+ return this;
107
+ }
108
+ rise(child, isToggled) {
109
+ var _a;
110
+ if (isToggled) {
111
+ __classPrivateFieldGet(this, _Leaf_toggledChildren, "f").add(child);
41
112
  }
42
113
  else {
43
- setToggledKeys(new Map(keys === null || keys === void 0 ? void 0 : keys.map((key) => [key, true])));
114
+ __classPrivateFieldGet(this, _Leaf_toggledChildren, "f").delete(child);
44
115
  }
45
- }, [isAllToggled, keys]);
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);
124
+ }
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
+ });
135
+ }
136
+ }
137
+ _Leaf_key = new WeakMap(), _Leaf_belongTo = new WeakMap(), _Leaf_parent = new WeakMap(), _Leaf_children = new WeakMap(), _Leaf_toggledChildren = new WeakMap();
138
+ /**
139
+ * @description
140
+ * toggle able
141
+ */
142
+ const useToggleable = (toggleableKeys, options = {}) => {
143
+ /// use once
144
+ const _isDefaultToggled = useRef(!!options.isDefaultToggled);
145
+ /// re-create tree when toggleable keys changed
146
+ const tree = useMemo(() => {
147
+ return toggleableKeys.reduce((_tree, toggleable) => _tree.grow(toggleable), new Tree({
148
+ isDefaultToggled: _isDefaultToggled.current
149
+ }));
150
+ }, [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]);
161
+ /// check current key is toggled
162
+ const isToggled = useCallback((key) => _toggledKeys.has(key), [tree]);
163
+ /// toggle one key
164
+ const toggle = useCallback((key) => tree.toggle(key), [tree]);
46
165
  return {
47
- toggleBy,
48
- toggle,
49
- toggleAll,
166
+ isAllToggled: tree.isAllToggled,
167
+ toggledKeys: _toggledKeys,
50
168
  isToggled,
51
- toggledKeys,
52
- isAllToggled
169
+ toggle
53
170
  };
54
171
  };
55
172
 
@@ -0,0 +1,2 @@
1
+ export { Nullable } from './null-able';
2
+ export { Partialable } from './partial-able';
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @description
3
+ * null able
4
+ */
5
+ export type Nullable<T> = T | null;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @description
3
+ * partial able
4
+ */
5
+ export type Partialable<T> = T | undefined;
package/package.json CHANGED
@@ -1,21 +1,12 @@
1
1
  {
2
2
  "name": "@aiszlab/relax",
3
- "version": "1.2.11-beta.1",
3
+ "version": "1.2.11-beta.5",
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
- },
10
- "typesVersions": {
11
- "*": {
12
- ".": [
13
- "./dist/index.d.ts"
14
- ],
15
- "dom": [
16
- "./dist/dom/index.d.ts"
17
- ]
18
- }
8
+ "./dom": "./dist/dom/index.js",
9
+ "./types": "./dist/types/index.d.ts"
19
10
  },
20
11
  "scripts": {
21
12
  "dev": "rollup -c -w",