@jelper/hooks 1.1.2 → 1.2.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/useAsync.js CHANGED
@@ -1,16 +1,8 @@
1
- /**
2
- * @Author: apathyjade
3
- * @Date: 2025-03-18 23:44:38
4
- * @Last Modified by: apathyjade
5
- * @Last Modified time: 2025-05-29 17:58:54
6
- */
7
1
  import { useEffect, useState } from 'react';
8
2
  import useRtCb from './useRtCb';
9
- import useCreate from './useCreate';
10
- import useIsUnmounted from './useIsUnmount';
11
3
  import useUnmount from './useUnmount';
4
+ import useSafeRunner from './useSafeRunner';
12
5
  const defOpt = {
13
- immediate: false,
14
6
  catchParam: false,
15
7
  };
16
8
  const useAsync = (asyncFn, opt = Object.assign({}, defOpt)) => {
@@ -19,7 +11,7 @@ const useAsync = (asyncFn, opt = Object.assign({}, defOpt)) => {
19
11
  const [loading, setLoading] = useState(false);
20
12
  const [error, setError] = useState(undefined);
21
13
  const [controller, setController] = useState();
22
- const isUnmounted = useIsUnmounted();
14
+ const safeRunner = useSafeRunner();
23
15
  useEffect(() => {
24
16
  if (!controller || !opt.onAbort) {
25
17
  return;
@@ -32,34 +24,44 @@ const useAsync = (asyncFn, opt = Object.assign({}, defOpt)) => {
32
24
  }, [controller]);
33
25
  const run = useRtCb((runParam = {}) => {
34
26
  const currParam = opt.catchParam ? Object.assign(Object.assign({}, param), runParam) : runParam;
35
- setLoading(true);
36
- setError(undefined);
37
27
  if (controller) {
38
28
  controller.abort();
39
29
  }
40
30
  const abortController = new AbortController();
41
- setController(abortController);
31
+ safeRunner(() => {
32
+ setLoading(true);
33
+ setError(undefined);
34
+ setController(abortController);
35
+ });
42
36
  return asyncFn(currParam, { signal: abortController.signal })
43
37
  .then((resData) => {
44
- if (isUnmounted() || abortController.signal.aborted)
38
+ if (abortController.signal.aborted)
45
39
  return;
46
- setData(opt.format ? opt.format(resData) : resData);
47
- setParam(currParam);
40
+ safeRunner(() => {
41
+ setData(opt.format ? opt.format(resData) : resData);
42
+ setParam(currParam);
43
+ });
48
44
  }, (err) => {
49
- if (isUnmounted() || abortController.signal.aborted)
45
+ if (abortController.signal.aborted)
50
46
  return;
51
- setError(err);
47
+ safeRunner(() => {
48
+ setError(err);
49
+ });
52
50
  }).finally(() => {
53
- if (isUnmounted())
54
- return;
55
- setLoading(false);
56
- setController(undefined);
51
+ safeRunner(() => {
52
+ setLoading(false);
53
+ setController(undefined);
54
+ });
57
55
  });
58
56
  });
59
57
  const refresh = useRtCb(() => run(param));
60
- useCreate(() => {
61
- if (opt.immediate) {
62
- run(param);
58
+ const cancel = useRtCb(() => {
59
+ if (controller) {
60
+ controller.abort();
61
+ safeRunner(() => {
62
+ setController(undefined);
63
+ setLoading(false);
64
+ });
63
65
  }
64
66
  });
65
67
  useUnmount(() => {
@@ -67,6 +69,6 @@ const useAsync = (asyncFn, opt = Object.assign({}, defOpt)) => {
67
69
  controller.abort();
68
70
  }
69
71
  });
70
- return [data, { run, refresh, loading, error, param, controller }];
72
+ return [data, { run, refresh, cancel, loading, error, param, controller }];
71
73
  };
72
74
  export default useAsync;
package/es/useRtRef.js CHANGED
@@ -4,10 +4,12 @@
4
4
  * @Last Modified by: apathyjade
5
5
  * @Last Modified time: 2025-05-30 15:05:26
6
6
  */
7
- import { useRef } from 'react';
7
+ import { useEffect, useRef } from 'react';
8
8
  const useRtRef = (val) => {
9
9
  const ref = useRef(val);
10
- ref.current = val;
10
+ useEffect(() => {
11
+ ref.current = val;
12
+ });
11
13
  return ref;
12
14
  };
13
15
  export default useRtRef;
package/lib/useAsync.js CHANGED
@@ -1,10 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * @Author: apathyjade
4
- * @Date: 2025-03-18 23:44:38
5
- * @Last Modified by: apathyjade
6
- * @Last Modified time: 2025-05-29 17:58:54
7
- */
8
2
  var __assign = (this && this.__assign) || function () {
9
3
  __assign = Object.assign || function(t) {
10
4
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -22,11 +16,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
16
  Object.defineProperty(exports, "__esModule", { value: true });
23
17
  var react_1 = require("react");
24
18
  var useRtCb_1 = __importDefault(require("./useRtCb"));
25
- var useCreate_1 = __importDefault(require("./useCreate"));
26
- var useIsUnmount_1 = __importDefault(require("./useIsUnmount"));
27
19
  var useUnmount_1 = __importDefault(require("./useUnmount"));
20
+ var useSafeRunner_1 = __importDefault(require("./useSafeRunner"));
28
21
  var defOpt = {
29
- immediate: false,
30
22
  catchParam: false,
31
23
  };
32
24
  var useAsync = function (asyncFn, opt) {
@@ -36,7 +28,7 @@ var useAsync = function (asyncFn, opt) {
36
28
  var _c = (0, react_1.useState)(false), loading = _c[0], setLoading = _c[1];
37
29
  var _d = (0, react_1.useState)(undefined), error = _d[0], setError = _d[1];
38
30
  var _e = (0, react_1.useState)(), controller = _e[0], setController = _e[1];
39
- var isUnmounted = (0, useIsUnmount_1.default)();
31
+ var safeRunner = (0, useSafeRunner_1.default)();
40
32
  (0, react_1.useEffect)(function () {
41
33
  if (!controller || !opt.onAbort) {
42
34
  return;
@@ -50,34 +42,44 @@ var useAsync = function (asyncFn, opt) {
50
42
  var run = (0, useRtCb_1.default)(function (runParam) {
51
43
  if (runParam === void 0) { runParam = {}; }
52
44
  var currParam = opt.catchParam ? __assign(__assign({}, param), runParam) : runParam;
53
- setLoading(true);
54
- setError(undefined);
55
45
  if (controller) {
56
46
  controller.abort();
57
47
  }
58
48
  var abortController = new AbortController();
59
- setController(abortController);
49
+ safeRunner(function () {
50
+ setLoading(true);
51
+ setError(undefined);
52
+ setController(abortController);
53
+ });
60
54
  return asyncFn(currParam, { signal: abortController.signal })
61
55
  .then(function (resData) {
62
- if (isUnmounted() || abortController.signal.aborted)
56
+ if (abortController.signal.aborted)
63
57
  return;
64
- setData(opt.format ? opt.format(resData) : resData);
65
- setParam(currParam);
58
+ safeRunner(function () {
59
+ setData(opt.format ? opt.format(resData) : resData);
60
+ setParam(currParam);
61
+ });
66
62
  }, function (err) {
67
- if (isUnmounted() || abortController.signal.aborted)
63
+ if (abortController.signal.aborted)
68
64
  return;
69
- setError(err);
65
+ safeRunner(function () {
66
+ setError(err);
67
+ });
70
68
  }).finally(function () {
71
- if (isUnmounted())
72
- return;
73
- setLoading(false);
74
- setController(undefined);
69
+ safeRunner(function () {
70
+ setLoading(false);
71
+ setController(undefined);
72
+ });
75
73
  });
76
74
  });
77
75
  var refresh = (0, useRtCb_1.default)(function () { return run(param); });
78
- (0, useCreate_1.default)(function () {
79
- if (opt.immediate) {
80
- run(param);
76
+ var cancel = (0, useRtCb_1.default)(function () {
77
+ if (controller) {
78
+ controller.abort();
79
+ safeRunner(function () {
80
+ setController(undefined);
81
+ setLoading(false);
82
+ });
81
83
  }
82
84
  });
83
85
  (0, useUnmount_1.default)(function () {
@@ -85,6 +87,6 @@ var useAsync = function (asyncFn, opt) {
85
87
  controller.abort();
86
88
  }
87
89
  });
88
- return [data, { run: run, refresh: refresh, loading: loading, error: error, param: param, controller: controller }];
90
+ return [data, { run: run, refresh: refresh, cancel: cancel, loading: loading, error: error, param: param, controller: controller }];
89
91
  };
90
92
  exports.default = useAsync;
package/lib/useRtRef.js CHANGED
@@ -9,7 +9,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  var react_1 = require("react");
10
10
  var useRtRef = function (val) {
11
11
  var ref = (0, react_1.useRef)(val);
12
- ref.current = val;
12
+ (0, react_1.useEffect)(function () {
13
+ ref.current = val;
14
+ });
13
15
  return ref;
14
16
  };
15
17
  exports.default = useRtRef;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jelper/hooks",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "react hooks helper",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -1,13 +1,6 @@
1
- /**
2
- * @Author: apathyjade
3
- * @Date: 2025-03-18 23:44:38
4
- * @Last Modified by: apathyjade
5
- * @Last Modified time: 2025-05-29 17:58:54
6
- */
7
1
  type Parameter<T extends (p: any) => any> = Parameters<T>[0];
8
2
  interface Opt<T extends (p: any) => any, R> {
9
3
  defParam?: Partial<Parameter<T>>;
10
- immediate?: boolean;
11
4
  format?: (p: ReturnType<T>) => R;
12
5
  catchParam?: boolean;
13
6
  onAbort?: (this: AbortSignal, ev: Event) => any;
@@ -19,6 +12,7 @@ declare const useAsync: <T extends (p: any, opt?: {
19
12
  {
20
13
  run: (runParam?: Partial<Parameter<T>>) => Promise<void>;
21
14
  refresh: () => Promise<void>;
15
+ cancel: () => void;
22
16
  loading: boolean;
23
17
  error?: Error;
24
18
  param: Partial<Parameter<T>>;