diff --git a/resources/assets/src/scripts/net.ts b/resources/assets/src/scripts/net.ts index 8c1ee3cc..014edc7e 100644 --- a/resources/assets/src/scripts/net.ts +++ b/resources/assets/src/scripts/net.ts @@ -109,35 +109,38 @@ export function get(url: string, params = empty): Promise { return walkFetch(new Request(`${blessing.base_url}${url}?${qs}`, init)) } -function nonGet(method: string, url: string, data: any): Promise { +function nonGet( + method: string, + url: string, + data?: FormData | object, +): Promise { emit('beforeFetch', { method: method.toUpperCase(), url, data, }) - const isFormData = data instanceof FormData - const request = new Request(`${blessing.base_url}${url}`, { - body: isFormData ? data : JSON.stringify(data), + body: data instanceof FormData ? data : JSON.stringify(data), method: method.toUpperCase(), ...init, }) - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - !isFormData && request.headers.set('Content-Type', 'application/json') + if (!(data instanceof FormData)) { + request.headers.set('Content-Type', 'application/json') + } return walkFetch(request) } -export function post(url: string, data = empty): Promise { +export function post(url: string, data?: object): Promise { return nonGet('POST', url, data) } -export function put(url: string, data = empty): Promise { +export function put(url: string, data?: object): Promise { return nonGet('PUT', url, data) } -export function del(url: string, data = empty): Promise { +export function del(url: string, data?: object): Promise { return nonGet('DELETE', url, data) } diff --git a/resources/assets/src/views/user/Players/index.tsx b/resources/assets/src/views/user/Players/index.tsx index 045527fc..2c1ba137 100644 --- a/resources/assets/src/views/user/Players/index.tsx +++ b/resources/assets/src/views/user/Players/index.tsx @@ -91,9 +91,16 @@ const Players: React.FC = () => { return } + // workaround for AliCDN, issue#184 + const search = new URLSearchParams() + if (skin) { + search.append('skin', 'true') + } + if (cape) { + search.append('cape', 'true') + } const { code, message } = await fetch.del( - urls.user.player.clear(selected), - { type: [skin && 'skin', cape && 'cape'].filter(Boolean) }, + `${urls.user.player.clear(selected)}?${search}`, ) if (code === 0) { toast.success(message) diff --git a/resources/assets/tests/scripts/net.test.ts b/resources/assets/tests/scripts/net.test.ts index 9564a0d3..2c038b53 100644 --- a/resources/assets/tests/scripts/net.test.ts +++ b/resources/assets/tests/scripts/net.test.ts @@ -69,7 +69,7 @@ test('the POST method', async () => { expect(request.headers.get('Content-Type')).toBe('application/json') await net.post('/abc') - expect(window.fetch.mock.calls[2][0].body).toBe('{}') + expect(window.fetch.mock.calls[2][0].body).toBeUndefined() }) test('the PUT method', () => { @@ -88,7 +88,7 @@ test('the PUT method', () => { expect(stub).toBeCalledWith({ method: 'PUT', url: '/abc', - data: {}, + data: undefined, }) }) @@ -108,7 +108,7 @@ test('the DELETE method', () => { expect(stub).toBeCalledWith({ method: 'DELETE', url: '/abc', - data: {}, + data: undefined, }) }) diff --git a/resources/assets/tests/views/user/Players.test.tsx b/resources/assets/tests/views/user/Players.test.tsx index f83fe678..1971f04e 100644 --- a/resources/assets/tests/views/user/Players.test.tsx +++ b/resources/assets/tests/views/user/Players.test.tsx @@ -363,9 +363,9 @@ describe('reset texture', () => { fireEvent.click(getByLabelText(t('general.cape'))) fireEvent.click(getByText(t('general.confirm'))) await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { - type: ['skin', 'cape'], - }), + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?skin=true&cape=true`, + ), ) expect(queryByText('success')).toBeInTheDocument() expect(getByRole('status')).toHaveClass('alert-success') @@ -383,9 +383,9 @@ describe('reset texture', () => { fireEvent.click(getByLabelText(t('general.skin'))) fireEvent.click(getByText(t('general.confirm'))) await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { - type: ['skin'], - }), + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?skin=true`, + ), ) expect(queryByText('success')).toBeInTheDocument() expect(getByRole('status')).toHaveClass('alert-success') @@ -403,9 +403,9 @@ describe('reset texture', () => { fireEvent.click(getByLabelText(t('general.cape'))) fireEvent.click(getByText(t('general.confirm'))) await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { - type: ['cape'], - }), + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?cape=true`, + ), ) expect(queryByText('success')).toBeInTheDocument() expect(getByRole('status')).toHaveClass('alert-success') @@ -434,9 +434,9 @@ describe('reset texture', () => { fireEvent.click(getByLabelText(t('general.skin'))) fireEvent.click(getByText(t('general.confirm'))) await waitFor(() => - expect(fetch.del).toBeCalledWith(urls.user.player.clear(fixture.pid), { - type: ['skin'], - }), + expect(fetch.del).toBeCalledWith( + `${urls.user.player.clear(fixture.pid)}?skin=true`, + ), ) expect(queryByText('failed')).toBeInTheDocument() expect(getByRole('alert')).toHaveClass('alert-danger')