From 98358a0f12d4160c3281cbfe158932172f46e924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 23 Sep 2025 09:56:42 +0800 Subject: [PATCH 1/6] feat: Add defaultRequest to customRequest --- src/AjaxUploader.tsx | 18 ++++++++++++++++-- src/interface.tsx | 7 ++++++- tests/uploader.spec.tsx | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index 01fee9a..1a85a5a 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -242,10 +242,24 @@ class AjaxUploader extends Component { return; } - const { onStart, customRequest, name, headers, withCredentials, method } = this.props; + const { + onStart, + customRequest: propsCustomRequest, + name, + headers, + withCredentials, + method, + } = this.props; const { uid } = origin; - const request = customRequest || defaultRequest; + + const customRequest = agu => { + return propsCustomRequest({ ...agu, info: { defaultRequest } }); + }; + + const request = + (typeof propsCustomRequest === 'function' ? customRequest : propsCustomRequest) || + defaultRequest; const requestOption = { action, diff --git a/src/interface.tsx b/src/interface.tsx index 528c083..23b7122 100644 --- a/src/interface.tsx +++ b/src/interface.tsx @@ -31,7 +31,7 @@ export interface UploadProps file: RcFile, FileList: RcFile[], ) => BeforeUploadFileType | Promise | void; - customRequest?: (option: UploadRequestOption) => void | { abort: () => void }; + customRequest?: (option: CustomUploadRequestOption) => void | { abort: () => void }; withCredentials?: boolean; openFileDialogOnClick?: boolean; prefixCls?: string; @@ -78,6 +78,11 @@ export interface UploadRequestOption { method: UploadRequestMethod; } +export interface CustomUploadRequestOption extends UploadRequestOption { + info: { + defaultRequest: (option: UploadRequestOption) => { abort: () => void } | void; + }; +} export interface RcFile extends File { uid: string; } diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx index 229116e..abd5751 100644 --- a/tests/uploader.spec.tsx +++ b/tests/uploader.spec.tsx @@ -1266,4 +1266,40 @@ describe('uploader', () => { expect(container.querySelector('span')!.tabIndex).not.toBe(0); expect(container.querySelector('span')!).not.toHaveAttribute('role', 'button'); }); + it('should support defaultRequest in customRequest', done => { + const mockDefaultRequest = jest.fn(); + const customRequest = jest.fn(({ file, onSuccess, onError, info }) => { + // 模拟条件判断后使用默认上传 + if (file.name === 'success.png') { + info.defaultRequest = mockDefaultRequest; + info.defaultRequest({ file, onSuccess, onError }); + } else { + onError(new Error('custom error')); + } + }); + const onSuccess = jest.fn(); + const onError = jest.fn(); + const { container } = render( + , + ); + const input = container.querySelector('input')!; + const files = [new File([''], 'success.png', { type: 'image/png' })]; + Object.defineProperty(files, 'item', { + value: i => files[i], + }); + fireEvent.change(input, { target: { files } }); + setTimeout(() => { + requests[0].respond(200, {}, `["","${files[0].name}"]`); + setTimeout(() => { + expect(customRequest).toHaveBeenCalled(); + expect(onSuccess).toHaveBeenCalled(); + expect(mockDefaultRequest).toHaveBeenCalledWith({ + file: expect.any(File), + onSuccess: expect.any(Function), + onError: expect.any(Function), + }); + done(); + }, 100); + }, 100); + }); }); From 983bcb73c443993a0bf948a6d981fea7c478e919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 23 Sep 2025 10:30:36 +0800 Subject: [PATCH 2/6] test: change test --- src/AjaxUploader.tsx | 9 +++------ tests/uploader.spec.tsx | 7 ------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index 1a85a5a..491e946 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -253,13 +253,10 @@ class AjaxUploader extends Component { const { uid } = origin; - const customRequest = agu => { - return propsCustomRequest({ ...agu, info: { defaultRequest } }); - }; - const request = - (typeof propsCustomRequest === 'function' ? customRequest : propsCustomRequest) || - defaultRequest; + typeof propsCustomRequest === 'function' + ? args => propsCustomRequest({ ...args, info: { defaultRequest } }) + : propsCustomRequest || defaultRequest; const requestOption = { action, diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx index abd5751..c306313 100644 --- a/tests/uploader.spec.tsx +++ b/tests/uploader.spec.tsx @@ -1267,11 +1267,9 @@ describe('uploader', () => { expect(container.querySelector('span')!).not.toHaveAttribute('role', 'button'); }); it('should support defaultRequest in customRequest', done => { - const mockDefaultRequest = jest.fn(); const customRequest = jest.fn(({ file, onSuccess, onError, info }) => { // 模拟条件判断后使用默认上传 if (file.name === 'success.png') { - info.defaultRequest = mockDefaultRequest; info.defaultRequest({ file, onSuccess, onError }); } else { onError(new Error('custom error')); @@ -1293,11 +1291,6 @@ describe('uploader', () => { setTimeout(() => { expect(customRequest).toHaveBeenCalled(); expect(onSuccess).toHaveBeenCalled(); - expect(mockDefaultRequest).toHaveBeenCalledWith({ - file: expect.any(File), - onSuccess: expect.any(Function), - onError: expect.any(Function), - }); done(); }, 100); }, 100); From e80da551645af6e3bd482b81c05d94e79429e6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 23 Sep 2025 11:19:03 +0800 Subject: [PATCH 3/6] feat: change info.defaultRequest --- src/AjaxUploader.tsx | 2 +- src/interface.tsx | 11 +++++------ tests/uploader.spec.tsx | 14 ++++++-------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index 491e946..bbcd81b 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -255,7 +255,7 @@ class AjaxUploader extends Component { const request = typeof propsCustomRequest === 'function' - ? args => propsCustomRequest({ ...args, info: { defaultRequest } }) + ? args => propsCustomRequest(args, { defaultRequest }) : propsCustomRequest || defaultRequest; const requestOption = { diff --git a/src/interface.tsx b/src/interface.tsx index 23b7122..f2906e8 100644 --- a/src/interface.tsx +++ b/src/interface.tsx @@ -31,7 +31,7 @@ export interface UploadProps file: RcFile, FileList: RcFile[], ) => BeforeUploadFileType | Promise | void; - customRequest?: (option: CustomUploadRequestOption) => void | { abort: () => void }; + customRequest?: CustomUploadRequestOption; withCredentials?: boolean; openFileDialogOnClick?: boolean; prefixCls?: string; @@ -78,11 +78,10 @@ export interface UploadRequestOption { method: UploadRequestMethod; } -export interface CustomUploadRequestOption extends UploadRequestOption { - info: { - defaultRequest: (option: UploadRequestOption) => { abort: () => void } | void; - }; -} +export type CustomUploadRequestOption = ( + option: UploadRequestOption, + info: { defaultRequest: (option: UploadRequestOption) => { abort: () => void } | void }, +) => void | { abort: () => void }; export interface RcFile extends File { uid: string; } diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx index c306313..0626e6e 100644 --- a/tests/uploader.spec.tsx +++ b/tests/uploader.spec.tsx @@ -1267,10 +1267,9 @@ describe('uploader', () => { expect(container.querySelector('span')!).not.toHaveAttribute('role', 'button'); }); it('should support defaultRequest in customRequest', done => { - const customRequest = jest.fn(({ file, onSuccess, onError, info }) => { - // 模拟条件判断后使用默认上传 + const customRequest = jest.fn(({ file, onSuccess, onError }, { defaultRequest }) => { if (file.name === 'success.png') { - info.defaultRequest({ file, onSuccess, onError }); + defaultRequest({ file, onSuccess, onError }); } else { onError(new Error('custom error')); } @@ -1286,13 +1285,12 @@ describe('uploader', () => { value: i => files[i], }); fireEvent.change(input, { target: { files } }); + setTimeout(() => { requests[0].respond(200, {}, `["","${files[0].name}"]`); - setTimeout(() => { - expect(customRequest).toHaveBeenCalled(); - expect(onSuccess).toHaveBeenCalled(); - done(); - }, 100); + expect(customRequest).toHaveBeenCalled(); + expect(onSuccess).toHaveBeenCalled(); + done(); }, 100); }); }); From 988abfa26c8b5d7e9fb3a727c5195cbcbc7a310c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 23 Sep 2025 14:58:28 +0800 Subject: [PATCH 4/6] feat: simplify --- src/AjaxUploader.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index bbcd81b..efb46a6 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -253,10 +253,9 @@ class AjaxUploader extends Component { const { uid } = origin; - const request = - typeof propsCustomRequest === 'function' - ? args => propsCustomRequest(args, { defaultRequest }) - : propsCustomRequest || defaultRequest; + const request = propsCustomRequest + ? args => propsCustomRequest(args, { defaultRequest }) + : defaultRequest; const requestOption = { action, From 74852841ef140eeffbe36d6f91cc4d3ff726bfb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 23 Sep 2025 15:01:23 +0800 Subject: [PATCH 5/6] feat: simplify function --- src/AjaxUploader.tsx | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/AjaxUploader.tsx b/src/AjaxUploader.tsx index efb46a6..6ba8fc1 100644 --- a/src/AjaxUploader.tsx +++ b/src/AjaxUploader.tsx @@ -242,20 +242,11 @@ class AjaxUploader extends Component { return; } - const { - onStart, - customRequest: propsCustomRequest, - name, - headers, - withCredentials, - method, - } = this.props; + const { onStart, customRequest, name, headers, withCredentials, method } = this.props; const { uid } = origin; - const request = propsCustomRequest - ? args => propsCustomRequest(args, { defaultRequest }) - : defaultRequest; + const request = customRequest || defaultRequest; const requestOption = { action, @@ -284,7 +275,7 @@ class AjaxUploader extends Component { }; onStart(origin); - this.reqs[uid] = request(requestOption); + this.reqs[uid] = request(requestOption, { defaultRequest }); } reset() { From 466f2fcfb20a1ca4859632e00739b033964e017b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 23 Sep 2025 15:38:18 +0800 Subject: [PATCH 6/6] teat: verify defaultRequest path --- tests/uploader.spec.tsx | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/tests/uploader.spec.tsx b/tests/uploader.spec.tsx index 0626e6e..71eb777 100644 --- a/tests/uploader.spec.tsx +++ b/tests/uploader.spec.tsx @@ -1266,30 +1266,31 @@ describe('uploader', () => { expect(container.querySelector('span')!.tabIndex).not.toBe(0); expect(container.querySelector('span')!).not.toHaveAttribute('role', 'button'); }); - it('should support defaultRequest in customRequest', done => { - const customRequest = jest.fn(({ file, onSuccess, onError }, { defaultRequest }) => { - if (file.name === 'success.png') { - defaultRequest({ file, onSuccess, onError }); + + it('should receive same defaultRequest as src', done => { + const { default: srcRequest } = require('../src/request'); + let receivedDefaultRequest: any; + const customRequest = jest.fn((option, { defaultRequest }) => { + if (option.file.name === 'test.png') { + defaultRequest(option); + receivedDefaultRequest = defaultRequest; } else { - onError(new Error('custom error')); + option.onError(new Error('custom error')); } }); - const onSuccess = jest.fn(); - const onError = jest.fn(); - const { container } = render( - , - ); + const { container } = render(); + const input = container.querySelector('input')!; - const files = [new File([''], 'success.png', { type: 'image/png' })]; + const files = [new File([''], 'test.png')]; Object.defineProperty(files, 'item', { value: i => files[i], }); - fireEvent.change(input, { target: { files } }); + fireEvent.change(input, { target: { files } }); setTimeout(() => { requests[0].respond(200, {}, `["","${files[0].name}"]`); expect(customRequest).toHaveBeenCalled(); - expect(onSuccess).toHaveBeenCalled(); + expect(receivedDefaultRequest).toBe(srcRequest); done(); }, 100); });