@ahoo-wang/fetcher-react 2.6.3 → 2.6.5

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.zh-CN.md CHANGED
@@ -12,11 +12,26 @@ Fetcher 生态的 React 集成包。提供 React Hooks 和组件,实现无缝
12
12
 
13
13
  ## 功能特性
14
14
 
15
- - 🔄 **React Hooks**: 提供 React hooks 与 Fetcher 无缝集成
16
- - 🌐 **TypeScript 支持**: 完整的 TypeScript 支持和全面的类型定义
17
- - 🚀 **现代化**: 使用现代 React 模式和最佳实践构建
18
- - 🧠 **智能缓存**: 内置缓存和自动重新验证
19
- - **Promise 状态管理**: 用于管理异步操作和 promise 状态的 hooks
15
+ - 🚀 **数据获取**: 完整的 HTTP 客户端与 React hooks 集成
16
+ - 🔄 **Promise 状态管理**: 高级异步操作处理,具有竞态条件保护
17
+ - 🛡️ **类型安全**: 完整的 TypeScript 支持和全面的类型定义
18
+ - **性能优化**: 使用 useMemo、useCallback 和智能依赖管理进行优化
19
+ - 🎯 **选项灵活性**: 支持静态选项和动态选项供应商
20
+ - 🔧 **开发者体验**: 内置加载状态、错误处理和自动重新渲染
21
+
22
+ ## 目录
23
+
24
+ - [安装](#安装)
25
+ - [快速开始](#快速开始)
26
+ - [使用方法](#使用方法)
27
+ - [useFetcher Hook](#usefetcher-hook)
28
+ - [useExecutePromise Hook](#useexecutepromise-hook)
29
+ - [usePromiseState Hook](#usepromisestate-hook)
30
+ - [useRequestId Hook](#userequestid-hook)
31
+ - [useLatest Hook](#uselatest-hook)
32
+ - [useKeyStorage Hook](#usekeystorage-hook)
33
+ - [API 参考](#api-参考)
34
+ - [许可证](#许可证)
20
35
 
21
36
  ## 安装
22
37
 
@@ -24,30 +39,52 @@ Fetcher 生态的 React 集成包。提供 React Hooks 和组件,实现无缝
24
39
  npm install @ahoo-wang/fetcher-react
25
40
  ```
26
41
 
42
+ ## 快速开始
43
+
44
+ 只需几行代码即可开始使用 `@ahoo-wang/fetcher-react`:
45
+
46
+ ```typescript jsx
47
+ import { useFetcher } from '@ahoo-wang/fetcher-react';
48
+
49
+ function App() {
50
+ const { loading, result, error, execute } = useFetcher();
51
+
52
+ return (
53
+ <div>
54
+ <button onClick={() => execute({ url: '/api/data', method: 'GET' })}>
55
+ 获取数据
56
+ </button>
57
+ {loading && <p>加载中...</p>}
58
+ {result && <pre>{JSON.stringify(result, null, 2)}</pre>}
59
+ {error && <p>错误: {error.message}</p>}
60
+ </div>
61
+ );
62
+ }
63
+ ```
64
+
27
65
  ## 使用方法
28
66
 
29
- ### usePromiseState Hook
67
+ ### useFetcher Hook
30
68
 
31
- `usePromiseState` hook 提供 promise 操作的状态管理,无执行逻辑。
69
+ `useFetcher` hook 提供完整的数据获取功能,具有自动状态管理、竞态条件保护和灵活的配置选项。
32
70
 
33
71
  ```typescript jsx
34
- import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';
72
+ import { useFetcher } from '@ahoo-wang/fetcher-react';
35
73
 
36
74
  const MyComponent = () => {
37
- const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();
75
+ const { loading, error, result, execute } = useFetcher<string>();
38
76
 
39
- const handleSuccess = () => setSuccess('数据加载成功');
40
- const handleError = () => setError(new Error('加载失败'));
77
+ const handleFetch = () => {
78
+ execute({ url: '/api/users', method: 'GET' });
79
+ };
80
+
81
+ if (loading) return <div>加载中...</div>;
82
+ if (error) return <div>错误: {error.message}</div>;
41
83
 
42
84
  return (
43
85
  <div>
44
- <button onClick={handleSuccess}>设置成功</button>
45
- <button onClick={handleError}>设置错误</button>
46
- <button onClick={setIdle}>重置</button>
47
- <p>状态: {status}</p>
48
- {loading && <p>加载中...</p>}
49
- {result && <p>结果: {result}</p>}
50
- {error && <p>错误: {error.message}</p>}
86
+ <pre>{JSON.stringify(result, null, 2)}</pre>
87
+ <button onClick={handleFetch}>获取数据</button>
51
88
  </div>
52
89
  );
53
90
  };
@@ -55,7 +92,7 @@ const MyComponent = () => {
55
92
 
56
93
  ### useExecutePromise Hook
57
94
 
58
- `useExecutePromise` hook 管理异步操作,具有自动状态处理和内置竞态条件保护。
95
+ `useExecutePromise` hook 管理异步操作,具有自动状态处理、竞态条件保护和 promise 状态选项支持。
59
96
 
60
97
  ```typescript jsx
61
98
  import { useExecutePromise } from '@ahoo-wang/fetcher-react';
@@ -90,6 +127,63 @@ const MyComponent = () => {
90
127
  };
91
128
  ```
92
129
 
130
+ ### usePromiseState Hook
131
+
132
+ `usePromiseState` hook 提供 promise 操作的状态管理,无执行逻辑。支持静态选项和动态选项供应商。
133
+
134
+ ```typescript jsx
135
+ import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';
136
+
137
+ const MyComponent = () => {
138
+ const { status, loading, result, error, setSuccess, setError, setIdle } = usePromiseState<string>();
139
+
140
+ const handleSuccess = () => setSuccess('数据加载成功');
141
+ const handleError = () => setError(new Error('加载失败'));
142
+
143
+ return (
144
+ <div>
145
+ <button onClick={handleSuccess}>设置成功</button>
146
+ <button onClick={handleError}>设置错误</button>
147
+ <button onClick={setIdle}>重置</button>
148
+ <p>状态: {status}</p>
149
+ {loading && <p>加载中...</p>}
150
+ {result && <p>结果: {result}</p>}
151
+ {error && <p>错误: {error.message}</p>}
152
+ </div>
153
+ );
154
+ };
155
+ ```
156
+
157
+ #### usePromiseState with Options Supplier
158
+
159
+ ```typescript jsx
160
+ import { usePromiseState, PromiseStatus } from '@ahoo-wang/fetcher-react';
161
+
162
+ const MyComponent = () => {
163
+ // 使用选项供应商进行动态配置
164
+ const optionsSupplier = () => ({
165
+ initialStatus: PromiseStatus.IDLE,
166
+ onSuccess: async (result: string) => {
167
+ await saveToAnalytics(result);
168
+ console.log('成功:', result);
169
+ },
170
+ onError: async (error) => {
171
+ await logErrorToServer(error);
172
+ console.error('错误:', error);
173
+ },
174
+ });
175
+
176
+ const { setSuccess, setError } = usePromiseState<string>(optionsSupplier);
177
+
178
+ return (
179
+ <div>
180
+ <button onClick={() => setSuccess('动态成功!')}>设置成功</button>
181
+ <button onClick={() => setError(new Error('动态错误!'))}>设置错误</button>
182
+ </div>
183
+ );
184
+ };
185
+ ```
186
+
93
187
  ### useRequestId Hook
94
188
 
95
189
  `useRequestId` hook 提供请求ID管理,用于防止异步操作中的竞态条件。
@@ -125,27 +219,27 @@ const MyComponent = () => {
125
219
  };
126
220
  ```
127
221
 
128
- ### useFetcher Hook
222
+ ### useLatest Hook
129
223
 
130
- `useFetcher` hook 提供数据获取功能,具有自动状态管理。
224
+ `useLatest` hook 返回包含最新值的 ref 对象,用于在异步回调中访问当前值。
131
225
 
132
226
  ```typescript jsx
133
- import { useFetcher } from '@ahoo-wang/fetcher-react';
227
+ import { useLatest } from '@ahoo-wang/fetcher-react';
134
228
 
135
229
  const MyComponent = () => {
136
- const { loading, error, result, execute } = useFetcher<string>();
230
+ const [count, setCount] = useState(0);
231
+ const latestCount = useLatest(count);
137
232
 
138
- const handleFetch = () => {
139
- execute({ url: '/api/users', method: 'GET' });
233
+ const handleAsync = async () => {
234
+ await someAsyncOperation();
235
+ console.log('最新计数:', latestCount.current); // 始终是最新值
140
236
  };
141
237
 
142
- if (loading) return <div>加载中...</div>;
143
- if (error) return <div>错误: {error.message}</div>;
144
-
145
238
  return (
146
239
  <div>
147
- <pre>{JSON.stringify(result, null, 2)}</pre>
148
- <button onClick={handleFetch}>获取数据</button>
240
+ <p>计数: {count}</p>
241
+ <button onClick={() => setCount(c => c + 1)}>递增</button>
242
+ <button onClick={handleAsync}>异步记录</button>
149
243
  </div>
150
244
  );
151
245
  };
@@ -198,19 +292,25 @@ const [user, setUser] = useKeyStorage(userStorage);
198
292
 
199
293
  ## API 参考
200
294
 
201
- ### usePromiseState
295
+ ### useFetcher
202
296
 
203
297
  ```typescript
204
- function usePromiseState<R = unknown>(
205
- options?: UsePromiseStateOptions<R>,
206
- ): UsePromiseStateReturn<R>;
298
+ function useFetcher<R = unknown, E = unknown>(
299
+ options?: UseFetcherOptions<R, E> | UseFetcherOptionsSupplier<R, E>,
300
+ ): UseFetcherReturn<R, E>;
207
301
  ```
208
302
 
209
- 用于管理 promise 状态的 React hook,无执行逻辑。
303
+ 用于管理异步获取操作的 React hook,具有适当的状态处理、竞态条件保护和灵活的配置。
304
+
305
+ **类型参数:**
306
+
307
+ - `R`: 结果的类型
308
+ - `E`: 错误的类型(默认为 `unknown`)
210
309
 
211
310
  **参数:**
212
311
 
213
- - `options`: 配置选项
312
+ - `options`: 配置选项或供应商函数
313
+ - `fetcher`: 要使用的自定义获取器实例。默认为默认获取器。
214
314
  - `initialStatus`: 初始状态,默认为 IDLE
215
315
  - `onSuccess`: 成功时调用的回调
216
316
  - `onError`: 错误时调用的回调
@@ -223,30 +323,77 @@ function usePromiseState<R = unknown>(
223
323
  - `loading`: 指示当前是否加载中
224
324
  - `result`: 结果值
225
325
  - `error`: 错误值
226
- - `setLoading`: 设置状态为 LOADING
227
- - `setSuccess`: 设置状态为 SUCCESS 并提供结果
228
- - `setError`: 设置状态为 ERROR 并提供错误
229
- - `setIdle`: 设置状态为 IDLE
326
+ - `exchange`: 表示正在进行的获取操作的 FetchExchange 对象
327
+ - `execute`: 执行获取请求的函数
230
328
 
231
329
  ### useExecutePromise
232
330
 
233
331
  ```typescript
234
- function useExecutePromise<R = unknown>(): UseExecutePromiseReturn<R>;
332
+ function useExecutePromise<R = unknown, E = unknown>(
333
+ options?: UseExecutePromiseOptions<R, E>,
334
+ ): UseExecutePromiseReturn<R, E>;
235
335
  ```
236
336
 
237
- 用于管理异步操作的 React hook,具有适当的状态处理。
337
+ 用于管理异步操作的 React hook,具有适当的状态处理、竞态条件保护和 promise 状态选项。
338
+
339
+ **类型参数:**
340
+
341
+ - `R`: 结果的类型
342
+ - `E`: 错误的类型(默认为 `unknown`)
343
+
344
+ **参数:**
345
+
346
+ - `options`: 配置选项
347
+ - `initialStatus`: 初始状态,默认为 IDLE
348
+ - `onSuccess`: 成功时调用的回调
349
+ - `onError`: 错误时调用的回调
238
350
 
239
351
  **返回值:**
240
352
 
241
353
  包含以下属性的对象:
242
354
 
243
- - `status`: 当前状态
355
+ - `status`: 当前状态 (IDLE, LOADING, SUCCESS, ERROR)
244
356
  - `loading`: 指示当前是否加载中
245
357
  - `result`: 结果值
246
358
  - `error`: 错误值
247
359
  - `execute`: 执行 promise supplier 或 promise 的函数
248
360
  - `reset`: 重置状态到初始值的函数
249
361
 
362
+ ### usePromiseState
363
+
364
+ ```typescript
365
+ function usePromiseState<R = unknown, E = unknown>(
366
+ options?: UsePromiseStateOptions<R, E> | UsePromiseStateOptionsSupplier<R, E>,
367
+ ): UsePromiseStateReturn<R, E>;
368
+ ```
369
+
370
+ 用于管理 promise 状态的 React hook,无执行逻辑。支持静态选项和动态选项供应商。
371
+
372
+ **类型参数:**
373
+
374
+ - `R`: 结果的类型
375
+ - `E`: 错误的类型(默认为 `unknown`)
376
+
377
+ **参数:**
378
+
379
+ - `options`: 配置选项或供应商函数
380
+ - `initialStatus`: 初始状态,默认为 IDLE
381
+ - `onSuccess`: 成功时调用的回调(可以是异步的)
382
+ - `onError`: 错误时调用的回调(可以是异步的)
383
+
384
+ **返回值:**
385
+
386
+ 包含以下属性的对象:
387
+
388
+ - `status`: 当前状态 (IDLE, LOADING, SUCCESS, ERROR)
389
+ - `loading`: 指示当前是否加载中
390
+ - `result`: 结果值
391
+ - `error`: 错误值
392
+ - `setLoading`: 设置状态为 LOADING
393
+ - `setSuccess`: 设置状态为 SUCCESS 并提供结果
394
+ - `setError`: 设置状态为 ERROR 并提供错误
395
+ - `setIdle`: 设置状态为 IDLE
396
+
250
397
  ### useRequestId
251
398
 
252
399
  ```typescript
@@ -265,29 +412,25 @@ function useRequestId(): UseRequestIdReturn;
265
412
  - `invalidate`: 使当前请求ID失效(标记为过时)
266
413
  - `reset`: 重置请求ID计数器
267
414
 
268
- ### useFetcher
415
+ ### useLatest
269
416
 
270
417
  ```typescript
271
- function useFetcher<R>(options?: UseFetcherOptions): UseFetcherReturn<R>;
418
+ function useLatest<T>(value: T): { current: T };
272
419
  ```
273
420
 
274
- 用于管理异步获取操作的 React hook,具有适当的状态处理。
421
+ 返回包含最新值的 ref 对象的 React hook,用于在异步回调中访问当前值。
422
+
423
+ **类型参数:**
424
+
425
+ - `T`: 值的类型
275
426
 
276
427
  **参数:**
277
428
 
278
- - `options`: 配置选项
279
- - `fetcher`: 要使用的自定义获取器实例。默认为默认获取器。
429
+ - `value`: 要跟踪的值
280
430
 
281
431
  **返回值:**
282
432
 
283
- 包含以下属性的对象:
284
-
285
- - `status`: 当前状态
286
- - `loading`: 指示当前是否加载中
287
- - `result`: 结果值
288
- - `error`: 错误值
289
- - `exchange`: FetchExchange 对象
290
- - `execute`: 执行获取请求的函数
433
+ 包含 `current` 属性(包含最新值)的 ref 对象
291
434
 
292
435
  ### useKeyStorage
293
436
 
@@ -1 +1 @@
1
- {"version":3,"file":"useExecutePromise.d.ts","sourceRoot":"","sources":["../../src/core/useExecutePromise.ts"],"names":[],"mappings":"AAeA,OAAO,EAAmB,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG1F;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CACrD,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,wDAAwD;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAuDjI"}
1
+ {"version":3,"file":"useExecutePromise.d.ts","sourceRoot":"","sources":["../../src/core/useExecutePromise.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,YAAY,EACZ,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAG3B;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CACrD,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,wDAAwD;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACxD,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GACrC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAuD/B"}
@@ -18,10 +18,10 @@ export interface PromiseState<R, E = unknown> {
18
18
  error: E | undefined;
19
19
  }
20
20
  export interface PromiseStateCallbacks<R, E = unknown> {
21
- /** Callback invoked on success */
22
- onSuccess?: (result: R) => void;
23
- /** Callback invoked on error */
24
- onError?: (error: E) => void;
21
+ /** Callback invoked on success (can be async) */
22
+ onSuccess?: (result: R) => void | Promise<void>;
23
+ /** Callback invoked on error (can be async) */
24
+ onError?: (error: E) => void | Promise<void>;
25
25
  }
26
26
  /**
27
27
  * Options for configuring usePromiseState behavior
@@ -32,7 +32,10 @@ export interface PromiseStateCallbacks<R, E = unknown> {
32
32
  * const options: UsePromiseStateOptions<string> = {
33
33
  * initialStatus: PromiseStatus.IDLE,
34
34
  * onSuccess: (result) => console.log('Success:', result),
35
- * onError: (error) => console.error('Error:', error),
35
+ * onError: async (error) => {
36
+ * await logErrorToServer(error);
37
+ * console.error('Error:', error);
38
+ * },
36
39
  * };
37
40
  * ```
38
41
  */
@@ -48,9 +51,9 @@ export interface UsePromiseStateReturn<R, E = unknown> extends PromiseState<R, E
48
51
  /** Set status to LOADING */
49
52
  setLoading: () => void;
50
53
  /** Set status to SUCCESS with result */
51
- setSuccess: (result: R) => void;
54
+ setSuccess: (result: R) => Promise<void>;
52
55
  /** Set status to ERROR with error */
53
- setError: (error: E) => void;
56
+ setError: (error: E) => Promise<void>;
54
57
  /** Set status to IDLE */
55
58
  setIdle: () => void;
56
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"usePromiseState.d.ts","sourceRoot":"","sources":["../../src/core/usePromiseState.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IAC1C,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,CAAC,GAAG,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IACnD,kCAAkC;IAClC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAChC,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;IACzF,uCAAuC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CACnD,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,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,CAAC,KAAK,IAAI,CAAC;IAC7B,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACtD,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GACrC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CA2D7B"}
1
+ {"version":3,"file":"usePromiseState.d.ts","sourceRoot":"","sources":["../../src/core/usePromiseState.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IAC1C,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,CAAC,GAAG,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IACnD,iDAAiD;IACjD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CACpD,SAAQ,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;IACnC,uCAAuC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CACnD,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,yBAAyB;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACtD,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GACrC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAqE7B"}
package/dist/index.es.js CHANGED
@@ -1,165 +1,179 @@
1
- import { useRef as v, useCallback as c, useEffect as I, useState as h, useMemo as L, useSyncExternalStore as C } from "react";
2
- import { fetcherRegistrar as w, getFetcher as F } from "@ahoo-wang/fetcher";
3
- function R() {
4
- var t = v(!1), e = c(function() {
1
+ import { useRef as w, useCallback as c, useEffect as R, useState as b, useMemo as v, useSyncExternalStore as x } from "react";
2
+ import { fetcherRegistrar as C, getFetcher as y } from "@ahoo-wang/fetcher";
3
+ function L() {
4
+ var t = w(!1), e = c(function() {
5
5
  return t.current;
6
6
  }, []);
7
- return I(function() {
7
+ return R(function() {
8
8
  return t.current = !0, function() {
9
9
  t.current = !1;
10
10
  };
11
11
  }, []), e;
12
12
  }
13
- function b(t) {
14
- const e = v(t);
13
+ function S(t) {
14
+ const e = w(t);
15
15
  return e.current = t, e;
16
16
  }
17
- var p = /* @__PURE__ */ ((t) => (t.IDLE = "idle", t.LOADING = "loading", t.SUCCESS = "success", t.ERROR = "error", t))(p || {});
17
+ var F = /* @__PURE__ */ ((t) => (t.IDLE = "idle", t.LOADING = "loading", t.SUCCESS = "success", t.ERROR = "error", t))(F || {});
18
18
  function m(t) {
19
- const [e, r] = h(
19
+ const [e, r] = b(
20
20
  t?.initialStatus ?? "idle"
21
21
  /* IDLE */
22
- ), [u, i] = h(void 0), [s, n] = h(void 0), o = R(), d = b(t), f = c(() => {
22
+ ), [a, u] = b(void 0), [s, n] = b(void 0), o = L(), l = S(t), d = c(() => {
23
23
  o() && (r(
24
24
  "loading"
25
25
  /* LOADING */
26
26
  ), n(void 0));
27
27
  }, [o]), E = c(
28
- (a) => {
29
- o() && (i(a), r(
30
- "success"
31
- /* SUCCESS */
32
- ), n(void 0), d.current?.onSuccess?.(a));
28
+ async (i) => {
29
+ if (o()) {
30
+ u(i), r(
31
+ "success"
32
+ /* SUCCESS */
33
+ ), n(void 0);
34
+ try {
35
+ await l.current?.onSuccess?.(i);
36
+ } catch (h) {
37
+ console.warn("PromiseState onSuccess callback error:", h);
38
+ }
39
+ }
33
40
  },
34
- [o, d]
35
- ), l = c(
36
- (a) => {
37
- o() && (n(a), r(
38
- "error"
39
- /* ERROR */
40
- ), i(void 0), d.current?.onError?.(a));
41
+ [o, l]
42
+ ), f = c(
43
+ async (i) => {
44
+ if (o()) {
45
+ n(i), r(
46
+ "error"
47
+ /* ERROR */
48
+ ), u(void 0);
49
+ try {
50
+ await l.current?.onError?.(i);
51
+ } catch (h) {
52
+ console.warn("PromiseState onError callback error:", h);
53
+ }
54
+ }
41
55
  },
42
- [o, d]
56
+ [o, l]
43
57
  ), g = c(() => {
44
58
  o() && (r(
45
59
  "idle"
46
60
  /* IDLE */
47
- ), n(void 0), i(void 0));
61
+ ), n(void 0), u(void 0));
48
62
  }, [o]);
49
- return L(
63
+ return v(
50
64
  () => ({
51
65
  status: e,
52
66
  loading: e === "loading",
53
- result: u,
67
+ result: a,
54
68
  error: s,
55
- setLoading: f,
69
+ setLoading: d,
56
70
  setSuccess: E,
57
- setError: l,
71
+ setError: f,
58
72
  setIdle: g
59
73
  }),
60
- [e, u, s, f, E, l, g]
74
+ [e, a, s, d, E, f, g]
61
75
  );
62
76
  }
63
- function x() {
64
- const t = v(0), e = c(() => ++t.current, []), r = c(() => t.current, []), u = c((n) => n === t.current, []), i = c(() => {
77
+ function I() {
78
+ const t = w(0), e = c(() => ++t.current, []), r = c(() => t.current, []), a = c((n) => n === t.current, []), u = c(() => {
65
79
  t.current++;
66
80
  }, []), s = c(() => {
67
81
  t.current = 0;
68
82
  }, []);
69
- return L(() => ({
83
+ return v(() => ({
70
84
  generate: e,
71
85
  current: r,
72
- isLatest: u,
73
- invalidate: i,
86
+ isLatest: a,
87
+ invalidate: u,
74
88
  reset: s
75
- }), [e, r, u, i, s]);
89
+ }), [e, r, a, u, s]);
76
90
  }
77
- function q(t) {
78
- const e = m(t), r = R(), u = x(), i = c(
91
+ function O(t) {
92
+ const e = m(t), r = L(), a = I(), u = c(
79
93
  async (n) => {
80
94
  if (!r())
81
95
  throw new Error("Component is unmounted");
82
- const o = u.generate();
96
+ const o = a.generate();
83
97
  e.setLoading();
84
98
  try {
85
- const f = await (typeof n == "function" ? n() : n);
86
- return r() && u.isLatest(o) && e.setSuccess(f), f;
87
- } catch (d) {
88
- throw r() && u.isLatest(o) && e.setError(d), d;
99
+ const d = await (typeof n == "function" ? n() : n);
100
+ return r() && a.isLatest(o) && await e.setSuccess(d), d;
101
+ } catch (l) {
102
+ throw r() && a.isLatest(o) && await e.setError(l), l;
89
103
  }
90
104
  },
91
- [e, r, u]
105
+ [e, r, a]
92
106
  ), s = c(() => {
93
107
  r() && e.setIdle();
94
108
  }, [e, r]);
95
- return L(
109
+ return v(
96
110
  () => ({
97
111
  loading: e.loading,
98
112
  result: e.result,
99
113
  error: e.error,
100
- execute: i,
114
+ execute: u,
101
115
  reset: s,
102
116
  status: e.status
103
117
  }),
104
- [e.loading, e.result, e.error, i, s, e.status]
118
+ [e.loading, e.result, e.error, u, s, e.status]
105
119
  );
106
120
  }
107
- function y(t) {
121
+ function q(t) {
108
122
  const e = c(
109
123
  (s) => t.addListener(s),
110
124
  [t]
111
- ), r = c(() => t.get(), [t]), u = C(e, r, r), i = c(
125
+ ), r = c(() => t.get(), [t]), a = x(e, r, r), u = c(
112
126
  (s) => t.set(s),
113
127
  [t]
114
128
  );
115
- return [u, i];
129
+ return [a, u];
116
130
  }
117
131
  function A(t) {
118
- const { fetcher: e = w.default } = t || {}, r = m(t), [u, i] = h(
132
+ const { fetcher: e = C.default } = t || {}, r = m(t), [a, u] = b(
119
133
  void 0
120
- ), s = R(), n = v(), o = x(), d = b(t), f = F(e), E = c(
121
- async (l) => {
122
- n.current && n.current.abort(), n.current = l.abortController ?? new AbortController(), l.abortController = n.current;
134
+ ), s = L(), n = w(), o = I(), l = S(t), d = y(e), E = c(
135
+ async (f) => {
136
+ n.current && n.current.abort(), n.current = f.abortController ?? new AbortController(), f.abortController = n.current;
123
137
  const g = o.generate();
124
138
  r.setLoading();
125
139
  try {
126
- const a = await f.exchange(
127
- l,
128
- d.current
140
+ const i = await d.exchange(
141
+ f,
142
+ l.current
129
143
  );
130
- s() && o.isLatest(g) && i(a);
131
- const S = await a.extractResult();
132
- s() && o.isLatest(g) && r.setSuccess(S);
133
- } catch (a) {
134
- if (a instanceof Error && a.name === "AbortError") {
144
+ s() && o.isLatest(g) && u(i);
145
+ const h = await i.extractResult();
146
+ s() && o.isLatest(g) && await r.setSuccess(h);
147
+ } catch (i) {
148
+ if (i instanceof Error && i.name === "AbortError") {
135
149
  s() && r.setIdle();
136
150
  return;
137
151
  }
138
- s() && o.isLatest(g) && r.setError(a);
152
+ s() && o.isLatest(g) && await r.setError(i);
139
153
  } finally {
140
- n.current === l.abortController && (n.current = void 0);
154
+ n.current === f.abortController && (n.current = void 0);
141
155
  }
142
156
  },
143
- [f, s, d, r, o]
157
+ [d, s, l, r, o]
144
158
  );
145
- return I(() => () => {
159
+ return R(() => () => {
146
160
  n.current?.abort(), n.current = void 0;
147
- }, []), L(
161
+ }, []), v(
148
162
  () => ({
149
163
  ...r,
150
- exchange: u,
164
+ exchange: a,
151
165
  execute: E
152
166
  }),
153
- [r, u, E]
167
+ [r, a, E]
154
168
  );
155
169
  }
156
170
  export {
157
- p as PromiseStatus,
158
- q as useExecutePromise,
171
+ F as PromiseStatus,
172
+ O as useExecutePromise,
159
173
  A as useFetcher,
160
- y as useKeyStorage,
161
- b as useLatest,
174
+ q as useKeyStorage,
175
+ S as useLatest,
162
176
  m as usePromiseState,
163
- x as useRequestId
177
+ I as useRequestId
164
178
  };
165
179
  //# sourceMappingURL=index.es.js.map