Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ build
dist
.rpt2_cache

# Editor directories and files
.idea

# misc
.DS_Store
.env
Expand All @@ -24,4 +27,4 @@ yarn-error.log*
.vercel

coverage
.dccache
.dccache
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

| Statements | Branches | Functions | Lines |
| ----------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| ![Statements](https://img.shields.io/badge/statements-86.44%25-yellow.svg?style=flat&logo=jest) | ![Branches](https://img.shields.io/badge/branches-68.62%25-red.svg?style=flat&logo=jest) | ![Functions](https://img.shields.io/badge/functions-77.14%25-red.svg?style=flat&logo=jest) | ![Lines](https://img.shields.io/badge/lines-86.91%25-yellow.svg?style=flat&logo=jest) |
| ![Statements](https://img.shields.io/badge/statements-86.99%25-yellow.svg?style=flat&logo=jest) | ![Branches](https://img.shields.io/badge/branches-69.81%25-red.svg?style=flat&logo=jest) | ![Functions](https://img.shields.io/badge/functions-77.14%25-red.svg?style=flat&logo=jest) | ![Lines](https://img.shields.io/badge/lines-87.38%25-yellow.svg?style=flat&logo=jest) |

## Table of Contents

Expand Down
29 changes: 14 additions & 15 deletions src/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,22 +207,20 @@ describe('useDownloader failures', () => {
it('should start download with response.ok false and an error from the response', async () => {
const { result, waitForNextUpdate } = renderHook(() => useDownloader());

global.window.fetch = jest.fn(() =>
Promise.resolve(
new Response(
JSON.stringify({
error: 'File download not allowed',
reason:
'User must complete verification before accessing this file.',
}),
{
status: 403,
statusText: 'Forbidden',
headers: { 'Content-Type': 'application/json' },
}
)
)
const errorResponse = new Response(
JSON.stringify({
error: 'File download not allowed',
reason: 'User must complete verification before accessing this file.',
}),
{
status: 403,
statusText: 'Forbidden',
headers: { 'Content-Type': 'application/json' },
}
);
const resultErrorResponse = errorResponse.clone();

global.window.fetch = jest.fn(() => Promise.resolve(errorResponse));

expect(result.current.error).toBeNull();

Expand All @@ -237,6 +235,7 @@ describe('useDownloader failures', () => {
expect(result.current.error).toEqual({
errorMessage:
'403 - Forbidden: File download not allowed: User must complete verification before accessing this file.',
errorResponse: resultErrorResponse,
});
});

Expand Down
44 changes: 22 additions & 22 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ export const resolver =
}: ResolverProps) =>
(response: Response): Response => {
if (!response.ok) {
console.error(`${response.status} ${response.type} ${response.statusText}`);
console.error(
`${response.status} ${response.type} ${response.statusText}`
);

throw response;
}
Expand Down Expand Up @@ -102,14 +104,8 @@ export const jsDownload = (

const currentWindow = window as unknown as WindowDownloaderEmbedded;

if (
typeof currentWindow.navigator
.msSaveBlob !== 'undefined'
) {
return currentWindow.navigator.msSaveBlob(
blob,
filename
);
if (typeof currentWindow.navigator.msSaveBlob !== 'undefined') {
return currentWindow.navigator.msSaveBlob(blob, filename);
}

const blobURL =
Expand Down Expand Up @@ -244,35 +240,39 @@ export default function useDownloader(
})
.catch(async (error) => {
clearAllStateCallback();
let errorResponse = null;


const errorMessage = await (async () => {
if (error instanceof Response) {
const contentType = error.headers.get("Content-Type") || "";
const isJson = contentType.includes("application/json");

errorResponse = error.clone();

const contentType = error.headers.get('Content-Type') || '';
const isJson = contentType.includes('application/json');

const errorBody = isJson
? await error.json().catch(() => null)
: await error.text().catch(() => null);

return [
`${error.status} - ${error.statusText}`,
errorBody?.error,
errorBody?.reason || (typeof errorBody === "string" ? errorBody : null),
errorBody?.reason ||
(typeof errorBody === 'string' ? errorBody : null),
]
.filter(Boolean)
.join(": ");
.join(': ');
}
return error?.message || "An unknown error occurred.";

return error?.message || 'An unknown error occurred.';
})();

setError({ errorMessage });


const downloaderError: ErrorMessage = { errorMessage };
if (errorResponse) downloaderError.errorResponse = errorResponse;
setError(downloaderError);

clearTimeout(timeoutId);
clearInterval(intervalId);
});

},
[
isInProgress,
Expand Down
5 changes: 3 additions & 2 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { SetStateAction } from 'react';

export type ErrorMessage = {
errorMessage: string;
errorResponse?: Response;
} | null;

/** useDownloader options for fetch call
Expand Down Expand Up @@ -89,6 +90,6 @@ interface CustomURL extends URL {

export interface WindowDownloaderEmbedded extends Window {
navigator: CustomNavigator;
URL?: CustomURL
webkitURL?: CustomURL
URL?: CustomURL;
webkitURL?: CustomURL;
}
Loading