Skip to content

Commit dbeec71

Browse files
czhlinchenzhilinJOU-amjs
authored
feat: add sendArgs inference to common use hooks. (#64)
* fix: check type error * chore: update loading unit tests * chore: fetch request init type * chore: on message generics fix * chore: remove tsconfig typings/general.ts * fix: the type arg of usecaptcha useautorequest useretriablerequest useserialrequest are added to --------- Co-authored-by: chenzhilin <[email protected]> Co-authored-by: Scott Hu <[email protected]>
1 parent edff32e commit dbeec71

24 files changed

+600
-586
lines changed

.vscode/extensions.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"recommendations": [
3+
"dbaeumer.vscode-eslint",
4+
"esbenp.prettier-vscode",
5+
"Orta.vscode-jest",
6+
"EditorConfig.EditorConfig"
7+
]
8+
}

package-lock.json

+10-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"@typescript-eslint/eslint-plugin": "^5.43.0",
4949
"@typescript-eslint/parser": "^5.43.0",
5050
"@vue/vue3-jest": "^29.2.4",
51-
"alova": "^2.18.2",
51+
"alova": "^2.21.0",
5252
"babel-jest": "^29.2.2",
5353
"commitizen": "^4.3.0",
5454
"commitlint": "^17.5.1",

packages/scene-react/test/useRetriableRequest.spec.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ describe('react => useRetriableRequest', () => {
9999
expect(mockCompleteFn).toHaveBeenCalledTimes(4);
100100
expect(mockSuccessFn).not.toBeCalled();
101101
expect(mockFailFn).toHaveBeenCalledTimes(1);
102-
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(2); // 分别在初始化、恢复为false两次被调用(立即发起请求时loading默认为true)
102+
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(3); // 分别在初始化、设置为true、恢复为false三次被调用(立即发起请求时loading默认为true)
103103
},
104104
{
105105
timeout: 4000
@@ -476,7 +476,7 @@ describe('react => useRetriableRequest', () => {
476476
expect(screen.getByRole('error')).toHaveTextContent('[alova/useRetriableRequest]stop retry manually');
477477
expect(mockRetryFn).toHaveBeenCalledTimes(2);
478478
expect(mockFailFn).toHaveBeenCalledTimes(1);
479-
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(2); // 分别在初始化、恢复为false两次被调用(立即发起请求时loading默认为true)
479+
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(3); // 分别在初始化、设置为true、恢复为false三次被调用
480480
},
481481
{
482482
timeout: 4000
@@ -489,7 +489,7 @@ describe('react => useRetriableRequest', () => {
489489
expect(screen.getByRole('error')).toHaveTextContent('[alova/useRetriableRequest]stop retry manually');
490490
expect(mockRetryFn).toHaveBeenCalledTimes(4);
491491
expect(mockFailFn).toHaveBeenCalledTimes(2);
492-
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(4); // 设置为true、设置回false两次被调用
492+
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(5); // 设置为true、设置回false两次被调用
493493
},
494494
{
495495
timeout: 4000
@@ -550,7 +550,7 @@ describe('react => useRetriableRequest', () => {
550550
expect(mockCompleteFn).toHaveBeenCalledTimes(4);
551551
expect(mockSuccessFn).not.toBeCalled();
552552
expect(mockFailFn).toHaveBeenCalledTimes(1);
553-
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(2); // 分别在初始化、恢复为false两次被调用(立即发起请求时loading默认为true)
553+
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(3); // 分别在初始化、设置为true、恢复为false三次被调用
554554
},
555555
{
556556
timeout: 4000
@@ -565,7 +565,7 @@ describe('react => useRetriableRequest', () => {
565565
expect(mockCompleteFn).toHaveBeenCalledTimes(8);
566566
expect(mockSuccessFn).not.toBeCalled();
567567
expect(mockFailFn).toHaveBeenCalledTimes(2);
568-
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(4); // 设置为true、恢复为false两次被调用
568+
expect(mockLoadingChangeFn).toHaveBeenCalledTimes(5); // 设置为true、恢复为false两次被调用
569569
},
570570
{
571571
timeout: 4000

packages/scene-react/test/useSSE.spec.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ import { undefinedValue } from '@/helper/variables';
22
import '@testing-library/jest-dom';
33
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
44
import { Alova, createAlova } from 'alova';
5-
import GlobalFetch, { FetchRequestInit } from 'alova/GlobalFetch';
5+
import GlobalFetch from 'alova/GlobalFetch';
66
import ReactHook from 'alova/react';
77
import ES from 'eventsource';
88
import { AddressInfo } from 'net';
99
import React, { ReactElement } from 'react';
1010
import { IntervalEventName, IntervalMessage, TriggerEventName, server, send as serverSend } from '~/test/sseServer';
1111
import { getAlovaInstance, untilCbCalled } from '~/test/utils';
12+
import { FetchRequestInit } from '~/typings/general';
1213
import { ReactState, useSSE } from '..';
1314
import { AlovaSSEMessageEvent, SSEHookReadyState } from '../typings/general';
14-
1515
Object.defineProperty(global, 'EventSource', { value: ES, writable: false });
1616

1717
let alovaInst: Alova<ReactState<any>, unknown, FetchRequestInit, any, any>;

packages/scene-react/typings/general.d.ts

+26-25
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/* eslint-disable @typescript-eslint/no-unused-vars */
21
import {
32
Alova,
43
AlovaCompleteEvent,
@@ -472,18 +471,18 @@ type SilentQueueMap = Record<string, SilentMethod[]>;
472471
/**
473472
* useCaptcha配置
474473
*/
475-
type CaptchaHookConfig<S, E, R, T, RC, RE, RH> = {
474+
type CaptchaHookConfig<S, E, R, T, RC, RE, RH, ARG extends any[]> = {
476475
/**
477476
* 初始倒计时,当验证码发送成功时将会以此数据来开始倒计时
478477
* @default 60
479478
*/
480479
initialCountdown?: number;
481-
} & RequestHookConfig<S, E, R, T, RC, RE, RH>;
480+
} & RequestHookConfig<S, E, R, T, RC, RE, RH, ARG>;
482481

483482
/**
484483
* useCaptcha返回值
485484
*/
486-
type CaptchaReturnType<S, E, R, T, RC, RE, RH> = UseHookReturnType<S, E, R, T, RC, RE, RH> & {
485+
type CaptchaReturnType<S, E, R, T, RC, RE, RH, ARG extends any[]> = UseHookReturnType<S, E, R, T, RC, RE, RH, ARG> & {
487486
/**
488487
* 当前倒计时,每秒-1,当倒计时到0时可再次发送验证码
489488
*/
@@ -572,7 +571,7 @@ type FormReturnType<S, E, R, T, RC, RE, RH, F> = UseHookReturnType<S, E, R, T, R
572571
/**
573572
* useRetriableRequest配置
574573
*/
575-
type RetriableHookConfig<S, E, R, T, RC, RE, RH> = {
574+
type RetriableHookConfig<S, E, R, T, RC, RE, RH, ARG extends any[]> = {
576575
/**
577576
* 最大重试次数,也可以设置为返回 boolean 值的函数,来动态判断是否继续重试。
578577
* @default 3
@@ -583,12 +582,12 @@ type RetriableHookConfig<S, E, R, T, RC, RE, RH> = {
583582
* 避让策略
584583
*/
585584
backoff?: BackoffPolicy;
586-
} & RequestHookConfig<S, E, R, T, RC, RE, RH>;
585+
} & RequestHookConfig<S, E, R, T, RC, RE, RH, ARG>;
587586

588587
/**
589588
* useRetriableRequest onRetry回调事件实例
590589
*/
591-
interface RetriableRetryEvent<S, E, R, T, RC, RE, RH> extends AlovaEvent<S, E, R, T, RC, RE, RH> {
590+
interface RetriableRetryEvent<S, E, R, T, RC, RE, RH, ARG extends any[]> extends AlovaEvent<S, E, R, T, RC, RE, RH, ARG> {
592591
/**
593592
* 当前的重试次数
594593
*/
@@ -602,7 +601,7 @@ interface RetriableRetryEvent<S, E, R, T, RC, RE, RH> extends AlovaEvent<S, E, R
602601
/**
603602
* useRetriableRequest onFail回调事件实例
604603
*/
605-
interface RetriableFailEvent<S, E, R, T, RC, RE, RH> extends AlovaErrorEvent<S, E, R, T, RC, RE, RH> {
604+
interface RetriableFailEvent<S, E, R, T, RC, RE, RH, ARG extends any[]> extends AlovaErrorEvent<S, E, R, T, RC, RE, RH, ARG> {
606605
/**
607606
* 失败时的重试次数
608607
*/
@@ -611,7 +610,7 @@ interface RetriableFailEvent<S, E, R, T, RC, RE, RH> extends AlovaErrorEvent<S,
611610
/**
612611
* useRetriableRequest返回值
613612
*/
614-
type RetriableReturnType<S, E, R, T, RC, RE, RH> = UseHookReturnType<S, E, R, T, RC, RE, RH> & {
613+
type RetriableReturnType<S, E, R, T, RC, RE, RH, ARG extends any[]> = UseHookReturnType<S, E, R, T, RC, RE, RH, ARG> & {
615614
/**
616615
* 停止重试,只在重试期间调用有效
617616
* 停止后将立即触发onFail事件
@@ -624,7 +623,7 @@ type RetriableReturnType<S, E, R, T, RC, RE, RH> = UseHookReturnType<S, E, R, T,
624623
* 它们将在重试发起后触发
625624
* @param handler 重试事件回调
626625
*/
627-
onRetry(handler: (event: RetriableRetryEvent<S, E, R, T, RC, RE, RH>) => void): void;
626+
onRetry(handler: (event: RetriableRetryEvent<S, E, R, T, RC, RE, RH, ARG>) => void): void;
628627

629628
/**
630629
* 失败事件绑定
@@ -635,7 +634,7 @@ type RetriableReturnType<S, E, R, T, RC, RE, RH> = UseHookReturnType<S, E, R, T,
635634
*
636635
* @param handler 失败事件回调
637636
*/
638-
onFail(handler: (event: RetriableFailEvent<S, E, R, T, RC, RE, RH>) => void): void;
637+
onFail(handler: (event: RetriableFailEvent<S, E, R, T, RC, RE, RH, ARG>) => void): void;
639638
};
640639

641640
// middlewares
@@ -650,14 +649,14 @@ interface Actions {
650649
* @param id 委托者id
651650
* @returns alova中间件函数
652651
*/
653-
type ActionDelegationMiddleware = (id: string | number | symbol) => <S, E, R, T, RC, RE, RH>(
652+
type ActionDelegationMiddleware = (id: string | number | symbol) => <S, E, R, T, RC, RE, RH, ARG extends any[]>(
654653
context: (
655-
| AlovaFrontMiddlewareContext<S, E, R, T, RC, RE, RH>
656-
| AlovaFetcherMiddlewareContext<S, E, R, T, RC, RE, RH>
654+
| AlovaFrontMiddlewareContext<S, E, R, T, RC, RE, RH, ARG>
655+
| AlovaFetcherMiddlewareContext<S, E, R, T, RC, RE, RH, ARG>
657656
) & {
658657
delegatingActions?: Actions;
659658
},
660-
next: AlovaGuardNext<S, E, R, T, RC, RE, RH>
659+
next: AlovaGuardNext<S, E, R, T, RC, RE, RH, ARG>
661660
) => Promise<any>;
662661

663662
/**
@@ -810,7 +809,7 @@ type AlovaRequestAdapterUnified<
810809
/**
811810
* useAutoRequest配置
812811
*/
813-
type AutoRequestHookConfig<S, E, R, T, RC, RE, RH> = {
812+
type AutoRequestHookConfig<S, E, R, T, RC, RE, RH, ARG extends any[]> = {
814813
/**
815814
* 轮询事件,单位ms,0表示不开启
816815
* @default 0
@@ -836,7 +835,7 @@ type AutoRequestHookConfig<S, E, R, T, RC, RE, RH> = {
836835
* @default 1000
837836
*/
838837
throttle?: number;
839-
} & RequestHookConfig<S, E, R, T, RC, RE, RH>;
838+
} & RequestHookConfig<S, E, R, T, RC, RE, RH, ARG>;
840839

841840
const enum SSEHookReadyState {
842841
CONNECTING = 0,
@@ -859,9 +858,9 @@ type SSEOnMessageTrigger<Data, S, E, R, T, RC, RE, RH> = (
859858
event: AlovaSSEMessageEvent<Data, S, E, R, T, RC, RE, RH>
860859
) => void;
861860
type SSEOnErrorTrigger<S, E, R, T, RC, RE, RH> = (event: AlovaSSEErrorEvent<S, E, R, T, RC, RE, RH>) => void;
862-
type SSEOn<S, E, R, T, RC, RE, RH> = (
861+
type SSEOn<S, E, R, T, RC, RE, RH, Data> = (
863862
eventName: string,
864-
handler: (event: AlovaSSEMessageEvent<S, E, R, T, RC, RE, RH>) => void
863+
handler: (event: AlovaSSEMessageEvent<Data, S, E, R, T, RC, RE, RH>) => void
865864
) => () => void;
866865

867866
type NotifyHandler = () => void;
@@ -904,7 +903,7 @@ type SSEHookConfig = {
904903
/**
905904
* useSSE() 返回类型
906905
*/
907-
type SSEReturnType<S, Data> = {
906+
type SSEReturnType<S, Data, E, R, T, RC, RE, RH> = {
908907
readyState: ExportedType<SSEHookReadyState, S>;
909908
data: ExportedType<Data | undefined, S>;
910909
eventSource: ExportedType<EventSource | undefined, S>;
@@ -922,33 +921,35 @@ type SSEReturnType<S, Data> = {
922921
* @param callback 回调函数
923922
* @returns 取消注册函数
924923
*/
925-
onOpen(callback: SSEOnOpenTrigger): () => void;
924+
onOpen(callback: SSEOnOpenTrigger<S, E, R, T, RC, RE, RH>): () => void;
926925

927926
/**
928927
* 注册 EventSource message 的回调函数
929928
* @param callback 回调函数
930929
* @returns 取消注册函数
931930
*/
932-
onMessage<T = Data>(callback: SSEOnMessageTrigger<T>): () => void;
931+
onMessage<D = Data>(callback: SSEOnMessageTrigger<D, S, E, R, T, RC, RE, RH>): () => void;
933932

934933
/**
935934
* 注册 EventSource error 的回调函数
936935
* @param callback 回调函数
937936
* @returns 取消注册函数
938937
*/
939-
onError(callback: SSEOnErrorTrigger): () => void;
938+
onError(callback: SSEOnErrorTrigger<S, E, R, T, RC, RE, RH>): () => void;
940939

941940
/**
942941
* @param eventName 事件名称,默认存在 `open` | `error` | `message`
943942
* @param handler 事件处理器
944943
*/
945-
on: SSEOn;
944+
on: SSEOn<S, E, R, T, RC, RE, RH, Data>;
946945
};
947946

948-
type AnyFn<T = Any> = (...args: any[]) => T;
947+
type AnyFn<T = any> = (...args: any[]) => T;
949948

950949
type UsePromiseReturnType<T> = {
951950
promise: Promise<T>;
952951
resolve: (value: T | PromiseLike<T>) => void;
953952
reject: (reason?: any) => void;
954953
};
954+
955+
type FetchRequestInit = Omit<RequestInit, 'body' | 'headers' | 'method'>;

0 commit comments

Comments
 (0)