@xyo-network/react-shared 2.54.0 → 2.55.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.
@@ -1,11 +1,11 @@
1
1
  import { PayloadHasher } from '@xyo-network/core';
2
2
  import { usePromise } from './usePromise';
3
3
  export const usePayloadHash = (payload, dependencies) => {
4
- return usePromise(payload ? PayloadHasher.hashAsync(payload) : undefined, [payload, ...(dependencies ?? [])])[0];
4
+ return usePromise(() => (payload ? PayloadHasher.hashAsync(payload) : undefined), dependencies)[0];
5
5
  };
6
6
  export const usePayloadHashes = (payloads, dependencies) => {
7
- return usePromise(payloads
7
+ return usePromise(() => payloads
8
8
  ? Promise.all(payloads.map(async (payload) => [payload, await PayloadHasher.hashAsync(payload)]))
9
- : undefined, [payloads, ...(dependencies ?? [])])[0];
9
+ : undefined, dependencies)[0];
10
10
  };
11
11
  //# sourceMappingURL=usePayloadHash.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePayloadHash.js","sourceRoot":"","sources":["../../../src/hooks/usePayloadHash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAA2B,OAAoC,EAAE,YAAwB,EAAE,EAAE;IACzH,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAA2B,QAAuC,EAAE,YAAwB,EAAE,EAAE;IAC9H,OAAO,UAAU,CACf,QAAQ;QACN,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAA8B,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9H,CAAC,CAAC,SAAS,EACb,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CACpC,CAAC,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
1
+ {"version":3,"file":"usePayloadHash.js","sourceRoot":"","sources":["../../../src/hooks/usePayloadHash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAIjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAA2B,OAAoC,EAAE,YAA6B,EAAE,EAAE;IAC9H,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AACpG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAA2B,QAAuC,EAAE,YAA6B,EAAE,EAAE;IACnI,OAAO,UAAU,CACf,GAAG,EAAE,CACH,QAAQ;QACN,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAA8B,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9H,CAAC,CAAC,SAAS,EACf,YAAY,CACb,CAAC,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
@@ -1,74 +1,101 @@
1
1
  // Inspired from https://github.com/bsonntag/react-use-promise
2
- import { useAsyncEffect } from '@xylabs/react-async-effect';
3
- import { useReducer } from 'react';
2
+ import { useEffect, useMemo, useReducer } from 'react';
4
3
  export var State;
5
4
  (function (State) {
6
5
  State["pending"] = "pending";
7
6
  State["rejected"] = "rejected";
8
7
  State["resolved"] = "resolved";
9
8
  })(State || (State = {}));
10
- const defaultState = {
11
- error: undefined,
12
- result: undefined,
13
- state: State.pending,
14
- };
15
- const reducer = (_state, action) => {
16
- switch (action.type) {
17
- case State.pending:
18
- return defaultState;
19
- case State.resolved:
20
- return {
21
- error: undefined,
22
- result: action.payload,
23
- state: State.resolved,
24
- };
25
- case State.rejected:
26
- return {
27
- error: action.payload,
28
- result: undefined,
29
- state: State.rejected,
30
- };
31
- default:
32
- throw Error(`Error parsing action ${JSON.stringify(action, null, 2)}`);
33
- }
34
- };
35
9
  /**
36
10
  * usePromise -
37
11
  */
38
- export const usePromise = (promise, dependencies = []) => {
39
- const [{ error, result, state }, dispatch] = useReducer(reducer, defaultState);
40
- useAsyncEffect(
41
- // eslint-disable-next-line react-hooks/exhaustive-deps
42
- async () => {
43
- if (!promise) {
44
- return;
12
+ export const usePromise = (promise, dependencies = [], debug = undefined) => {
13
+ const defaultState = {
14
+ error: undefined,
15
+ result: undefined,
16
+ state: State.pending,
17
+ };
18
+ const reducer = (_state, action) => {
19
+ switch (action.type) {
20
+ case State.pending:
21
+ return defaultState;
22
+ case State.resolved:
23
+ return {
24
+ error: undefined,
25
+ result: action.payload,
26
+ state: State.resolved,
27
+ };
28
+ case State.rejected:
29
+ return {
30
+ error: action.error,
31
+ result: undefined,
32
+ state: State.rejected,
33
+ };
34
+ default:
35
+ throw Error(`Error parsing action ${JSON.stringify(action, null, 2)}`);
45
36
  }
46
- let canceled = false;
47
- dispatch({ type: State.pending });
37
+ };
38
+ const [{ error, result, state }, dispatch] = useReducer(reducer, defaultState);
39
+ const promiseMemo = useMemo(() => {
48
40
  try {
49
- const result = await promise;
50
- !canceled
51
- ? dispatch({
52
- payload: result,
53
- type: State.resolved,
54
- })
55
- : undefined;
41
+ return promise?.();
56
42
  }
57
43
  catch (e) {
58
- !canceled
59
- ? dispatch({
60
- payload: e,
44
+ dispatch({
45
+ error: e,
46
+ payload: undefined,
47
+ type: State.rejected,
48
+ });
49
+ }
50
+ }, dependencies);
51
+ if (debug)
52
+ console.debug(`usePromise [${debug}] Main Function`);
53
+ useEffect(() => {
54
+ dispatch({ type: State.pending });
55
+ if (debug)
56
+ console.debug(`usePromise [${debug}] useEffect`);
57
+ if (promiseMemo instanceof Promise) {
58
+ promiseMemo
59
+ .then((payload) => {
60
+ if (debug)
61
+ console.debug(`usePromise [${debug}] then`);
62
+ dispatch({
63
+ error: undefined,
64
+ payload,
65
+ type: State.resolved,
66
+ });
67
+ })
68
+ .catch((error) => {
69
+ if (debug)
70
+ console.debug(`usePromise [${debug}] catch`);
71
+ dispatch({
72
+ error: error,
73
+ payload: undefined,
61
74
  type: State.rejected,
62
- })
63
- : undefined;
75
+ });
76
+ });
77
+ }
78
+ else if (promiseMemo) {
79
+ dispatch({
80
+ error: undefined,
81
+ payload: promiseMemo,
82
+ type: State.resolved,
83
+ });
84
+ }
85
+ else {
86
+ if (debug)
87
+ console.debug(`usePromise [${debug}] no-promise`);
88
+ dispatch({
89
+ error: undefined,
90
+ payload: undefined,
91
+ type: State.resolved,
92
+ });
64
93
  }
65
94
  return () => {
66
- canceled = true;
95
+ if (debug)
96
+ console.debug(`usePromise [${debug}] useEffect callback`);
67
97
  };
68
- },
69
- // eslint can't inspect the array to verify dependencies are missing
70
- // eslint-disable-next-line react-hooks/exhaustive-deps
71
- dependencies);
98
+ }, [promiseMemo]);
72
99
  return [result, error, state];
73
100
  };
74
101
  //# sourceMappingURL=usePromise.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePromise.js","sourceRoot":"","sources":["../../../src/hooks/usePromise.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,MAAM,CAAN,IAAY,KAIX;AAJD,WAAY,KAAK;IACf,4BAAmB,CAAA;IACnB,8BAAqB,CAAA;IACrB,8BAAqB,CAAA;AACvB,CAAC,EAJW,KAAK,KAAL,KAAK,QAIhB;AAQD,MAAM,YAAY,GAAiB;IACjC,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,KAAK,CAAC,OAAO;CACrB,CAAA;AAMD,MAAM,OAAO,GAAG,CAAC,MAAoB,EAAE,MAAc,EAAE,EAAE;IACvD,QAAQ,MAAM,CAAC,IAAI,EAAE;QACnB,KAAK,KAAK,CAAC,OAAO;YAChB,OAAO,YAAY,CAAA;QAErB,KAAK,KAAK,CAAC,QAAQ;YACjB,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,MAAM,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,QAAQ;aACtB,CAAA;QAEH,KAAK,KAAK,CAAC,QAAQ;YACjB,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,OAAO;gBACrB,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,KAAK,CAAC,QAAQ;aACtB,CAAA;QAEH;YACE,MAAM,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;KACzE;AACH,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,OAA6B,EAC7B,eAA0B,EAAE,EACiC,EAAE;IAC/D,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAE9E,cAAc;IACZ,uDAAuD;IACvD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC,OAAO,EAAE;YACZ,OAAM;SACP;QAED,IAAI,QAAQ,GAAG,KAAK,CAAA;QAEpB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAEjC,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAA;YAC5B,CAAC,QAAQ;gBACP,CAAC,CAAC,QAAQ,CAAC;oBACP,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,KAAK,CAAC,QAAQ;iBACrB,CAAC;gBACJ,CAAC,CAAC,SAAS,CAAA;SACd;QAAC,OAAO,CAAC,EAAE;YACV,CAAC,QAAQ;gBACP,CAAC,CAAC,QAAQ,CAAC;oBACP,OAAO,EAAE,CAAU;oBACnB,IAAI,EAAE,KAAK,CAAC,QAAQ;iBACrB,CAAC;gBACJ,CAAC,CAAC,SAAS,CAAA;SACd;QAED,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC,CAAA;IACH,CAAC;IACD,oEAAoE;IACpE,uDAAuD;IACvD,YAAY,CACb,CAAA;IAED,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAC/B,CAAC,CAAA"}
1
+ {"version":3,"file":"usePromise.js","sourceRoot":"","sources":["../../../src/hooks/usePromise.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
+ import { DependencyList } from 'react';
1
2
  export declare const usePayloadHash: <TPayload extends import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & {
2
3
  schema: string;
3
- }>(payload: TPayload | null | undefined, dependencies?: unknown[]) => string | undefined;
4
+ }>(payload: TPayload | null | undefined, dependencies?: DependencyList) => string | undefined;
4
5
  export declare const usePayloadHashes: <TPayload extends import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & {
5
6
  schema: string;
6
- }>(payloads: TPayload[] | null | undefined, dependencies?: unknown[]) => [TPayload, string][] | undefined;
7
+ }>(payloads: TPayload[] | null | undefined, dependencies?: DependencyList) => [TPayload, string][] | undefined;
7
8
  //# sourceMappingURL=usePayloadHash.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePayloadHash.d.ts","sourceRoot":"","sources":["../../../src/hooks/usePayloadHash.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc;;wDAAmF,OAAO,EAAE,uBAEtH,CAAA;AAED,eAAO,MAAM,gBAAgB;;2DAAsF,OAAO,EAAE,qCAO3H,CAAA"}
1
+ {"version":3,"file":"usePayloadHash.d.ts","sourceRoot":"","sources":["../../../src/hooks/usePayloadHash.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAItC,eAAO,MAAM,cAAc;;wDAAmF,cAAc,uBAE3H,CAAA;AAED,eAAO,MAAM,gBAAgB;;2DAAsF,cAAc,qCAQhI,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { Promisable } from '@xyo-network/promise';
2
+ import { DependencyList } from 'react';
2
3
  export declare enum State {
3
4
  pending = "pending",
4
5
  rejected = "rejected",
@@ -7,5 +8,5 @@ export declare enum State {
7
8
  /**
8
9
  * usePromise -
9
10
  */
10
- export declare const usePromise: <TResult>(promise?: Promisable<TResult, never> | undefined, dependencies?: unknown[]) => [TResult | undefined, Error | undefined, State | undefined];
11
+ export declare const usePromise: <TResult>(promise: () => Promisable<TResult, never> | undefined, dependencies?: DependencyList, debug?: string | undefined) => [TResult | undefined, Error | undefined, State | undefined];
11
12
  //# sourceMappingURL=usePromise.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePromise.d.ts","sourceRoot":"","sources":["../../../src/hooks/usePromise.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjD,oBAAY,KAAK;IACf,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,QAAQ,aAAa;CACtB;AA0CD;;GAEG;AACH,eAAO,MAAM,UAAU,6EAEP,OAAO,EAAE,gEA0CxB,CAAA"}
1
+ {"version":3,"file":"usePromise.d.ts","sourceRoot":"","sources":["../../../src/hooks/usePromise.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,cAAc,EAA2C,MAAM,OAAO,CAAA;AAE/E,oBAAY,KAAK;IACf,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,QAAQ,aAAa;CACtB;AAUD;;GAEG;AACH,eAAO,MAAM,UAAU,0GAGd,MAAM,GAAG,SAAS,gEAyF1B,CAAA"}
package/package.json CHANGED
@@ -12,21 +12,20 @@
12
12
  "dependencies": {
13
13
  "@xylabs/pixel": "^1.4.13",
14
14
  "@xylabs/react-appbar": "^2.17.3",
15
- "@xylabs/react-async-effect": "^2.17.3",
16
15
  "@xylabs/react-button": "^2.17.3",
17
16
  "@xylabs/react-flexbox": "^2.17.3",
18
17
  "@xylabs/react-link": "^2.17.3",
19
18
  "@xylabs/react-shared": "^2.17.3",
20
- "@xyo-network/core": "^2.62.1",
21
- "@xyo-network/payload-model": "^2.62.1",
22
- "@xyo-network/promise": "^2.62.1",
23
- "@xyo-network/react-event": "^2.54.0"
19
+ "@xyo-network/core": "^2.63.1",
20
+ "@xyo-network/payload-model": "^2.63.1",
21
+ "@xyo-network/promise": "^2.63.1",
22
+ "@xyo-network/react-event": "^2.55.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@storybook/react": "^7.0.21",
25
+ "@storybook/react": "^7.0.23",
27
26
  "@xylabs/react-quick-tip-button": "^2.17.3",
28
- "@xylabs/ts-scripts-yarn3": "^2.17.13",
29
- "@xylabs/tsconfig-react": "^2.17.13",
27
+ "@xylabs/ts-scripts-yarn3": "^2.17.17",
28
+ "@xylabs/tsconfig-react": "^2.17.17",
30
29
  "typescript": "^5.1.3"
31
30
  },
32
31
  "peerDependencies": {
@@ -81,5 +80,5 @@
81
80
  },
82
81
  "sideEffects": false,
83
82
  "types": "dist/types/index.d.ts",
84
- "version": "2.54.0"
83
+ "version": "2.55.0"
85
84
  }
@@ -1,17 +1,19 @@
1
1
  import { PayloadHasher } from '@xyo-network/core'
2
2
  import { Payload } from '@xyo-network/payload-model'
3
+ import { DependencyList } from 'react'
3
4
 
4
5
  import { usePromise } from './usePromise'
5
6
 
6
- export const usePayloadHash = <TPayload extends Payload>(payload: TPayload | undefined | null, dependencies?: unknown[]) => {
7
- return usePromise(payload ? PayloadHasher.hashAsync(payload) : undefined, [payload, ...(dependencies ?? [])])[0]
7
+ export const usePayloadHash = <TPayload extends Payload>(payload: TPayload | undefined | null, dependencies?: DependencyList) => {
8
+ return usePromise(() => (payload ? PayloadHasher.hashAsync(payload) : undefined), dependencies)[0]
8
9
  }
9
10
 
10
- export const usePayloadHashes = <TPayload extends Payload>(payloads: TPayload[] | undefined | null, dependencies?: unknown[]) => {
11
+ export const usePayloadHashes = <TPayload extends Payload>(payloads: TPayload[] | undefined | null, dependencies?: DependencyList) => {
11
12
  return usePromise(
12
- payloads
13
- ? Promise.all(payloads.map<Promise<[TPayload, string]>>(async (payload) => [payload, await PayloadHasher.hashAsync(payload)]))
14
- : undefined,
15
- [payloads, ...(dependencies ?? [])],
13
+ () =>
14
+ payloads
15
+ ? Promise.all(payloads.map<Promise<[TPayload, string]>>(async (payload) => [payload, await PayloadHasher.hashAsync(payload)]))
16
+ : undefined,
17
+ dependencies,
16
18
  )[0]
17
19
  }
@@ -1,8 +1,7 @@
1
1
  // Inspired from https://github.com/bsonntag/react-use-promise
2
2
 
3
- import { useAsyncEffect } from '@xylabs/react-async-effect'
4
3
  import { Promisable } from '@xyo-network/promise'
5
- import { useReducer } from 'react'
4
+ import { DependencyList, Reducer, useEffect, useMemo, useReducer } from 'react'
6
5
 
7
6
  export enum State {
8
7
  pending = 'pending',
@@ -16,85 +15,101 @@ interface PromiseState<T = void> {
16
15
  state?: State
17
16
  }
18
17
 
19
- const defaultState: PromiseState = {
20
- error: undefined,
21
- result: undefined,
22
- state: State.pending,
23
- }
24
-
25
- // Since the resolved promise value can be anything, any seems appropriate
26
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
- type Action = { payload?: any; type: State }
28
-
29
- const reducer = (_state: PromiseState, action: Action) => {
30
- switch (action.type) {
31
- case State.pending:
32
- return defaultState
33
-
34
- case State.resolved:
35
- return {
36
- error: undefined,
37
- result: action.payload,
38
- state: State.resolved,
39
- }
40
-
41
- case State.rejected:
42
- return {
43
- error: action.payload,
44
- result: undefined,
45
- state: State.rejected,
46
- }
47
-
48
- default:
49
- throw Error(`Error parsing action ${JSON.stringify(action, null, 2)}`)
50
- }
51
- }
18
+ type Action<T> = { error?: Error; payload?: T; type: State }
52
19
 
53
20
  /**
54
21
  * usePromise -
55
22
  */
56
23
  export const usePromise = <TResult>(
57
- promise?: Promisable<TResult>,
58
- dependencies: unknown[] = [],
24
+ promise: () => Promisable<TResult> | undefined,
25
+ dependencies: DependencyList = [],
26
+ debug: string | undefined = undefined,
59
27
  ): [TResult | undefined, Error | undefined, State | undefined] => {
60
- const [{ error, result, state }, dispatch] = useReducer(reducer, defaultState)
61
-
62
- useAsyncEffect(
63
- // eslint-disable-next-line react-hooks/exhaustive-deps
64
- async () => {
65
- if (!promise) {
66
- return
67
- }
68
-
69
- let canceled = false
28
+ const defaultState: PromiseState<TResult> = {
29
+ error: undefined,
30
+ result: undefined,
31
+ state: State.pending,
32
+ }
70
33
 
71
- dispatch({ type: State.pending })
34
+ const reducer: Reducer<PromiseState<TResult>, Action<TResult>> = (_state: PromiseState<TResult>, action: Action<TResult>) => {
35
+ switch (action.type) {
36
+ case State.pending:
37
+ return defaultState
38
+
39
+ case State.resolved:
40
+ return {
41
+ error: undefined,
42
+ result: action.payload,
43
+ state: State.resolved,
44
+ }
45
+
46
+ case State.rejected:
47
+ return {
48
+ error: action.error,
49
+ result: undefined,
50
+ state: State.rejected,
51
+ }
52
+
53
+ default:
54
+ throw Error(`Error parsing action ${JSON.stringify(action, null, 2)}`)
55
+ }
56
+ }
72
57
 
73
- try {
74
- const result = await promise
75
- !canceled
76
- ? dispatch({
77
- payload: result,
78
- type: State.resolved,
79
- })
80
- : undefined
81
- } catch (e) {
82
- !canceled
83
- ? dispatch({
84
- payload: e as Error,
85
- type: State.rejected,
86
- })
87
- : undefined
88
- }
58
+ const [{ error, result, state }, dispatch] = useReducer(reducer, defaultState)
89
59
 
90
- return () => {
91
- canceled = true
92
- }
93
- },
94
- // eslint can't inspect the array to verify dependencies are missing
95
- // eslint-disable-next-line react-hooks/exhaustive-deps
96
- dependencies,
97
- )
60
+ const promiseMemo = useMemo(() => {
61
+ try {
62
+ return promise?.()
63
+ } catch (e) {
64
+ dispatch({
65
+ error: e as Error,
66
+ payload: undefined,
67
+ type: State.rejected,
68
+ })
69
+ }
70
+ }, dependencies)
71
+
72
+ if (debug) console.debug(`usePromise [${debug}] Main Function`)
73
+
74
+ useEffect(() => {
75
+ dispatch({ type: State.pending })
76
+ if (debug) console.debug(`usePromise [${debug}] useEffect`)
77
+ if (promiseMemo instanceof Promise) {
78
+ promiseMemo
79
+ .then((payload) => {
80
+ if (debug) console.debug(`usePromise [${debug}] then`)
81
+ dispatch({
82
+ error: undefined,
83
+ payload,
84
+ type: State.resolved,
85
+ })
86
+ })
87
+ .catch((error) => {
88
+ if (debug) console.debug(`usePromise [${debug}] catch`)
89
+ dispatch({
90
+ error: error as Error,
91
+ payload: undefined,
92
+ type: State.rejected,
93
+ })
94
+ })
95
+ } else if (promiseMemo) {
96
+ dispatch({
97
+ error: undefined,
98
+ payload: promiseMemo,
99
+ type: State.resolved,
100
+ })
101
+ } else {
102
+ if (debug) console.debug(`usePromise [${debug}] no-promise`)
103
+ dispatch({
104
+ error: undefined,
105
+ payload: undefined,
106
+ type: State.resolved,
107
+ })
108
+ }
109
+ return () => {
110
+ if (debug) console.debug(`usePromise [${debug}] useEffect callback`)
111
+ }
112
+ }, [promiseMemo])
98
113
 
99
114
  return [result, error, state]
100
115
  }