@rc-component/util 1.13.0 → 1.14.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/es/Dom/dynamicCSS.js +16 -1
- package/es/hooks/useAllowClear.d.ts +11 -0
- package/es/hooks/useAllowClear.js +10 -0
- package/es/hooks/useDelayState.js +1 -0
- package/es/index.d.ts +2 -0
- package/es/index.js +1 -0
- package/es/ref.js +1 -1
- package/es/utils/set.js +8 -1
- package/lib/Dom/dynamicCSS.js +16 -1
- package/lib/hooks/useAllowClear.d.ts +11 -0
- package/lib/hooks/useAllowClear.js +18 -0
- package/lib/hooks/useDelayState.js +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +7 -0
- package/lib/ref.js +1 -1
- package/lib/utils/set.js +8 -1
- package/package.json +1 -1
package/es/Dom/dynamicCSS.js
CHANGED
|
@@ -30,6 +30,9 @@ function getOrder(prepend) {
|
|
|
30
30
|
* Find style which inject by rc-util
|
|
31
31
|
*/
|
|
32
32
|
function findStyles(container) {
|
|
33
|
+
if (!container) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
33
36
|
return Array.from((containerCache.get(container) || container).children).filter(node => node.tagName === 'STYLE');
|
|
34
37
|
}
|
|
35
38
|
export function injectCSS(css, option = {}) {
|
|
@@ -53,6 +56,9 @@ export function injectCSS(css, option = {}) {
|
|
|
53
56
|
}
|
|
54
57
|
styleNode.innerHTML = css;
|
|
55
58
|
const container = getContainer(option);
|
|
59
|
+
if (!container) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
56
62
|
const {
|
|
57
63
|
firstChild
|
|
58
64
|
} = container;
|
|
@@ -93,7 +99,7 @@ export function removeCSS(key, option = {}) {
|
|
|
93
99
|
const existNode = findExistNode(key, option);
|
|
94
100
|
if (existNode) {
|
|
95
101
|
const container = getContainer(option);
|
|
96
|
-
container
|
|
102
|
+
container?.removeChild(existNode);
|
|
97
103
|
}
|
|
98
104
|
}
|
|
99
105
|
|
|
@@ -106,6 +112,9 @@ function syncRealContainer(container, option) {
|
|
|
106
112
|
// Find real container when not cached or cached container removed
|
|
107
113
|
if (!cachedRealContainer || !contains(document, cachedRealContainer)) {
|
|
108
114
|
const placeholderStyle = injectCSS('', option);
|
|
115
|
+
if (!placeholderStyle) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
109
118
|
const {
|
|
110
119
|
parentNode
|
|
111
120
|
} = placeholderStyle;
|
|
@@ -122,6 +131,9 @@ export function clearContainerCache() {
|
|
|
122
131
|
}
|
|
123
132
|
export function updateCSS(css, key, originOption = {}) {
|
|
124
133
|
const container = getContainer(originOption);
|
|
134
|
+
if (!container) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
125
137
|
const styles = findStyles(container);
|
|
126
138
|
const option = {
|
|
127
139
|
...originOption,
|
|
@@ -141,6 +153,9 @@ export function updateCSS(css, key, originOption = {}) {
|
|
|
141
153
|
return existNode;
|
|
142
154
|
}
|
|
143
155
|
const newNode = injectCSS(css, option);
|
|
156
|
+
if (!newNode) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
144
159
|
newNode.setAttribute(getMark(option), key);
|
|
145
160
|
return newNode;
|
|
146
161
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface AllowClearConfig {
|
|
3
|
+
clearIcon?: React.ReactNode;
|
|
4
|
+
/** Disable the clear entry without rendering a button or reserving space. */
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
tabIndex?: number;
|
|
7
|
+
/** Accessible name for the clear button. */
|
|
8
|
+
label?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Normalize clear configuration. Components should apply their defaults first. */
|
|
11
|
+
export default function useAllowClear(allowClear?: boolean | AllowClearConfig): AllowClearConfig;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/** Normalize clear configuration. Components should apply their defaults first. */
|
|
3
|
+
export default function useAllowClear(allowClear) {
|
|
4
|
+
return React.useMemo(() => allowClear && typeof allowClear === 'object' ? {
|
|
5
|
+
...allowClear,
|
|
6
|
+
disabled: allowClear.disabled ?? false
|
|
7
|
+
} : {
|
|
8
|
+
disabled: !allowClear
|
|
9
|
+
}, [allowClear]);
|
|
10
|
+
}
|
|
@@ -19,6 +19,7 @@ export default function useDelayState(defaultValue) {
|
|
|
19
19
|
delayRef.current = null;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
+
React.useEffect(() => cancelPending, [cancelPending]);
|
|
22
23
|
const setDelayValue = useEvent((nextValue, immediatelyOrDelay) => {
|
|
23
24
|
const delayConfig = immediatelyOrDelay || {
|
|
24
25
|
frame: 1
|
package/es/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export { default as useAllowClear } from './hooks/useAllowClear';
|
|
2
|
+
export type { AllowClearConfig } from './hooks/useAllowClear';
|
|
1
3
|
export { default as useEvent } from './hooks/useEvent';
|
|
2
4
|
export { default as useMergedState } from './hooks/useMergedState';
|
|
3
5
|
export { default as useControlledState } from './hooks/useControlledState';
|
package/es/index.js
CHANGED
package/es/ref.js
CHANGED
|
@@ -2,7 +2,7 @@ import { isValidElement, version } from 'react';
|
|
|
2
2
|
import { ForwardRef, isMemo } from 'react-is';
|
|
3
3
|
import useMemo from "./hooks/useMemo";
|
|
4
4
|
import isFragment from "./React/isFragment";
|
|
5
|
-
const ReactMajorVersion = Number(version
|
|
5
|
+
const ReactMajorVersion = Number(version?.split('.')[0]);
|
|
6
6
|
export const fillRef = (ref, node) => {
|
|
7
7
|
if (typeof ref === 'function') {
|
|
8
8
|
ref(node);
|
package/es/utils/set.js
CHANGED
|
@@ -17,7 +17,14 @@ function internalSet(entity, paths, value, removeIfUndefined) {
|
|
|
17
17
|
|
|
18
18
|
// Delete prop if `removeIfUndefined` and value is undefined
|
|
19
19
|
if (removeIfUndefined && value === undefined && restPath.length === 1) {
|
|
20
|
-
|
|
20
|
+
const origin = clone[path];
|
|
21
|
+
if (origin && typeof origin === 'object') {
|
|
22
|
+
const child = Array.isArray(origin) ? [...origin] : {
|
|
23
|
+
...origin
|
|
24
|
+
};
|
|
25
|
+
delete child[restPath[0]];
|
|
26
|
+
clone[path] = child;
|
|
27
|
+
}
|
|
21
28
|
} else {
|
|
22
29
|
clone[path] = internalSet(clone[path], restPath, value, removeIfUndefined);
|
|
23
30
|
}
|
package/lib/Dom/dynamicCSS.js
CHANGED
|
@@ -40,6 +40,9 @@ function getOrder(prepend) {
|
|
|
40
40
|
* Find style which inject by rc-util
|
|
41
41
|
*/
|
|
42
42
|
function findStyles(container) {
|
|
43
|
+
if (!container) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
43
46
|
return Array.from((containerCache.get(container) || container).children).filter(node => node.tagName === 'STYLE');
|
|
44
47
|
}
|
|
45
48
|
function injectCSS(css, option = {}) {
|
|
@@ -63,6 +66,9 @@ function injectCSS(css, option = {}) {
|
|
|
63
66
|
}
|
|
64
67
|
styleNode.innerHTML = css;
|
|
65
68
|
const container = getContainer(option);
|
|
69
|
+
if (!container) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
66
72
|
const {
|
|
67
73
|
firstChild
|
|
68
74
|
} = container;
|
|
@@ -103,7 +109,7 @@ function removeCSS(key, option = {}) {
|
|
|
103
109
|
const existNode = findExistNode(key, option);
|
|
104
110
|
if (existNode) {
|
|
105
111
|
const container = getContainer(option);
|
|
106
|
-
container
|
|
112
|
+
container?.removeChild(existNode);
|
|
107
113
|
}
|
|
108
114
|
}
|
|
109
115
|
|
|
@@ -116,6 +122,9 @@ function syncRealContainer(container, option) {
|
|
|
116
122
|
// Find real container when not cached or cached container removed
|
|
117
123
|
if (!cachedRealContainer || !(0, _contains.default)(document, cachedRealContainer)) {
|
|
118
124
|
const placeholderStyle = injectCSS('', option);
|
|
125
|
+
if (!placeholderStyle) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
119
128
|
const {
|
|
120
129
|
parentNode
|
|
121
130
|
} = placeholderStyle;
|
|
@@ -132,6 +141,9 @@ function clearContainerCache() {
|
|
|
132
141
|
}
|
|
133
142
|
function updateCSS(css, key, originOption = {}) {
|
|
134
143
|
const container = getContainer(originOption);
|
|
144
|
+
if (!container) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
135
147
|
const styles = findStyles(container);
|
|
136
148
|
const option = {
|
|
137
149
|
...originOption,
|
|
@@ -151,6 +163,9 @@ function updateCSS(css, key, originOption = {}) {
|
|
|
151
163
|
return existNode;
|
|
152
164
|
}
|
|
153
165
|
const newNode = injectCSS(css, option);
|
|
166
|
+
if (!newNode) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
154
169
|
newNode.setAttribute(getMark(option), key);
|
|
155
170
|
return newNode;
|
|
156
171
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface AllowClearConfig {
|
|
3
|
+
clearIcon?: React.ReactNode;
|
|
4
|
+
/** Disable the clear entry without rendering a button or reserving space. */
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
tabIndex?: number;
|
|
7
|
+
/** Accessible name for the clear button. */
|
|
8
|
+
label?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Normalize clear configuration. Components should apply their defaults first. */
|
|
11
|
+
export default function useAllowClear(allowClear?: boolean | AllowClearConfig): AllowClearConfig;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = useAllowClear;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
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); }
|
|
9
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
10
|
+
/** Normalize clear configuration. Components should apply their defaults first. */
|
|
11
|
+
function useAllowClear(allowClear) {
|
|
12
|
+
return React.useMemo(() => allowClear && typeof allowClear === 'object' ? {
|
|
13
|
+
...allowClear,
|
|
14
|
+
disabled: allowClear.disabled ?? false
|
|
15
|
+
} : {
|
|
16
|
+
disabled: !allowClear
|
|
17
|
+
}, [allowClear]);
|
|
18
|
+
}
|
|
@@ -28,6 +28,7 @@ function useDelayState(defaultValue) {
|
|
|
28
28
|
delayRef.current = null;
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
|
+
React.useEffect(() => cancelPending, [cancelPending]);
|
|
31
32
|
const setDelayValue = (0, _useEvent.default)((nextValue, immediatelyOrDelay) => {
|
|
32
33
|
const delayConfig = immediatelyOrDelay || {
|
|
33
34
|
frame: 1
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export { default as useAllowClear } from './hooks/useAllowClear';
|
|
2
|
+
export type { AllowClearConfig } from './hooks/useAllowClear';
|
|
1
3
|
export { default as useEvent } from './hooks/useEvent';
|
|
2
4
|
export { default as useMergedState } from './hooks/useMergedState';
|
|
3
5
|
export { default as useControlledState } from './hooks/useControlledState';
|
package/lib/index.js
CHANGED
|
@@ -261,6 +261,12 @@ Object.defineProperty(exports, "updateCSS", {
|
|
|
261
261
|
return _dynamicCSS.updateCSS;
|
|
262
262
|
}
|
|
263
263
|
});
|
|
264
|
+
Object.defineProperty(exports, "useAllowClear", {
|
|
265
|
+
enumerable: true,
|
|
266
|
+
get: function () {
|
|
267
|
+
return _useAllowClear.default;
|
|
268
|
+
}
|
|
269
|
+
});
|
|
264
270
|
Object.defineProperty(exports, "useComposeRef", {
|
|
265
271
|
enumerable: true,
|
|
266
272
|
get: function () {
|
|
@@ -339,6 +345,7 @@ Object.defineProperty(exports, "warning", {
|
|
|
339
345
|
return _warning.default;
|
|
340
346
|
}
|
|
341
347
|
});
|
|
348
|
+
var _useAllowClear = _interopRequireDefault(require("./hooks/useAllowClear"));
|
|
342
349
|
var _useEvent = _interopRequireDefault(require("./hooks/useEvent"));
|
|
343
350
|
var _useMergedState = _interopRequireDefault(require("./hooks/useMergedState"));
|
|
344
351
|
var _useControlledState = _interopRequireDefault(require("./hooks/useControlledState"));
|
package/lib/ref.js
CHANGED
|
@@ -9,7 +9,7 @@ var _reactIs = require("react-is");
|
|
|
9
9
|
var _useMemo = _interopRequireDefault(require("./hooks/useMemo"));
|
|
10
10
|
var _isFragment = _interopRequireDefault(require("./React/isFragment"));
|
|
11
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
-
const ReactMajorVersion = Number(_react.version
|
|
12
|
+
const ReactMajorVersion = Number(_react.version?.split('.')[0]);
|
|
13
13
|
const fillRef = (ref, node) => {
|
|
14
14
|
if (typeof ref === 'function') {
|
|
15
15
|
ref(node);
|
package/lib/utils/set.js
CHANGED
|
@@ -26,7 +26,14 @@ function internalSet(entity, paths, value, removeIfUndefined) {
|
|
|
26
26
|
|
|
27
27
|
// Delete prop if `removeIfUndefined` and value is undefined
|
|
28
28
|
if (removeIfUndefined && value === undefined && restPath.length === 1) {
|
|
29
|
-
|
|
29
|
+
const origin = clone[path];
|
|
30
|
+
if (origin && typeof origin === 'object') {
|
|
31
|
+
const child = Array.isArray(origin) ? [...origin] : {
|
|
32
|
+
...origin
|
|
33
|
+
};
|
|
34
|
+
delete child[restPath[0]];
|
|
35
|
+
clone[path] = child;
|
|
36
|
+
}
|
|
30
37
|
} else {
|
|
31
38
|
clone[path] = internalSet(clone[path], restPath, value, removeIfUndefined);
|
|
32
39
|
}
|