@@ -22,7 +22,9 @@ export const resolver =
22
22
} : ResolverProps ) =>
23
23
( response : Response ) : Response => {
24
24
if ( ! response . ok ) {
25
- console . error ( `${ response . status } ${ response . type } ${ response . statusText } ` ) ;
25
+ console . error (
26
+ `${ response . status } ${ response . type } ${ response . statusText } `
27
+ ) ;
26
28
27
29
throw response ;
28
30
}
@@ -102,14 +104,8 @@ export const jsDownload = (
102
104
103
105
const currentWindow = window as unknown as WindowDownloaderEmbedded ;
104
106
105
- if (
106
- typeof currentWindow . navigator
107
- . msSaveBlob !== 'undefined'
108
- ) {
109
- return currentWindow . navigator . msSaveBlob (
110
- blob ,
111
- filename
112
- ) ;
107
+ if ( typeof currentWindow . navigator . msSaveBlob !== 'undefined' ) {
108
+ return currentWindow . navigator . msSaveBlob ( blob , filename ) ;
113
109
}
114
110
115
111
const blobURL =
@@ -152,7 +148,7 @@ export default function useDownloader(
152
148
const [ elapsed , setElapsed ] = useState ( 0 ) ;
153
149
const [ percentage , setPercentage ] = useState ( 0 ) ;
154
150
const [ size , setSize ] = useState ( 0 ) ;
155
- const [ error , setError ] = useState < ErrorMessage > ( null ) ;
151
+ const [ internalError , setInternalError ] = useState < ErrorMessage > ( null ) ;
156
152
const [ isInProgress , setIsInProgress ] = useState ( false ) ;
157
153
158
154
const controllerRef = useRef < null | ReadableStreamController < Uint8Array > > (
@@ -171,7 +167,7 @@ export default function useDownloader(
171
167
'Download canceled' ,
172
168
'The user aborted a request.' : 'Download timed out' ,
173
169
} ;
174
- setError ( ( ) => {
170
+ setInternalError ( ( ) => {
175
171
const resolvedError = errorMap [ err . message as keyof typeof errorMap ]
176
172
? errorMap [ err . message as keyof typeof errorMap ]
177
173
: err . message ;
@@ -207,7 +203,7 @@ export default function useDownloader(
207
203
if ( isInProgress ) return null ;
208
204
209
205
clearAllStateCallback ( ) ;
210
- setError ( ( ) => null ) ;
206
+ setInternalError ( ( ) => null ) ;
211
207
setIsInProgress ( ( ) => true ) ;
212
208
213
209
const intervalId = setInterval (
@@ -244,35 +240,39 @@ export default function useDownloader(
244
240
} )
245
241
. catch ( async ( error ) => {
246
242
clearAllStateCallback ( ) ;
243
+ let errorResponse = null ;
247
244
248
-
249
245
const errorMessage = await ( async ( ) => {
250
246
if ( error instanceof Response ) {
251
- const contentType = error . headers . get ( "Content-Type" ) || "" ;
252
- const isJson = contentType . includes ( "application/json" ) ;
253
-
247
+ errorResponse = error . clone ( ) ;
248
+
249
+ const contentType = error . headers . get ( 'Content-Type' ) || '' ;
250
+ const isJson = contentType . includes ( 'application/json' ) ;
251
+
254
252
const errorBody = isJson
255
253
? await error . json ( ) . catch ( ( ) => null )
256
254
: await error . text ( ) . catch ( ( ) => null ) ;
257
-
255
+
258
256
return [
259
257
`${ error . status } - ${ error . statusText } ` ,
260
258
errorBody ?. error ,
261
- errorBody ?. reason || ( typeof errorBody === "string" ? errorBody : null ) ,
259
+ errorBody ?. reason ||
260
+ ( typeof errorBody === 'string' ? errorBody : null ) ,
262
261
]
263
262
. filter ( Boolean )
264
- . join ( ": " ) ;
263
+ . join ( ': ' ) ;
265
264
}
266
-
267
- return error ?. message || " An unknown error occurred." ;
265
+
266
+ return error ?. message || ' An unknown error occurred.' ;
268
267
} ) ( ) ;
269
-
270
- setError ( { errorMessage } ) ;
271
-
268
+
269
+ const downloaderError : ErrorMessage = { errorMessage } ;
270
+ if ( errorResponse ) downloaderError . errorResponse = errorResponse ;
271
+ setInternalError ( downloaderError ) ;
272
+
272
273
clearTimeout ( timeoutId ) ;
273
274
clearInterval ( intervalId ) ;
274
275
} ) ;
275
-
276
276
} ,
277
277
[
278
278
isInProgress ,
@@ -285,24 +285,30 @@ export default function useDownloader(
285
285
]
286
286
) ;
287
287
288
- return useMemo (
288
+ const downloadState = useMemo (
289
289
( ) => ( {
290
290
elapsed,
291
291
percentage,
292
292
size,
293
+ error : internalError ,
294
+ isInProgress,
295
+ } ) ,
296
+ [ elapsed , percentage , size , internalError , isInProgress ]
297
+ ) ;
298
+
299
+ const downloadActions = useMemo (
300
+ ( ) => ( {
293
301
download : handleDownload ,
294
302
cancel : closeControllerCallback ,
295
- error,
296
- isInProgress,
297
303
} ) ,
298
- [
299
- elapsed ,
300
- percentage ,
301
- size ,
302
- handleDownload ,
303
- closeControllerCallback ,
304
- error ,
305
- isInProgress ,
306
- ]
304
+ [ handleDownload , closeControllerCallback ]
305
+ ) ;
306
+
307
+ return useMemo (
308
+ ( ) => ( {
309
+ ... downloadState ,
310
+ ... downloadActions ,
311
+ } ) ,
312
+ [ downloadState , downloadActions ]
307
313
) ;
308
314
}
0 commit comments