@ahoo-wang/fetcher-react 2.5.3 → 2.5.6

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,3 @@
1
+ export * from './useExecutePromise';
2
+ export * from './usePromiseState';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAaA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { PromiseState } from './usePromiseState';
2
+ /**
3
+ * Type definition for a function that returns a Promise
4
+ * @template R - The type of value the promise will resolve to
5
+ */
6
+ export type PromiseSupplier<R> = () => Promise<R>;
7
+ /**
8
+ * Interface defining the return type of useExecutePromise hook
9
+ * @template R - The type of the result value
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const { loading, result, error, execute, reset } = useExecutePromise<string>();
14
+ * ```
15
+ */
16
+ export interface UseExecutePromiseReturn<R> extends PromiseState<R> {
17
+ /** Function to execute a promise supplier */
18
+ execute: (provider: PromiseSupplier<R>) => Promise<R>;
19
+ /** Function to reset the state to initial values */
20
+ reset: () => void;
21
+ }
22
+ /**
23
+ * A React hook for managing asynchronous operations with proper state handling
24
+ * @template R - The type of the result value
25
+ * @returns An object containing the current state and control functions
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { useExecutePromise } from '@ahoo-wang/fetcher-react';
30
+ *
31
+ * function MyComponent() {
32
+ * const { loading, result, error, execute, reset } = useExecutePromise<string>();
33
+ *
34
+ * const fetchData = async () => {
35
+ * const response = await fetch('/api/data');
36
+ * return response.text();
37
+ * };
38
+ *
39
+ * const handleFetch = () => {
40
+ * execute(fetchData);
41
+ * };
42
+ *
43
+ * const handleReset = () => {
44
+ * reset();
45
+ * };
46
+ *
47
+ * if (loading) return <div>Loading...</div>;
48
+ * if (error) return <div>Error: {error.message}</div>;
49
+ * return (
50
+ * <div>
51
+ * <button onClick={handleFetch}>Fetch Data</button>
52
+ * <button onClick={handleReset}>Reset</button>
53
+ * {result && <p>{result}</p>}
54
+ * </div>
55
+ * );
56
+ * }
57
+ * ```
58
+ */
59
+ export declare function useExecutePromise<R = unknown>(): UseExecutePromiseReturn<R>;
60
+ //# sourceMappingURL=useExecutePromise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExecutePromise.d.ts","sourceRoot":"","sources":["../../src/core/useExecutePromise.ts"],"names":[],"mappings":"AAeA,OAAO,EAAmB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACjE,6CAA6C;IAC7C,OAAO,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACtD,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,KAAK,uBAAuB,CAAC,CAAC,CAAC,CAiD3E"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Enumeration of possible promise execution states
3
+ */
4
+ export declare enum PromiseStatus {
5
+ IDLE = "idle",
6
+ LOADING = "loading",
7
+ SUCCESS = "success",
8
+ ERROR = "error"
9
+ }
10
+ export interface PromiseState<R> {
11
+ /** Current status of the promise */
12
+ status: PromiseStatus;
13
+ /** Indicates if currently loading */
14
+ loading: boolean;
15
+ /** The result value */
16
+ result: R | undefined;
17
+ /** The error value */
18
+ error: unknown | undefined;
19
+ }
20
+ /**
21
+ * Options for configuring usePromiseState behavior
22
+ * @template R - The type of result
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const options: UsePromiseStateOptions<string> = {
27
+ * initialStatus: PromiseStatus.IDLE,
28
+ * onSuccess: (result) => console.log('Success:', result),
29
+ * onError: (error) => console.error('Error:', error),
30
+ * };
31
+ * ```
32
+ */
33
+ export interface UsePromiseStateOptions<R> {
34
+ /** Initial status, defaults to IDLE */
35
+ initialStatus?: PromiseStatus;
36
+ /** Callback invoked on success */
37
+ onSuccess?: (result: R) => void;
38
+ /** Callback invoked on error */
39
+ onError?: (error: unknown) => void;
40
+ }
41
+ /**
42
+ * Return type for usePromiseState hook
43
+ * @template R - The type of result
44
+ */
45
+ export interface UsePromiseStateReturn<R> extends PromiseState<R> {
46
+ /** Set status to LOADING */
47
+ setLoading: () => void;
48
+ /** Set status to SUCCESS with result */
49
+ setSuccess: (result: R) => void;
50
+ /** Set status to ERROR with error */
51
+ setError: (error: unknown) => void;
52
+ /** Set status to IDLE */
53
+ setIdle: () => void;
54
+ }
55
+ /**
56
+ * A React hook for managing promise state without execution logic
57
+ * @template R - The type of result
58
+ * @param options - Configuration options
59
+ * @returns State management object
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';
64
+ *
65
+ * function MyComponent() {
66
+ * const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();
67
+ *
68
+ * const handleSuccess = () => setSuccess('Data loaded');
69
+ * const handleError = () => setError(new Error('Failed to load'));
70
+ *
71
+ * return (
72
+ * <div>
73
+ * <button onClick={handleSuccess}>Set Success</button>
74
+ * <button onClick={handleError}>Set Error</button>
75
+ * <button onClick={setIdle}>Reset</button>
76
+ * <p>Status: {status}</p>
77
+ * {loading && <p>Loading...</p>}
78
+ * {result && <p>Result: {result}</p>}
79
+ * {error && <p>Error: {error.message}</p>}
80
+ * </div>
81
+ * );
82
+ * }
83
+ * ```
84
+ */
85
+ export declare function usePromiseState<R = unknown>(options?: UsePromiseStateOptions<R>): UsePromiseStateReturn<R>;
86
+ //# sourceMappingURL=usePromiseState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePromiseState.d.ts","sourceRoot":"","sources":["../../src/core/usePromiseState.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,oCAAoC;IACpC,MAAM,EAAE,aAAa,CAAC;IACtB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB;IACvB,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;IACtB,sBAAsB;IACtB,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,uCAAuC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kCAAkC;IAClC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAChC,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC/D,4BAA4B;IAC5B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAChC,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EACzC,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAClC,qBAAqB,CAAC,CAAC,CAAC,CAyD1B"}
@@ -1,35 +1,42 @@
1
1
  import { FetcherCapable, FetchExchange, FetchRequest, RequestOptions } from '@ahoo-wang/fetcher';
2
+ import { PromiseState } from '../core';
2
3
  /**
3
4
  * Configuration options for the useFetcher hook.
4
5
  * Extends RequestOptions and FetcherCapable interfaces.
5
6
  */
6
7
  export interface UseFetcherOptions extends RequestOptions, FetcherCapable {
7
- /**
8
- * Whether the fetch operation should execute immediately upon component mount.
9
- * Defaults to true.
10
- */
11
- readonly immediate?: boolean;
12
8
  }
13
- /**
14
- * The result object returned by the useFetcher hook.
15
- * @template R - The type of the data returned by the fetch operation
16
- */
17
- export interface UseFetcherResult<R> {
18
- /** Indicates if the fetch operation is currently in progress */
19
- loading: boolean;
9
+ export interface UseFetcherReturn<R> extends PromiseState<R> {
20
10
  /** The FetchExchange object representing the ongoing fetch operation */
21
11
  exchange?: FetchExchange;
22
- /** The data returned by the fetch operation, or undefined if not yet loaded or an error occurred */
23
- result?: R;
24
- /** Any error that occurred during the fetch operation, or undefined if no error */
25
- error?: unknown;
26
- /**
27
- * Function to manually trigger the fetch operation.
28
- * Useful for fetching data on demand rather than automatically.
29
- */
30
- execute: () => Promise<void>;
31
- /** Function to cancel the ongoing fetch operation */
32
- cancel: () => void;
12
+ execute: (request: FetchRequest) => Promise<void>;
33
13
  }
34
- export declare function useFetcher<R>(request: FetchRequest, options?: UseFetcherOptions): UseFetcherResult<R>;
14
+ /**
15
+ * A React hook for managing asynchronous operations with proper state handling
16
+ * @param options - Configuration options for the fetcher
17
+ * @returns An object containing the current state and control functions
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { useFetcher } from '@ahoo-wang/fetcher-react';
22
+ *
23
+ * function MyComponent() {
24
+ * const { loading, result, error, execute } = useFetcher<string>();
25
+ *
26
+ * const handleFetch = () => {
27
+ * execute({ url: '/api/data', method: 'GET' });
28
+ * };
29
+ *
30
+ * if (loading) return <div>Loading...</div>;
31
+ * if (error) return <div>Error: {error.message}</div>;
32
+ * return (
33
+ * <div>
34
+ * <button onClick={handleFetch}>Fetch Data</button>
35
+ * {result && <p>{result}</p>}
36
+ * </div>
37
+ * );
38
+ * }
39
+ * ```
40
+ */
41
+ export declare function useFetcher<R>(options?: UseFetcherOptions): UseFetcherReturn<R>;
35
42
  //# sourceMappingURL=useFetcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFetcher.d.ts","sourceRoot":"","sources":["../../src/fetcher/useFetcher.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,cAAc,EACd,aAAa,EACb,YAAY,EAEZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAI5B;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc,EAAE,cAAc;IACvE;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IAEjB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,aAAa,CAAC;IAEzB,oGAAoG;IACpG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEX,mFAAmF;IACnF,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,qDAAqD;IACrD,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAC1B,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAAC,CAAC,CAAC,CA2ErB"}
1
+ {"version":3,"file":"useFetcher.d.ts","sourceRoot":"","sources":["../../src/fetcher/useFetcher.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,cAAc,EACd,aAAa,EACb,YAAY,EAEZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc,EAAE,cAAc;CACxE;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC1D,wEAAwE;IACxE,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAAC,CAAC,CAAC,CA8DrB"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './core';
1
2
  export * from './storage';
2
3
  export * from './fetcher';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
package/dist/index.es.js CHANGED
@@ -1,58 +1,130 @@
1
- import { useCallback as u, useSyncExternalStore as F, useRef as h, useEffect as v, useState as i } from "react";
2
- import { fetcher as p, getFetcher as A } from "@ahoo-wang/fetcher";
3
- function S(t) {
4
- const e = u(
5
- (n) => t.addListener(n),
6
- [t]
7
- ), s = u(() => t.get(), [t]), a = F(e, s, s), f = u(
8
- (n) => t.set(n),
9
- [t]
10
- );
11
- return [a, f];
12
- }
13
- function L() {
14
- var t = h(!1), e = u(function() {
1
+ import { useRef as v, useCallback as c, useEffect as b, useState as d, useSyncExternalStore as S } from "react";
2
+ import { fetcher as C, getFetcher as R } from "@ahoo-wang/fetcher";
3
+ function g() {
4
+ var t = v(!1), n = c(function() {
15
5
  return t.current;
16
6
  }, []);
17
- return v(function() {
7
+ return b(function() {
18
8
  return t.current = !0, function() {
19
9
  t.current = !1;
20
10
  };
21
- }, []), e;
11
+ }, []), n;
12
+ }
13
+ var m = /* @__PURE__ */ ((t) => (t.IDLE = "idle", t.LOADING = "loading", t.SUCCESS = "success", t.ERROR = "error", t))(m || {});
14
+ function x(t) {
15
+ const [n, r] = d(
16
+ t?.initialStatus ?? "idle"
17
+ /* IDLE */
18
+ ), [a, u] = d(void 0), [e, s] = d(void 0), o = g(), E = c(() => {
19
+ o() && (r(
20
+ "loading"
21
+ /* LOADING */
22
+ ), s(void 0));
23
+ }, [o]), l = c(
24
+ (f) => {
25
+ o() && (u(f), r(
26
+ "success"
27
+ /* SUCCESS */
28
+ ), s(void 0), t?.onSuccess?.(f));
29
+ },
30
+ [o, t]
31
+ ), i = c(
32
+ (f) => {
33
+ o() && (s(f), r(
34
+ "error"
35
+ /* ERROR */
36
+ ), u(void 0), t?.onError?.(f));
37
+ },
38
+ [o, t]
39
+ ), h = c(() => {
40
+ o() && (r(
41
+ "idle"
42
+ /* IDLE */
43
+ ), s(void 0), u(void 0));
44
+ }, [o]);
45
+ return {
46
+ status: n,
47
+ loading: n === "loading",
48
+ result: a,
49
+ error: e,
50
+ setLoading: E,
51
+ setSuccess: l,
52
+ setError: i,
53
+ setIdle: h
54
+ };
55
+ }
56
+ function L() {
57
+ const t = x(), n = g(), r = c(
58
+ async (u) => {
59
+ if (!n())
60
+ throw new Error("Component is unmounted");
61
+ t.setLoading();
62
+ try {
63
+ const e = await u();
64
+ return n() && t.setSuccess(e), e;
65
+ } catch (e) {
66
+ throw n() && t.setError(e), e;
67
+ }
68
+ },
69
+ [t, n]
70
+ ), a = c(() => {
71
+ n() && t.setIdle();
72
+ }, [t, n]);
73
+ return {
74
+ loading: t.loading,
75
+ result: t.result,
76
+ error: t.error,
77
+ execute: r,
78
+ reset: a,
79
+ status: t.status
80
+ };
81
+ }
82
+ function I(t) {
83
+ const n = c(
84
+ (e) => t.addListener(e),
85
+ [t]
86
+ ), r = c(() => t.get(), [t]), a = S(n, r, r), u = c(
87
+ (e) => t.set(e),
88
+ [t]
89
+ );
90
+ return [a, u];
22
91
  }
23
- function V(t, e) {
24
- const { fetcher: s = p, immediate: a = !0 } = e || {}, [f, n] = i(!1), [m, d] = i(void 0), [x, g] = i(
92
+ function M(t) {
93
+ const { fetcher: n = C } = t || {}, r = x(), [a, u] = d(
25
94
  void 0
26
- ), [C, E] = i(void 0), c = L(), r = h(), b = A(s), l = u(async () => {
27
- r.current && r.current.abort(), r.current = t.abortController ?? new AbortController(), t.abortController = r.current, c() && (n(!0), d(void 0));
28
- try {
29
- const o = await b.exchange(t, e);
30
- c() && g(o);
31
- const w = await o.extractResult();
32
- c() && E(w);
33
- } catch (o) {
34
- if (o instanceof Error && o.name === "AbortError")
35
- return;
36
- c() && d(o);
37
- } finally {
38
- c() && n(!1), r.current === t.abortController && (r.current = void 0);
39
- }
40
- }, [b, t, c, e]), R = u(() => {
41
- r.current?.abort();
42
- }, []);
43
- return v(() => (a && l(), () => {
44
- r.current?.abort(), r.current = void 0;
45
- }), [l, t, a]), {
46
- loading: f,
47
- exchange: x,
48
- result: C,
49
- error: m,
50
- execute: l,
51
- cancel: R
95
+ ), e = g(), s = v(), o = R(n), E = c(
96
+ async (l) => {
97
+ s.current && s.current.abort(), s.current = l.abortController ?? new AbortController(), l.abortController = s.current, r.setLoading();
98
+ try {
99
+ const i = await o.exchange(l, t);
100
+ e() && u(i);
101
+ const h = await i.extractResult();
102
+ e() && r.setSuccess(h);
103
+ } catch (i) {
104
+ if (i instanceof Error && i.name === "AbortError") {
105
+ e() && r.setIdle();
106
+ return;
107
+ }
108
+ e() && r.setError(i);
109
+ } finally {
110
+ s.current === l.abortController && (s.current = void 0);
111
+ }
112
+ },
113
+ [o, e, t, r]
114
+ );
115
+ return b(() => () => {
116
+ s.current?.abort(), s.current = void 0;
117
+ }, []), {
118
+ ...r,
119
+ exchange: a,
120
+ execute: E
52
121
  };
53
122
  }
54
123
  export {
55
- V as useFetcher,
56
- S as useKeyStorage
124
+ m as PromiseStatus,
125
+ L as useExecutePromise,
126
+ M as useFetcher,
127
+ I as useKeyStorage,
128
+ x as usePromiseState
57
129
  };
58
130
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/storage/useKeyStorage.ts","../../../node_modules/.pnpm/react-use@17.6.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/react-use/esm/useMountedState.js","../src/fetcher/useFetcher.ts"],"sourcesContent":["/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\n\n/**\n * A React hook that provides state management for a KeyStorage instance.\n * Subscribes to storage changes and returns the current value along with a setter function.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple containing the current stored value and a function to update it\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void] {\n const subscribe = useCallback(\n (callback: () => void) => keyStorage.addListener(callback),\n [keyStorage],\n );\n const getSnapshot = useCallback(() => keyStorage.get(), [keyStorage]);\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage],\n );\n return [value, setValue];\n}\n","import { useCallback, useEffect, useRef } from 'react';\nexport default function useMountedState() {\n var mountedRef = useRef(false);\n var get = useCallback(function () { return mountedRef.current; }, []);\n useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcher as defaultFetcher,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions,\n} from '@ahoo-wang/fetcher';\nimport { useRef, useCallback, useEffect, useState } from 'react';\nimport { useMountedState } from 'react-use';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions extends RequestOptions, FetcherCapable {\n /**\n * Whether the fetch operation should execute immediately upon component mount.\n * Defaults to true.\n */\n readonly immediate?: boolean;\n}\n\n/**\n * The result object returned by the useFetcher hook.\n * @template R - The type of the data returned by the fetch operation\n */\nexport interface UseFetcherResult<R> {\n /** Indicates if the fetch operation is currently in progress */\n loading: boolean;\n\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n\n /** The data returned by the fetch operation, or undefined if not yet loaded or an error occurred */\n result?: R;\n\n /** Any error that occurred during the fetch operation, or undefined if no error */\n error?: unknown;\n\n /**\n * Function to manually trigger the fetch operation.\n * Useful for fetching data on demand rather than automatically.\n */\n execute: () => Promise<void>;\n\n /** Function to cancel the ongoing fetch operation */\n cancel: () => void;\n}\n\nexport function useFetcher<R>(\n request: FetchRequest,\n options?: UseFetcherOptions,\n): UseFetcherResult<R> {\n const { fetcher = defaultFetcher, immediate = true } = options || {};\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<unknown>(undefined);\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const isMounted = useMountedState();\n const abortControllerRef = useRef<AbortController | undefined>();\n\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(async () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n if (isMounted()) {\n setLoading(true);\n setError(undefined);\n }\n try {\n const exchange = await currentFetcher.exchange(request, options);\n if (isMounted()) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted()) {\n setResult(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n if (isMounted()) {\n setError(error);\n }\n } finally {\n if (isMounted()) {\n setLoading(false);\n }\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n }, [currentFetcher, request, isMounted, options]);\n /**\n * Cancel the ongoing fetch operation if one is in progress.\n */\n const cancel = useCallback(() => {\n abortControllerRef.current?.abort();\n }, []);\n useEffect(() => {\n if (immediate) {\n execute();\n }\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, [execute, request, immediate]);\n return {\n loading,\n exchange,\n result,\n error,\n execute,\n cancel,\n };\n}\n"],"names":["useKeyStorage","keyStorage","subscribe","useCallback","callback","getSnapshot","value","useSyncExternalStore","setValue","useMountedState","mountedRef","useRef","get","useEffect","useFetcher","request","options","fetcher","defaultFetcher","immediate","loading","setLoading","useState","error","setError","exchange","setExchange","result","setResult","isMounted","abortControllerRef","currentFetcher","getFetcher","execute","cancel"],"mappings":";;AAwBO,SAASA,EACdC,GACgC;AAChC,QAAMC,IAAYC;AAAA,IAChB,CAACC,MAAyBH,EAAW,YAAYG,CAAQ;AAAA,IACzD,CAACH,CAAU;AAAA,EAAA,GAEPI,IAAcF,EAAY,MAAMF,EAAW,OAAO,CAACA,CAAU,CAAC,GAC9DK,IAAQC,EAAqBL,GAAWG,GAAaA,CAAW,GAChEG,IAAWL;AAAA,IACf,CAACG,MAAaL,EAAW,IAAIK,CAAK;AAAA,IAClC,CAACL,CAAU;AAAA,EAAA;AAEb,SAAO,CAACK,GAAOE,CAAQ;AACzB;ACrCe,SAASC,IAAkB;AACtC,MAAIC,IAAaC,EAAO,EAAK,GACzBC,IAAMT,EAAY,WAAY;AAAE,WAAOO,EAAW;AAAA,EAAS,GAAG,EAAE;AACpE,SAAAG,EAAU,WAAY;AAClB,WAAAH,EAAW,UAAU,IACd,WAAY;AACf,MAAAA,EAAW,UAAU;AAAA,IACzB;AAAA,EACJ,GAAG,CAAA,CAAE,GACEE;AACX;ACoDO,SAASE,EACdC,GACAC,GACqB;AACrB,QAAM,EAAA,SAAEC,IAAUC,GAAgB,WAAAC,IAAY,GAAA,IAASH,KAAW,CAAA,GAC5D,CAACI,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtC,CAACC,GAAOC,CAAQ,IAAIF,EAAkB,MAAS,GAC/C,CAACG,GAAUC,CAAW,IAAIJ;AAAA,IAC9B;AAAA,EAAA,GAEI,CAACK,GAAQC,CAAS,IAAIN,EAAwB,MAAS,GACvDO,IAAYpB,EAAA,GACZqB,IAAqBnB,EAAA,GAErBoB,IAAiBC,EAAWf,CAAO,GAKnCgB,IAAU9B,EAAY,YAAY;AACtC,IAAI2B,EAAmB,WACrBA,EAAmB,QAAQ,MAAA,GAE7BA,EAAmB,UACjBf,EAAQ,mBAAmB,IAAI,gBAAA,GACjCA,EAAQ,kBAAkBe,EAAmB,SACzCD,QACFR,EAAW,EAAI,GACfG,EAAS,MAAS;AAEpB,QAAI;AACF,YAAMC,IAAW,MAAMM,EAAe,SAAShB,GAASC,CAAO;AAC/D,MAAIa,OACFH,EAAYD,CAAQ;AAEtB,YAAME,IAAS,MAAMF,EAAS,cAAA;AAC9B,MAAII,OACFD,EAAUD,CAAM;AAAA,IAEpB,SAASJ,GAAO;AACd,UAAIA,aAAiB,SAASA,EAAM,SAAS;AAC3C;AAEF,MAAIM,OACFL,EAASD,CAAK;AAAA,IAElB,UAAA;AACE,MAAIM,OACFR,EAAW,EAAK,GAEdS,EAAmB,YAAYf,EAAQ,oBACzCe,EAAmB,UAAU;AAAA,IAEjC;AAAA,EACF,GAAG,CAACC,GAAgBhB,GAASc,GAAWb,CAAO,CAAC,GAI1CkB,IAAS/B,EAAY,MAAM;AAC/B,IAAA2B,EAAmB,SAAS,MAAA;AAAA,EAC9B,GAAG,CAAA,CAAE;AACL,SAAAjB,EAAU,OACJM,KACFc,EAAA,GAEK,MAAM;AACX,IAAAH,EAAmB,SAAS,MAAA,GAC5BA,EAAmB,UAAU;AAAA,EAC/B,IACC,CAACG,GAASlB,GAASI,CAAS,CAAC,GACzB;AAAA,IACL,SAAAC;AAAA,IACA,UAAAK;AAAA,IACA,QAAAE;AAAA,IACA,OAAAJ;AAAA,IACA,SAAAU;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ;","x_google_ignoreList":[1]}
1
+ {"version":3,"file":"index.es.js","sources":["../../../node_modules/.pnpm/react-use@17.6.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/react-use/esm/useMountedState.js","../src/core/usePromiseState.ts","../src/core/useExecutePromise.ts","../src/storage/useKeyStorage.ts","../src/fetcher/useFetcher.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nexport default function useMountedState() {\n var mountedRef = useRef(false);\n var get = useCallback(function () { return mountedRef.current; }, []);\n useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMountedState } from 'react-use';\n\n/**\n * Enumeration of possible promise execution states\n */\nexport enum PromiseStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\nexport interface PromiseState<R> {\n /** Current status of the promise */\n status: PromiseStatus;\n /** Indicates if currently loading */\n loading: boolean;\n /** The result value */\n result: R | undefined;\n /** The error value */\n error: unknown | undefined;\n}\n\n/**\n * Options for configuring usePromiseState behavior\n * @template R - The type of result\n *\n * @example\n * ```typescript\n * const options: UsePromiseStateOptions<string> = {\n * initialStatus: PromiseStatus.IDLE,\n * onSuccess: (result) => console.log('Success:', result),\n * onError: (error) => console.error('Error:', error),\n * };\n * ```\n */\nexport interface UsePromiseStateOptions<R> {\n /** Initial status, defaults to IDLE */\n initialStatus?: PromiseStatus;\n /** Callback invoked on success */\n onSuccess?: (result: R) => void;\n /** Callback invoked on error */\n onError?: (error: unknown) => void;\n}\n\n/**\n * Return type for usePromiseState hook\n * @template R - The type of result\n */\nexport interface UsePromiseStateReturn<R> extends PromiseState<R> {\n /** Set status to LOADING */\n setLoading: () => void;\n /** Set status to SUCCESS with result */\n setSuccess: (result: R) => void;\n /** Set status to ERROR with error */\n setError: (error: unknown) => void;\n /** Set status to IDLE */\n setIdle: () => void;\n}\n\n/**\n * A React hook for managing promise state without execution logic\n * @template R - The type of result\n * @param options - Configuration options\n * @returns State management object\n *\n * @example\n * ```typescript\n * import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();\n *\n * const handleSuccess = () => setSuccess('Data loaded');\n * const handleError = () => setError(new Error('Failed to load'));\n *\n * return (\n * <div>\n * <button onClick={handleSuccess}>Set Success</button>\n * <button onClick={handleError}>Set Error</button>\n * <button onClick={setIdle}>Reset</button>\n * <p>Status: {status}</p>\n * {loading && <p>Loading...</p>}\n * {result && <p>Result: {result}</p>}\n * {error && <p>Error: {error.message}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePromiseState<R = unknown>(\n options?: UsePromiseStateOptions<R>,\n): UsePromiseStateReturn<R> {\n const [status, setStatus] = useState<PromiseStatus>(\n options?.initialStatus ?? PromiseStatus.IDLE,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const [error, setErrorState] = useState<unknown | undefined>(undefined);\n const isMounted = useMountedState();\n\n const setLoadingFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.LOADING);\n setErrorState(undefined);\n }\n }, [isMounted]);\n\n const setSuccessFn = useCallback(\n (result: R) => {\n if (isMounted()) {\n setResult(result);\n setStatus(PromiseStatus.SUCCESS);\n setErrorState(undefined);\n options?.onSuccess?.(result);\n }\n },\n [isMounted, options],\n );\n\n const setErrorFn = useCallback(\n (error: unknown) => {\n if (isMounted()) {\n setErrorState(error);\n setStatus(PromiseStatus.ERROR);\n setResult(undefined);\n options?.onError?.(error);\n }\n },\n [isMounted, options],\n );\n\n const setIdleFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.IDLE);\n setErrorState(undefined);\n setResult(undefined);\n }\n }, [isMounted]);\n\n return {\n status,\n loading: status === PromiseStatus.LOADING,\n result,\n error,\n setLoading: setLoadingFn,\n setSuccess: setSuccessFn,\n setError: setErrorFn,\n setIdle: setIdleFn,\n };\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport { useMountedState } from 'react-use';\nimport { usePromiseState, PromiseState } from './usePromiseState';\n\n/**\n * Type definition for a function that returns a Promise\n * @template R - The type of value the promise will resolve to\n */\nexport type PromiseSupplier<R> = () => Promise<R>;\n\n/**\n * Interface defining the return type of useExecutePromise hook\n * @template R - The type of the result value\n *\n * @example\n * ```typescript\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n * ```\n */\nexport interface UseExecutePromiseReturn<R> extends PromiseState<R> {\n /** Function to execute a promise supplier */\n execute: (provider: PromiseSupplier<R>) => Promise<R>;\n /** Function to reset the state to initial values */\n reset: () => void;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @template R - The type of the result value\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useExecutePromise } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data');\n * return response.text();\n * };\n *\n * const handleFetch = () => {\n * execute(fetchData);\n * };\n *\n * const handleReset = () => {\n * reset();\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * <button onClick={handleReset}>Reset</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useExecutePromise<R = unknown>(): UseExecutePromiseReturn<R> {\n const state = usePromiseState<R>();\n const isMounted = useMountedState();\n\n /**\n * Execute a promise supplier and manage its state\n * @param provider - A function that returns a Promise to be executed\n * @returns A Promise that resolves with the result of the executed promise\n */\n const execute = useCallback(\n async (provider: PromiseSupplier<R>): Promise<R> => {\n if (!isMounted()) {\n throw new Error('Component is unmounted');\n }\n state.setLoading();\n try {\n const data = await provider();\n\n if (isMounted()) {\n state.setSuccess(data);\n }\n return data;\n } catch (err) {\n if (isMounted()) {\n state.setError(err);\n }\n throw err;\n }\n },\n [state, isMounted],\n );\n\n /**\n * Reset the state to initial values\n */\n const reset = useCallback(() => {\n if (isMounted()) {\n state.setIdle();\n }\n }, [state, isMounted]);\n\n return {\n loading: state.loading,\n result: state.result,\n error: state.error,\n execute,\n reset,\n status: state.status,\n };\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\n\n/**\n * A React hook that provides state management for a KeyStorage instance.\n * Subscribes to storage changes and returns the current value along with a setter function.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple containing the current stored value and a function to update it\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void] {\n const subscribe = useCallback(\n (callback: () => void) => keyStorage.addListener(callback),\n [keyStorage],\n );\n const getSnapshot = useCallback(() => keyStorage.get(), [keyStorage]);\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage],\n );\n return [value, setValue];\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcher as defaultFetcher,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions,\n} from '@ahoo-wang/fetcher';\nimport { useRef, useCallback, useEffect, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport {\n PromiseState,\n usePromiseState,\n} from '../core';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions extends RequestOptions, FetcherCapable {\n}\n\nexport interface UseFetcherReturn<R> extends PromiseState<R> {\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n execute: (request: FetchRequest) => Promise<void>;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @param options - Configuration options for the fetcher\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useFetcher } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute } = useFetcher<string>();\n *\n * const handleFetch = () => {\n * execute({ url: '/api/data', method: 'GET' });\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFetcher<R>(\n options?: UseFetcherOptions,\n): UseFetcherReturn<R> {\n const { fetcher = defaultFetcher } = options || {};\n const state = usePromiseState<R>();\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const isMounted = useMountedState();\n const abortControllerRef = useRef<AbortController | undefined>();\n\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(\n async (request: FetchRequest) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n state.setLoading();\n try {\n const exchange = await currentFetcher.exchange(request, options);\n if (isMounted()) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted()) {\n state.setSuccess(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n if (isMounted()) {\n state.setIdle();\n }\n return;\n }\n if (isMounted()) {\n state.setError(error);\n }\n } finally {\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [currentFetcher, isMounted, options, state],\n );\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, []);\n return {\n ...state,\n exchange,\n execute,\n };\n}\n"],"names":["useMountedState","mountedRef","useRef","get","useCallback","useEffect","PromiseStatus","usePromiseState","options","status","setStatus","useState","result","setResult","error","setErrorState","isMounted","setLoadingFn","setSuccessFn","setErrorFn","setIdleFn","useExecutePromise","state","execute","provider","data","err","reset","useKeyStorage","keyStorage","subscribe","callback","getSnapshot","value","useSyncExternalStore","setValue","useFetcher","fetcher","defaultFetcher","exchange","setExchange","abortControllerRef","currentFetcher","getFetcher","request"],"mappings":"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","x_google_ignoreList":[0]}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(r,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react"),require("@ahoo-wang/fetcher")):typeof define=="function"&&define.amd?define(["exports","react","@ahoo-wang/fetcher"],e):(r=typeof globalThis<"u"?globalThis:r||self,e(r.FetcherReact={},r.React,r.Fetcher))})(this,(function(r,e,d){"use strict";function C(t){const o=e.useCallback(u=>t.addListener(u),[t]),i=e.useCallback(()=>t.get(),[t]),f=e.useSyncExternalStore(o,i,i),a=e.useCallback(u=>t.set(u),[t]);return[f,a]}function v(){var t=e.useRef(!1),o=e.useCallback(function(){return t.current},[]);return e.useEffect(function(){return t.current=!0,function(){t.current=!1}},[]),o}function g(t,o){const{fetcher:i=d.fetcher,immediate:f=!0}=o||{},[a,u]=e.useState(!1),[x,h]=e.useState(void 0),[m,E]=e.useState(void 0),[S,F]=e.useState(void 0),c=v(),n=e.useRef(),b=d.getFetcher(i),l=e.useCallback(async()=>{n.current&&n.current.abort(),n.current=t.abortController??new AbortController,t.abortController=n.current,c()&&(u(!0),h(void 0));try{const s=await b.exchange(t,o);c()&&E(s);const w=await s.extractResult();c()&&F(w)}catch(s){if(s instanceof Error&&s.name==="AbortError")return;c()&&h(s)}finally{c()&&u(!1),n.current===t.abortController&&(n.current=void 0)}},[b,t,c,o]),p=e.useCallback(()=>{n.current?.abort()},[]);return e.useEffect(()=>(f&&l(),()=>{n.current?.abort(),n.current=void 0}),[l,t,f]),{loading:a,exchange:m,result:S,error:x,execute:l,cancel:p}}r.useFetcher=g,r.useKeyStorage=C,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(u,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("react"),require("@ahoo-wang/fetcher")):typeof define=="function"&&define.amd?define(["exports","react","@ahoo-wang/fetcher"],t):(u=typeof globalThis<"u"?globalThis:u||self,t(u.FetcherReact={},u.React,u.Fetcher))})(this,(function(u,t,S){"use strict";function h(){var e=t.useRef(!1),s=t.useCallback(function(){return e.current},[]);return t.useEffect(function(){return e.current=!0,function(){e.current=!1}},[]),s}var g=(e=>(e.IDLE="idle",e.LOADING="loading",e.SUCCESS="success",e.ERROR="error",e))(g||{});function b(e){const[s,n]=t.useState(e?.initialStatus??"idle"),[l,i]=t.useState(void 0),[r,o]=t.useState(void 0),c=h(),C=t.useCallback(()=>{c()&&(n("loading"),o(void 0))},[c]),f=t.useCallback(d=>{c()&&(i(d),n("success"),o(void 0),e?.onSuccess?.(d))},[c,e]),a=t.useCallback(d=>{c()&&(o(d),n("error"),i(void 0),e?.onError?.(d))},[c,e]),E=t.useCallback(()=>{c()&&(n("idle"),o(void 0),i(void 0))},[c]);return{status:s,loading:s==="loading",result:l,error:r,setLoading:C,setSuccess:f,setError:a,setIdle:E}}function v(){const e=b(),s=h(),n=t.useCallback(async i=>{if(!s())throw new Error("Component is unmounted");e.setLoading();try{const r=await i();return s()&&e.setSuccess(r),r}catch(r){throw s()&&e.setError(r),r}},[e,s]),l=t.useCallback(()=>{s()&&e.setIdle()},[e,s]);return{loading:e.loading,result:e.result,error:e.error,execute:n,reset:l,status:e.status}}function F(e){const s=t.useCallback(r=>e.addListener(r),[e]),n=t.useCallback(()=>e.get(),[e]),l=t.useSyncExternalStore(s,n,n),i=t.useCallback(r=>e.set(r),[e]);return[l,i]}function m(e){const{fetcher:s=S.fetcher}=e||{},n=b(),[l,i]=t.useState(void 0),r=h(),o=t.useRef(),c=S.getFetcher(s),C=t.useCallback(async f=>{o.current&&o.current.abort(),o.current=f.abortController??new AbortController,f.abortController=o.current,n.setLoading();try{const a=await c.exchange(f,e);r()&&i(a);const E=await a.extractResult();r()&&n.setSuccess(E)}catch(a){if(a instanceof Error&&a.name==="AbortError"){r()&&n.setIdle();return}r()&&n.setError(a)}finally{o.current===f.abortController&&(o.current=void 0)}},[c,r,e,n]);return t.useEffect(()=>()=>{o.current?.abort(),o.current=void 0},[]),{...n,exchange:l,execute:C}}u.PromiseStatus=g,u.useExecutePromise=v,u.useFetcher=m,u.useKeyStorage=F,u.usePromiseState=b,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/storage/useKeyStorage.ts","../../../node_modules/.pnpm/react-use@17.6.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/react-use/esm/useMountedState.js","../src/fetcher/useFetcher.ts"],"sourcesContent":["/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\n\n/**\n * A React hook that provides state management for a KeyStorage instance.\n * Subscribes to storage changes and returns the current value along with a setter function.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple containing the current stored value and a function to update it\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void] {\n const subscribe = useCallback(\n (callback: () => void) => keyStorage.addListener(callback),\n [keyStorage],\n );\n const getSnapshot = useCallback(() => keyStorage.get(), [keyStorage]);\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage],\n );\n return [value, setValue];\n}\n","import { useCallback, useEffect, useRef } from 'react';\nexport default function useMountedState() {\n var mountedRef = useRef(false);\n var get = useCallback(function () { return mountedRef.current; }, []);\n useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcher as defaultFetcher,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions,\n} from '@ahoo-wang/fetcher';\nimport { useRef, useCallback, useEffect, useState } from 'react';\nimport { useMountedState } from 'react-use';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions extends RequestOptions, FetcherCapable {\n /**\n * Whether the fetch operation should execute immediately upon component mount.\n * Defaults to true.\n */\n readonly immediate?: boolean;\n}\n\n/**\n * The result object returned by the useFetcher hook.\n * @template R - The type of the data returned by the fetch operation\n */\nexport interface UseFetcherResult<R> {\n /** Indicates if the fetch operation is currently in progress */\n loading: boolean;\n\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n\n /** The data returned by the fetch operation, or undefined if not yet loaded or an error occurred */\n result?: R;\n\n /** Any error that occurred during the fetch operation, or undefined if no error */\n error?: unknown;\n\n /**\n * Function to manually trigger the fetch operation.\n * Useful for fetching data on demand rather than automatically.\n */\n execute: () => Promise<void>;\n\n /** Function to cancel the ongoing fetch operation */\n cancel: () => void;\n}\n\nexport function useFetcher<R>(\n request: FetchRequest,\n options?: UseFetcherOptions,\n): UseFetcherResult<R> {\n const { fetcher = defaultFetcher, immediate = true } = options || {};\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<unknown>(undefined);\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const isMounted = useMountedState();\n const abortControllerRef = useRef<AbortController | undefined>();\n\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(async () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n if (isMounted()) {\n setLoading(true);\n setError(undefined);\n }\n try {\n const exchange = await currentFetcher.exchange(request, options);\n if (isMounted()) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted()) {\n setResult(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n if (isMounted()) {\n setError(error);\n }\n } finally {\n if (isMounted()) {\n setLoading(false);\n }\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n }, [currentFetcher, request, isMounted, options]);\n /**\n * Cancel the ongoing fetch operation if one is in progress.\n */\n const cancel = useCallback(() => {\n abortControllerRef.current?.abort();\n }, []);\n useEffect(() => {\n if (immediate) {\n execute();\n }\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, [execute, request, immediate]);\n return {\n loading,\n exchange,\n result,\n error,\n execute,\n cancel,\n };\n}\n"],"names":["useKeyStorage","keyStorage","subscribe","useCallback","callback","getSnapshot","value","useSyncExternalStore","setValue","useMountedState","mountedRef","useRef","get","useEffect","useFetcher","request","options","fetcher","defaultFetcher","immediate","loading","setLoading","useState","error","setError","exchange","setExchange","result","setResult","isMounted","abortControllerRef","currentFetcher","getFetcher","execute","cancel"],"mappings":"uUAwBO,SAASA,EACdC,EACgC,CAChC,MAAMC,EAAYC,EAAAA,YACfC,GAAyBH,EAAW,YAAYG,CAAQ,EACzD,CAACH,CAAU,CAAA,EAEPI,EAAcF,EAAAA,YAAY,IAAMF,EAAW,MAAO,CAACA,CAAU,CAAC,EAC9DK,EAAQC,EAAAA,qBAAqBL,EAAWG,EAAaA,CAAW,EAChEG,EAAWL,EAAAA,YACdG,GAAaL,EAAW,IAAIK,CAAK,EAClC,CAACL,CAAU,CAAA,EAEb,MAAO,CAACK,EAAOE,CAAQ,CACzB,CCrCe,SAASC,GAAkB,CACtC,IAAIC,EAAaC,EAAAA,OAAO,EAAK,EACzBC,EAAMT,EAAAA,YAAY,UAAY,CAAE,OAAOO,EAAW,OAAS,EAAG,EAAE,EACpEG,OAAAA,EAAAA,UAAU,UAAY,CAClB,OAAAH,EAAW,QAAU,GACd,UAAY,CACfA,EAAW,QAAU,EACzB,CACJ,EAAG,CAAA,CAAE,EACEE,CACX,CCoDO,SAASE,EACdC,EACAC,EACqB,CACrB,KAAM,CAAA,QAAEC,EAAUC,EAAAA,QAAgB,UAAAC,EAAY,EAAA,EAASH,GAAW,CAAA,EAC5D,CAACI,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAkB,MAAS,EAC/C,CAACG,EAAUC,CAAW,EAAIJ,EAAAA,SAC9B,MAAA,EAEI,CAACK,EAAQC,CAAS,EAAIN,EAAAA,SAAwB,MAAS,EACvDO,EAAYpB,EAAA,EACZqB,EAAqBnB,EAAAA,OAAA,EAErBoB,EAAiBC,EAAAA,WAAWf,CAAO,EAKnCgB,EAAU9B,EAAAA,YAAY,SAAY,CAClC2B,EAAmB,SACrBA,EAAmB,QAAQ,MAAA,EAE7BA,EAAmB,QACjBf,EAAQ,iBAAmB,IAAI,gBACjCA,EAAQ,gBAAkBe,EAAmB,QACzCD,MACFR,EAAW,EAAI,EACfG,EAAS,MAAS,GAEpB,GAAI,CACF,MAAMC,EAAW,MAAMM,EAAe,SAAShB,EAASC,CAAO,EAC3Da,KACFH,EAAYD,CAAQ,EAEtB,MAAME,EAAS,MAAMF,EAAS,cAAA,EAC1BI,KACFD,EAAUD,CAAM,CAEpB,OAASJ,EAAO,CACd,GAAIA,aAAiB,OAASA,EAAM,OAAS,aAC3C,OAEEM,KACFL,EAASD,CAAK,CAElB,QAAA,CACMM,KACFR,EAAW,EAAK,EAEdS,EAAmB,UAAYf,EAAQ,kBACzCe,EAAmB,QAAU,OAEjC,CACF,EAAG,CAACC,EAAgBhB,EAASc,EAAWb,CAAO,CAAC,EAI1CkB,EAAS/B,EAAAA,YAAY,IAAM,CAC/B2B,EAAmB,SAAS,MAAA,CAC9B,EAAG,CAAA,CAAE,EACLjB,OAAAA,EAAAA,UAAU,KACJM,GACFc,EAAA,EAEK,IAAM,CACXH,EAAmB,SAAS,MAAA,EAC5BA,EAAmB,QAAU,MAC/B,GACC,CAACG,EAASlB,EAASI,CAAS,CAAC,EACzB,CACL,QAAAC,EACA,SAAAK,EACA,OAAAE,EACA,MAAAJ,EACA,QAAAU,EACA,OAAAC,CAAA,CAEJ","x_google_ignoreList":[1]}
1
+ {"version":3,"file":"index.umd.js","sources":["../../../node_modules/.pnpm/react-use@17.6.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/react-use/esm/useMountedState.js","../src/core/usePromiseState.ts","../src/core/useExecutePromise.ts","../src/storage/useKeyStorage.ts","../src/fetcher/useFetcher.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nexport default function useMountedState() {\n var mountedRef = useRef(false);\n var get = useCallback(function () { return mountedRef.current; }, []);\n useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMountedState } from 'react-use';\n\n/**\n * Enumeration of possible promise execution states\n */\nexport enum PromiseStatus {\n IDLE = 'idle',\n LOADING = 'loading',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\nexport interface PromiseState<R> {\n /** Current status of the promise */\n status: PromiseStatus;\n /** Indicates if currently loading */\n loading: boolean;\n /** The result value */\n result: R | undefined;\n /** The error value */\n error: unknown | undefined;\n}\n\n/**\n * Options for configuring usePromiseState behavior\n * @template R - The type of result\n *\n * @example\n * ```typescript\n * const options: UsePromiseStateOptions<string> = {\n * initialStatus: PromiseStatus.IDLE,\n * onSuccess: (result) => console.log('Success:', result),\n * onError: (error) => console.error('Error:', error),\n * };\n * ```\n */\nexport interface UsePromiseStateOptions<R> {\n /** Initial status, defaults to IDLE */\n initialStatus?: PromiseStatus;\n /** Callback invoked on success */\n onSuccess?: (result: R) => void;\n /** Callback invoked on error */\n onError?: (error: unknown) => void;\n}\n\n/**\n * Return type for usePromiseState hook\n * @template R - The type of result\n */\nexport interface UsePromiseStateReturn<R> extends PromiseState<R> {\n /** Set status to LOADING */\n setLoading: () => void;\n /** Set status to SUCCESS with result */\n setSuccess: (result: R) => void;\n /** Set status to ERROR with error */\n setError: (error: unknown) => void;\n /** Set status to IDLE */\n setIdle: () => void;\n}\n\n/**\n * A React hook for managing promise state without execution logic\n * @template R - The type of result\n * @param options - Configuration options\n * @returns State management object\n *\n * @example\n * ```typescript\n * import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();\n *\n * const handleSuccess = () => setSuccess('Data loaded');\n * const handleError = () => setError(new Error('Failed to load'));\n *\n * return (\n * <div>\n * <button onClick={handleSuccess}>Set Success</button>\n * <button onClick={handleError}>Set Error</button>\n * <button onClick={setIdle}>Reset</button>\n * <p>Status: {status}</p>\n * {loading && <p>Loading...</p>}\n * {result && <p>Result: {result}</p>}\n * {error && <p>Error: {error.message}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePromiseState<R = unknown>(\n options?: UsePromiseStateOptions<R>,\n): UsePromiseStateReturn<R> {\n const [status, setStatus] = useState<PromiseStatus>(\n options?.initialStatus ?? PromiseStatus.IDLE,\n );\n const [result, setResult] = useState<R | undefined>(undefined);\n const [error, setErrorState] = useState<unknown | undefined>(undefined);\n const isMounted = useMountedState();\n\n const setLoadingFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.LOADING);\n setErrorState(undefined);\n }\n }, [isMounted]);\n\n const setSuccessFn = useCallback(\n (result: R) => {\n if (isMounted()) {\n setResult(result);\n setStatus(PromiseStatus.SUCCESS);\n setErrorState(undefined);\n options?.onSuccess?.(result);\n }\n },\n [isMounted, options],\n );\n\n const setErrorFn = useCallback(\n (error: unknown) => {\n if (isMounted()) {\n setErrorState(error);\n setStatus(PromiseStatus.ERROR);\n setResult(undefined);\n options?.onError?.(error);\n }\n },\n [isMounted, options],\n );\n\n const setIdleFn = useCallback(() => {\n if (isMounted()) {\n setStatus(PromiseStatus.IDLE);\n setErrorState(undefined);\n setResult(undefined);\n }\n }, [isMounted]);\n\n return {\n status,\n loading: status === PromiseStatus.LOADING,\n result,\n error,\n setLoading: setLoadingFn,\n setSuccess: setSuccessFn,\n setError: setErrorFn,\n setIdle: setIdleFn,\n };\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport { useMountedState } from 'react-use';\nimport { usePromiseState, PromiseState } from './usePromiseState';\n\n/**\n * Type definition for a function that returns a Promise\n * @template R - The type of value the promise will resolve to\n */\nexport type PromiseSupplier<R> = () => Promise<R>;\n\n/**\n * Interface defining the return type of useExecutePromise hook\n * @template R - The type of the result value\n *\n * @example\n * ```typescript\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n * ```\n */\nexport interface UseExecutePromiseReturn<R> extends PromiseState<R> {\n /** Function to execute a promise supplier */\n execute: (provider: PromiseSupplier<R>) => Promise<R>;\n /** Function to reset the state to initial values */\n reset: () => void;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @template R - The type of the result value\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useExecutePromise } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute, reset } = useExecutePromise<string>();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data');\n * return response.text();\n * };\n *\n * const handleFetch = () => {\n * execute(fetchData);\n * };\n *\n * const handleReset = () => {\n * reset();\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * <button onClick={handleReset}>Reset</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useExecutePromise<R = unknown>(): UseExecutePromiseReturn<R> {\n const state = usePromiseState<R>();\n const isMounted = useMountedState();\n\n /**\n * Execute a promise supplier and manage its state\n * @param provider - A function that returns a Promise to be executed\n * @returns A Promise that resolves with the result of the executed promise\n */\n const execute = useCallback(\n async (provider: PromiseSupplier<R>): Promise<R> => {\n if (!isMounted()) {\n throw new Error('Component is unmounted');\n }\n state.setLoading();\n try {\n const data = await provider();\n\n if (isMounted()) {\n state.setSuccess(data);\n }\n return data;\n } catch (err) {\n if (isMounted()) {\n state.setError(err);\n }\n throw err;\n }\n },\n [state, isMounted],\n );\n\n /**\n * Reset the state to initial values\n */\n const reset = useCallback(() => {\n if (isMounted()) {\n state.setIdle();\n }\n }, [state, isMounted]);\n\n return {\n loading: state.loading,\n result: state.result,\n error: state.error,\n execute,\n reset,\n status: state.status,\n };\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react';\nimport { KeyStorage } from '@ahoo-wang/fetcher-storage';\n\n/**\n * A React hook that provides state management for a KeyStorage instance.\n * Subscribes to storage changes and returns the current value along with a setter function.\n *\n * @template T - The type of value stored in the key storage\n * @param keyStorage - The KeyStorage instance to subscribe to and manage\n * @returns A tuple containing the current stored value and a function to update it\n */\nexport function useKeyStorage<T>(\n keyStorage: KeyStorage<T>,\n): [T | null, (value: T) => void] {\n const subscribe = useCallback(\n (callback: () => void) => keyStorage.addListener(callback),\n [keyStorage],\n );\n const getSnapshot = useCallback(() => keyStorage.get(), [keyStorage]);\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const setValue = useCallback(\n (value: T) => keyStorage.set(value),\n [keyStorage],\n );\n return [value, setValue];\n}\n","/*\n * Copyright [2021-present] [ahoo wang <ahoowang@qq.com> (https://github.com/Ahoo-Wang)].\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n fetcher as defaultFetcher,\n FetcherCapable,\n FetchExchange,\n FetchRequest,\n getFetcher,\n RequestOptions,\n} from '@ahoo-wang/fetcher';\nimport { useRef, useCallback, useEffect, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport {\n PromiseState,\n usePromiseState,\n} from '../core';\n\n/**\n * Configuration options for the useFetcher hook.\n * Extends RequestOptions and FetcherCapable interfaces.\n */\nexport interface UseFetcherOptions extends RequestOptions, FetcherCapable {\n}\n\nexport interface UseFetcherReturn<R> extends PromiseState<R> {\n /** The FetchExchange object representing the ongoing fetch operation */\n exchange?: FetchExchange;\n execute: (request: FetchRequest) => Promise<void>;\n}\n\n/**\n * A React hook for managing asynchronous operations with proper state handling\n * @param options - Configuration options for the fetcher\n * @returns An object containing the current state and control functions\n *\n * @example\n * ```typescript\n * import { useFetcher } from '@ahoo-wang/fetcher-react';\n *\n * function MyComponent() {\n * const { loading, result, error, execute } = useFetcher<string>();\n *\n * const handleFetch = () => {\n * execute({ url: '/api/data', method: 'GET' });\n * };\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return (\n * <div>\n * <button onClick={handleFetch}>Fetch Data</button>\n * {result && <p>{result}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFetcher<R>(\n options?: UseFetcherOptions,\n): UseFetcherReturn<R> {\n const { fetcher = defaultFetcher } = options || {};\n const state = usePromiseState<R>();\n const [exchange, setExchange] = useState<FetchExchange | undefined>(\n undefined,\n );\n const isMounted = useMountedState();\n const abortControllerRef = useRef<AbortController | undefined>();\n\n const currentFetcher = getFetcher(fetcher);\n /**\n * Execute the fetch operation.\n * Cancels any ongoing fetch before starting a new one.\n */\n const execute = useCallback(\n async (request: FetchRequest) => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current =\n request.abortController ?? new AbortController();\n request.abortController = abortControllerRef.current;\n state.setLoading();\n try {\n const exchange = await currentFetcher.exchange(request, options);\n if (isMounted()) {\n setExchange(exchange);\n }\n const result = await exchange.extractResult<R>();\n if (isMounted()) {\n state.setSuccess(result);\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n if (isMounted()) {\n state.setIdle();\n }\n return;\n }\n if (isMounted()) {\n state.setError(error);\n }\n } finally {\n if (abortControllerRef.current === request.abortController) {\n abortControllerRef.current = undefined;\n }\n }\n },\n [currentFetcher, isMounted, options, state],\n );\n\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = undefined;\n };\n }, []);\n return {\n ...state,\n exchange,\n execute,\n };\n}\n"],"names":["useMountedState","mountedRef","useRef","get","useCallback","useEffect","PromiseStatus","usePromiseState","options","status","setStatus","useState","result","setResult","error","setErrorState","isMounted","setLoadingFn","setSuccessFn","setErrorFn","setIdleFn","useExecutePromise","state","execute","provider","data","err","reset","useKeyStorage","keyStorage","subscribe","callback","getSnapshot","value","useSyncExternalStore","setValue","useFetcher","fetcher","defaultFetcher","exchange","setExchange","abortControllerRef","currentFetcher","getFetcher","request"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ahoo-wang/fetcher-react",
3
- "version": "2.5.3",
3
+ "version": "2.5.6",
4
4
  "description": "React integration for Fetcher HTTP client. Provides React Hooks and components for seamless data fetching with automatic re-rendering and loading states.",
5
5
  "keywords": [
6
6
  "fetch",
@@ -44,6 +44,7 @@
44
44
  "peerDependencies": {
45
45
  "@ahoo-wang/fetcher": "^2.3.4",
46
46
  "@ahoo-wang/fetcher-storage": "^2.3.4",
47
+ "@ahoo-wang/fetcher-wow": "^2.3.4",
47
48
  "react": ">=16.8.0",
48
49
  "react-dom": ">=16.8.0"
49
50
  },