Skip to content

Commit 98358a0

Browse files
author
刘欢
committed
feat: Add defaultRequest to customRequest
1 parent 4958954 commit 98358a0

File tree

3 files changed

+58
-3
lines changed

3 files changed

+58
-3
lines changed

src/AjaxUploader.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,24 @@ class AjaxUploader extends Component<UploadProps> {
242242
return;
243243
}
244244

245-
const { onStart, customRequest, name, headers, withCredentials, method } = this.props;
245+
const {
246+
onStart,
247+
customRequest: propsCustomRequest,
248+
name,
249+
headers,
250+
withCredentials,
251+
method,
252+
} = this.props;
246253

247254
const { uid } = origin;
248-
const request = customRequest || defaultRequest;
255+
256+
const customRequest = agu => {
257+
return propsCustomRequest({ ...agu, info: { defaultRequest } });
258+
};
259+
260+
const request =
261+
(typeof propsCustomRequest === 'function' ? customRequest : propsCustomRequest) ||
262+
defaultRequest;
249263

250264
const requestOption = {
251265
action,

src/interface.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export interface UploadProps
3131
file: RcFile,
3232
FileList: RcFile[],
3333
) => BeforeUploadFileType | Promise<void | BeforeUploadFileType> | void;
34-
customRequest?: (option: UploadRequestOption) => void | { abort: () => void };
34+
customRequest?: (option: CustomUploadRequestOption) => void | { abort: () => void };
3535
withCredentials?: boolean;
3636
openFileDialogOnClick?: boolean;
3737
prefixCls?: string;
@@ -78,6 +78,11 @@ export interface UploadRequestOption<T = any> {
7878
method: UploadRequestMethod;
7979
}
8080

81+
export interface CustomUploadRequestOption extends UploadRequestOption {
82+
info: {
83+
defaultRequest: (option: UploadRequestOption) => { abort: () => void } | void;
84+
};
85+
}
8186
export interface RcFile extends File {
8287
uid: string;
8388
}

tests/uploader.spec.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,4 +1266,40 @@ describe('uploader', () => {
12661266
expect(container.querySelector('span')!.tabIndex).not.toBe(0);
12671267
expect(container.querySelector('span')!).not.toHaveAttribute('role', 'button');
12681268
});
1269+
it('should support defaultRequest in customRequest', done => {
1270+
const mockDefaultRequest = jest.fn();
1271+
const customRequest = jest.fn(({ file, onSuccess, onError, info }) => {
1272+
// 模拟条件判断后使用默认上传
1273+
if (file.name === 'success.png') {
1274+
info.defaultRequest = mockDefaultRequest;
1275+
info.defaultRequest({ file, onSuccess, onError });
1276+
} else {
1277+
onError(new Error('custom error'));
1278+
}
1279+
});
1280+
const onSuccess = jest.fn();
1281+
const onError = jest.fn();
1282+
const { container } = render(
1283+
<Upload customRequest={customRequest} onSuccess={onSuccess} onError={onError} />,
1284+
);
1285+
const input = container.querySelector('input')!;
1286+
const files = [new File([''], 'success.png', { type: 'image/png' })];
1287+
Object.defineProperty(files, 'item', {
1288+
value: i => files[i],
1289+
});
1290+
fireEvent.change(input, { target: { files } });
1291+
setTimeout(() => {
1292+
requests[0].respond(200, {}, `["","${files[0].name}"]`);
1293+
setTimeout(() => {
1294+
expect(customRequest).toHaveBeenCalled();
1295+
expect(onSuccess).toHaveBeenCalled();
1296+
expect(mockDefaultRequest).toHaveBeenCalledWith({
1297+
file: expect.any(File),
1298+
onSuccess: expect.any(Function),
1299+
onError: expect.any(Function),
1300+
});
1301+
done();
1302+
}, 100);
1303+
}, 100);
1304+
});
12691305
});

0 commit comments

Comments
 (0)