extra-react-hooks 0.6.9 → 0.7.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.
package/README.md CHANGED
@@ -67,12 +67,12 @@ function useEffectAsync(
67
67
  ): void
68
68
  ```
69
69
 
70
- ### useCallbackAsync
70
+ ### useAbortableCallback
71
71
  ```ts
72
- function useCallbackAsync<Args extends unknown[]>(
73
- callback: (...args: [...args: Args, signal: AbortSignal]) => Promise<void>
72
+ function useAbortableCallback<Args extends unknown[], Result>(
73
+ callback: (...args: [...args: Args, signal: AbortSignal]) => PromiseLike<Result>
74
74
  , deps: DependencyList
75
- ): (...args: Args) => void
75
+ ): (...args: [...args: Args, signal: AbortSignal | Falsy]) => Promise<Result>
76
76
  ```
77
77
 
78
78
  ### useUpdateEffect
package/lib/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export * from './use-mount.js';
6
6
  export * from './use-mount-async.js';
7
7
  export * from './use-unmount.js';
8
8
  export * from './use-effect-async.js';
9
- export * from './use-callback-async.js';
9
+ export * from './use-abortable-callback.js';
10
10
  export * from './use-update-effect.js';
11
11
  export * from './use-single-selection.js';
12
12
  export * from './use-multiple-selection.js';
package/lib/index.js CHANGED
@@ -6,7 +6,7 @@ export * from './use-mount.js';
6
6
  export * from './use-mount-async.js';
7
7
  export * from './use-unmount.js';
8
8
  export * from './use-effect-async.js';
9
- export * from './use-callback-async.js';
9
+ export * from './use-abortable-callback.js';
10
10
  export * from './use-update-effect.js';
11
11
  export * from './use-single-selection.js';
12
12
  export * from './use-multiple-selection.js';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mCAAmC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mCAAmC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { DependencyList } from 'react';
2
+ import { Falsy } from '@blackglory/prelude';
3
+ export declare function useAbortableCallback<Args extends unknown[], Result>(callback: (...args: [...args: Args, signal: AbortSignal]) => PromiseLike<Result>, deps: DependencyList): (...args: [...args: Args, signal: AbortSignal | Falsy]) => Promise<Result>;
@@ -0,0 +1,16 @@
1
+ import { useCallback } from 'react';
2
+ import { AbortController, raceAbortSignals } from 'extra-abort';
3
+ import { useMemoWithCleanup } from './use-memo-with-cleanup.js';
4
+ export function useAbortableCallback(callback, deps) {
5
+ const controller = useMemoWithCleanup(() => new AbortController(), controller => controller.abort(), deps);
6
+ return useCallback(async (...args) => {
7
+ const signal = raceAbortSignals([
8
+ args[args.length - 1],
9
+ controller.signal
10
+ ]);
11
+ signal.throwIfAborted();
12
+ const realArgs = args.slice(0, -1);
13
+ return await callback(...realArgs, signal);
14
+ }, [controller, ...deps]);
15
+ }
16
+ //# sourceMappingURL=use-abortable-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-abortable-callback.js","sourceRoot":"","sources":["../src/use-abortable-callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAG/D,MAAM,UAAU,oBAAoB,CAClC,QAAgF,EAChF,IAAoB;IAEpB,MAAM,UAAU,GAAG,kBAAkB,CACnC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,EAC3B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAChC,IAAI,CACL,CAAA;IAED,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,IAAkD,EAAE,EAAE;QACjF,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAwB;YAC5C,UAAU,CAAC,MAAM;SAClB,CAAC,CAAA;QACF,MAAM,CAAC,cAAc,EAAE,CAAA;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAS,CAAA;QAE1C,OAAO,MAAM,QAAQ,CAAC,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;AAC3B,CAAC"}
@@ -9,6 +9,7 @@ export function useEffectAsync(effect, deps) {
9
9
  const controller = new AbortController();
10
10
  go(async () => {
11
11
  try {
12
+ controller.signal.throwIfAborted();
12
13
  await effect(controller.signal);
13
14
  }
14
15
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"use-effect-async.js","sourceRoot":"","sources":["../src/use-effect-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,MAAM,kBAAmB,SAAQ,WAAW;CAAG;AAE/C,MAAM,UAAU,cAAc,CAC5B,MAA8C,EAC9C,IAAqB;IAErB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QAExC,EAAE,CAAC,KAAK,IAAI,EAAE;YACZ,IAAI;gBACF,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;aAChC;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,GAAG,YAAY,kBAAkB,EAAE;oBACrC,IAAI,EAAE,CAAA;iBACP;qBAAM;oBACL,MAAM,GAAG,CAAA;iBACV;aACF;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAA;IACzD,CAAC,EAAE,IAAI,CAAC,CAAA;AACV,CAAC"}
1
+ {"version":3,"file":"use-effect-async.js","sourceRoot":"","sources":["../src/use-effect-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,MAAM,kBAAmB,SAAQ,WAAW;CAAG;AAE/C,MAAM,UAAU,cAAc,CAC5B,MAA8C,EAC9C,IAAqB;IAErB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QAExC,EAAE,CAAC,KAAK,IAAI,EAAE;YACZ,IAAI;gBACF,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;gBAElC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;aAChC;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,GAAG,YAAY,kBAAkB,EAAE;oBACrC,IAAI,EAAE,CAAA;iBACP;qBAAM;oBACL,MAAM,GAAG,CAAA;iBACV;aACF;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAA;IACzD,CAAC,EAAE,IAAI,CAAC,CAAA;AACV,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-react-hooks",
3
- "version": "0.6.9",
3
+ "version": "0.7.1",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [
@@ -12,7 +12,7 @@
12
12
  "types": "lib/index.d.ts",
13
13
  "sideEffects": false,
14
14
  "engines": {
15
- "node": ">=16"
15
+ "node": ">=18.17.0"
16
16
  },
17
17
  "repository": "git@github.com:BlackGlory/extra-react-hooks.git",
18
18
  "author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
@@ -54,6 +54,7 @@
54
54
  "react": "^18.2.0",
55
55
  "react-dom": "^18.2.0",
56
56
  "react-test-renderer": "^18.2.0",
57
+ "return-style": "^3.0.1",
57
58
  "rimraf": "^4.3.0",
58
59
  "standard-version": "^9.3.2",
59
60
  "ts-loader": "^9.4.3",
@@ -66,9 +67,10 @@
66
67
  },
67
68
  "dependencies": {
68
69
  "@blackglory/errors": "^3.0.3",
69
- "@blackglory/prelude": "^0.3.3",
70
- "extra-abort": "^0.3.7",
70
+ "@blackglory/prelude": "^0.4.0",
71
+ "extra-abort": "^0.4.0",
71
72
  "extra-fsm": "^0.2.1",
73
+ "extra-utils": "^5.17.0",
72
74
  "rxjs": "^7.8.1"
73
75
  },
74
76
  "peerDependencies": {
package/src/index.ts CHANGED
@@ -6,7 +6,7 @@ export * from './use-mount.js'
6
6
  export * from './use-mount-async.js'
7
7
  export * from './use-unmount.js'
8
8
  export * from './use-effect-async.js'
9
- export * from './use-callback-async.js'
9
+ export * from './use-abortable-callback.js'
10
10
  export * from './use-update-effect.js'
11
11
  export * from './use-single-selection.js'
12
12
  export * from './use-multiple-selection.js'
@@ -0,0 +1,27 @@
1
+ import { useCallback, DependencyList } from 'react'
2
+ import { AbortController, raceAbortSignals } from 'extra-abort'
3
+ import { useMemoWithCleanup } from './use-memo-with-cleanup.js'
4
+ import { Falsy } from '@blackglory/prelude'
5
+
6
+ export function useAbortableCallback<Args extends unknown[], Result>(
7
+ callback: (...args: [...args: Args, signal: AbortSignal]) => PromiseLike<Result>
8
+ , deps: DependencyList
9
+ ): (...args: [...args: Args, signal: AbortSignal | Falsy]) => Promise<Result> {
10
+ const controller = useMemoWithCleanup(
11
+ () => new AbortController()
12
+ , controller => controller.abort()
13
+ , deps
14
+ )
15
+
16
+ return useCallback(async (...args: [...args: Args, signal: AbortSignal | Falsy]) => {
17
+ const signal = raceAbortSignals([
18
+ args[args.length - 1] as AbortSignal | Falsy
19
+ , controller.signal
20
+ ])
21
+ signal.throwIfAborted()
22
+
23
+ const realArgs = args.slice(0, -1) as Args
24
+
25
+ return await callback(...realArgs, signal)
26
+ }, [controller, ...deps])
27
+ }
@@ -14,6 +14,8 @@ export function useEffectAsync(
14
14
 
15
15
  go(async () => {
16
16
  try {
17
+ controller.signal.throwIfAborted()
18
+
17
19
  await effect(controller.signal)
18
20
  } catch (err) {
19
21
  if (err instanceof InternalAbortError) {
@@ -1,2 +0,0 @@
1
- import { DependencyList } from 'react';
2
- export declare function useCallbackAsync<Args extends unknown[]>(callback: (...args: [...args: Args, signal: AbortSignal]) => Promise<void>, deps: DependencyList): (...args: Args) => void;
@@ -1,26 +0,0 @@
1
- import { useCallback } from 'react';
2
- import { go, pass } from '@blackglory/prelude';
3
- import { AbortController } from 'extra-abort';
4
- import { useMemoWithCleanup } from './use-memo-with-cleanup.js';
5
- import { CustomError } from '@blackglory/errors';
6
- class InternalAbortError extends CustomError {
7
- }
8
- export function useCallbackAsync(callback, deps) {
9
- const controller = useMemoWithCleanup(() => new AbortController(), controller => controller.abort(new InternalAbortError()), deps);
10
- return useCallback((...args) => {
11
- go(async () => {
12
- try {
13
- await callback(...args, controller.signal);
14
- }
15
- catch (err) {
16
- if (err instanceof InternalAbortError) {
17
- pass();
18
- }
19
- else {
20
- throw err;
21
- }
22
- }
23
- });
24
- }, deps);
25
- }
26
- //# sourceMappingURL=use-callback-async.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-callback-async.js","sourceRoot":"","sources":["../src/use-callback-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,MAAM,kBAAmB,SAAQ,WAAW;CAAG;AAE/C,MAAM,UAAU,gBAAgB,CAC9B,QAA0E,EAC1E,IAAoB;IAEpB,MAAM,UAAU,GAAG,kBAAkB,CACnC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,EAC3B,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC,EACxD,IAAI,CACL,CAAA;IAED,OAAO,WAAW,CAAC,CAAC,GAAG,IAAU,EAAE,EAAE;QACnC,EAAE,CAAC,KAAK,IAAI,EAAE;YACZ,IAAI;gBACF,MAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;aAC3C;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,GAAG,YAAY,kBAAkB,EAAE;oBACrC,IAAI,EAAE,CAAA;iBACP;qBAAM;oBACL,MAAM,GAAG,CAAA;iBACV;aACF;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,IAAI,CAAC,CAAA;AACV,CAAC"}
@@ -1,32 +0,0 @@
1
- import { useCallback, DependencyList } from 'react'
2
- import { go, pass } from '@blackglory/prelude'
3
- import { AbortController } from 'extra-abort'
4
- import { useMemoWithCleanup } from './use-memo-with-cleanup.js'
5
- import { CustomError } from '@blackglory/errors'
6
-
7
- class InternalAbortError extends CustomError {}
8
-
9
- export function useCallbackAsync<Args extends unknown[]>(
10
- callback: (...args: [...args: Args, signal: AbortSignal]) => Promise<void>
11
- , deps: DependencyList
12
- ): (...args: Args) => void {
13
- const controller = useMemoWithCleanup(
14
- () => new AbortController()
15
- , controller => controller.abort(new InternalAbortError())
16
- , deps
17
- )
18
-
19
- return useCallback((...args: Args) => {
20
- go(async () => {
21
- try {
22
- await callback(...args, controller.signal)
23
- } catch (err) {
24
- if (err instanceof InternalAbortError) {
25
- pass()
26
- } else {
27
- throw err
28
- }
29
- }
30
- })
31
- }, deps)
32
- }