@rc-component/util 1.2.2 → 1.3.1

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.
@@ -0,0 +1,8 @@
1
+ type Updater<T> = (updater: T | ((origin: T) => T)) => void;
2
+ /**
3
+ * Similar to `useState` but will use props value if provided.
4
+ * From React 18, we do not need safe `useState` since it will not throw for unmounted update.
5
+ * This hooks remove the `onChange` & `postState` logic since we only need basic merged state logic.
6
+ */
7
+ export default function useControlledState<T>(defaultStateValue: T | (() => T), value?: T): [T, Updater<T>];
8
+ export {};
@@ -0,0 +1,21 @@
1
+ import { useState } from 'react';
2
+ import useLayoutEffect from "./useLayoutEffect";
3
+ /**
4
+ * Similar to `useState` but will use props value if provided.
5
+ * From React 18, we do not need safe `useState` since it will not throw for unmounted update.
6
+ * This hooks remove the `onChange` & `postState` logic since we only need basic merged state logic.
7
+ */
8
+ export default function useControlledState(defaultStateValue, value) {
9
+ const [innerValue, setInnerValue] = useState(defaultStateValue);
10
+ const mergedValue = value !== undefined ? value : innerValue;
11
+ useLayoutEffect(mount => {
12
+ if (!mount) {
13
+ setInnerValue(value);
14
+ }
15
+ }, [value]);
16
+ return [
17
+ // Value
18
+ mergedValue,
19
+ // Update function
20
+ setInnerValue];
21
+ }
@@ -1,2 +1,2 @@
1
- declare function useEvent<T extends Function>(callback: T): T;
1
+ declare function useEvent<T extends ((...args: any[]) => any) | undefined>(callback: T): undefined extends T ? (...args: Parameters<NonNullable<T>>) => ReturnType<NonNullable<T>> | undefined : T;
2
2
  export default useEvent;
@@ -2,7 +2,7 @@
2
2
  /* eslint-disable react-hooks/exhaustive-deps */
3
3
  import * as React from 'react';
4
4
  function useEvent(callback) {
5
- const fnRef = React.useRef();
5
+ const fnRef = React.useRef(callback);
6
6
  fnRef.current = callback;
7
7
  const memoFn = React.useCallback((...args) => fnRef.current?.(...args), []);
8
8
  return memoFn;
@@ -1,5 +1,6 @@
1
1
  type Updater<T> = (updater: T | ((origin: T) => T), ignoreDestroy?: boolean) => void;
2
2
  /**
3
+ * @deprecated Please use `useControlledState` instead if not need support < React 18.
3
4
  * Similar to `useState` but will use props value if provided.
4
5
  * Note that internal use rc-util `useState` hook.
5
6
  */
@@ -7,6 +7,7 @@ function hasValue(value) {
7
7
  }
8
8
 
9
9
  /**
10
+ * @deprecated Please use `useControlledState` instead if not need support < React 18.
10
11
  * Similar to `useState` but will use props value if provided.
11
12
  * Note that internal use rc-util `useState` hook.
12
13
  */
package/es/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { default as useEvent } from './hooks/useEvent';
2
2
  export { default as useMergedState } from './hooks/useMergedState';
3
+ export { default as useControlledState } from './hooks/useControlledState';
3
4
  export { supportNodeRef, supportRef, useComposeRef } from './ref';
4
5
  export { default as get } from './utils/get';
5
6
  export { default as set, merge } from './utils/set';
package/es/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { default as useEvent } from "./hooks/useEvent";
2
2
  export { default as useMergedState } from "./hooks/useMergedState";
3
+ export { default as useControlledState } from "./hooks/useControlledState";
3
4
  export { supportNodeRef, supportRef, useComposeRef } from "./ref";
4
5
  export { default as get } from "./utils/get";
5
6
  export { default as set, merge } from "./utils/set";
@@ -0,0 +1,8 @@
1
+ type Updater<T> = (updater: T | ((origin: T) => T)) => void;
2
+ /**
3
+ * Similar to `useState` but will use props value if provided.
4
+ * From React 18, we do not need safe `useState` since it will not throw for unmounted update.
5
+ * This hooks remove the `onChange` & `postState` logic since we only need basic merged state logic.
6
+ */
7
+ export default function useControlledState<T>(defaultStateValue: T | (() => T), value?: T): [T, Updater<T>];
8
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = useControlledState;
7
+ var _react = require("react");
8
+ var _useLayoutEffect = _interopRequireDefault(require("./useLayoutEffect"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ /**
11
+ * Similar to `useState` but will use props value if provided.
12
+ * From React 18, we do not need safe `useState` since it will not throw for unmounted update.
13
+ * This hooks remove the `onChange` & `postState` logic since we only need basic merged state logic.
14
+ */
15
+ function useControlledState(defaultStateValue, value) {
16
+ const [innerValue, setInnerValue] = (0, _react.useState)(defaultStateValue);
17
+ const mergedValue = value !== undefined ? value : innerValue;
18
+ (0, _useLayoutEffect.default)(mount => {
19
+ if (!mount) {
20
+ setInnerValue(value);
21
+ }
22
+ }, [value]);
23
+ return [
24
+ // Value
25
+ mergedValue,
26
+ // Update function
27
+ setInnerValue];
28
+ }
@@ -1,2 +1,2 @@
1
- declare function useEvent<T extends Function>(callback: T): T;
1
+ declare function useEvent<T extends ((...args: any[]) => any) | undefined>(callback: T): undefined extends T ? (...args: Parameters<NonNullable<T>>) => ReturnType<NonNullable<T>> | undefined : T;
2
2
  export default useEvent;
@@ -11,7 +11,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
11
11
  /* eslint-disable react-hooks/exhaustive-deps */
12
12
 
13
13
  function useEvent(callback) {
14
- const fnRef = React.useRef();
14
+ const fnRef = React.useRef(callback);
15
15
  fnRef.current = callback;
16
16
  const memoFn = React.useCallback((...args) => fnRef.current?.(...args), []);
17
17
  return memoFn;
@@ -1,5 +1,6 @@
1
1
  type Updater<T> = (updater: T | ((origin: T) => T), ignoreDestroy?: boolean) => void;
2
2
  /**
3
+ * @deprecated Please use `useControlledState` instead if not need support < React 18.
3
4
  * Similar to `useState` but will use props value if provided.
4
5
  * Note that internal use rc-util `useState` hook.
5
6
  */
@@ -14,6 +14,7 @@ function hasValue(value) {
14
14
  }
15
15
 
16
16
  /**
17
+ * @deprecated Please use `useControlledState` instead if not need support < React 18.
17
18
  * Similar to `useState` but will use props value if provided.
18
19
  * Note that internal use rc-util `useState` hook.
19
20
  */
package/lib/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { default as useEvent } from './hooks/useEvent';
2
2
  export { default as useMergedState } from './hooks/useMergedState';
3
+ export { default as useControlledState } from './hooks/useControlledState';
3
4
  export { supportNodeRef, supportRef, useComposeRef } from './ref';
4
5
  export { default as get } from './utils/get';
5
6
  export { default as set, merge } from './utils/set';
package/lib/index.js CHANGED
@@ -57,6 +57,12 @@ Object.defineProperty(exports, "useComposeRef", {
57
57
  return _ref.useComposeRef;
58
58
  }
59
59
  });
60
+ Object.defineProperty(exports, "useControlledState", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _useControlledState.default;
64
+ }
65
+ });
60
66
  Object.defineProperty(exports, "useEvent", {
61
67
  enumerable: true,
62
68
  get: function () {
@@ -77,6 +83,7 @@ Object.defineProperty(exports, "warning", {
77
83
  });
78
84
  var _useEvent = _interopRequireDefault(require("./hooks/useEvent"));
79
85
  var _useMergedState = _interopRequireDefault(require("./hooks/useMergedState"));
86
+ var _useControlledState = _interopRequireDefault(require("./hooks/useControlledState"));
80
87
  var _ref = require("./ref");
81
88
  var _get = _interopRequireDefault(require("./utils/get"));
82
89
  var _set = _interopRequireWildcard(require("./utils/set"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rc-component/util",
3
- "version": "1.2.2",
3
+ "version": "1.3.1",
4
4
  "description": "Common Utils For React Component",
5
5
  "keywords": [
6
6
  "react",
@@ -27,6 +27,7 @@
27
27
  "coverage": "npm test -- --coverage",
28
28
  "lint": "eslint src/ --ext .tsx,.ts & eslint tests/ --ext .tsx,.ts",
29
29
  "prepare": "husky install",
30
+ "prepublishOnly": "npm run compile && rc-np",
30
31
  "start": "dumi dev",
31
32
  "test": "rc-test"
32
33
  },
@@ -44,8 +45,8 @@
44
45
  "@rc-component/father-plugin": "^2.0.1",
45
46
  "@rc-component/np": "^1.0.3",
46
47
  "@testing-library/react": "^16.0.0",
47
- "@types/jest": "^29.4.0",
48
- "@types/node": "^22.5.5",
48
+ "@types/jest": "^30.0.0",
49
+ "@types/node": "^24.6.1",
49
50
  "@types/react": "^18.0.0",
50
51
  "@types/react-dom": "^18.0.0",
51
52
  "@types/react-is": "^19.0.0",
@@ -58,7 +59,7 @@
58
59
  "eslint-plugin-jest": "^28.2.0",
59
60
  "eslint-plugin-unicorn": "^56.0.1",
60
61
  "father": "^4.1.3",
61
- "glob": "^9.2.1",
62
+ "glob": "^11.0.3",
62
63
  "husky": "^9.1.6",
63
64
  "lint-staged": "^15.1.0",
64
65
  "prettier": "^3.3.2",