@@ -22,7 +22,9 @@ export const resolver =
2222 } : ResolverProps ) =>
2323 ( response : Response ) : Response => {
2424 if ( ! response . ok ) {
25- console . error ( `${ response . status } ${ response . type } ${ response . statusText } ` ) ;
25+ console . error (
26+ `${ response . status } ${ response . type } ${ response . statusText } `
27+ ) ;
2628
2729 throw response ;
2830 }
@@ -102,14 +104,8 @@ export const jsDownload = (
102104
103105 const currentWindow = window as unknown as WindowDownloaderEmbedded ;
104106
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 ) ;
113109 }
114110
115111 const blobURL =
@@ -152,7 +148,7 @@ export default function useDownloader(
152148 const [ elapsed , setElapsed ] = useState ( 0 ) ;
153149 const [ percentage , setPercentage ] = useState ( 0 ) ;
154150 const [ size , setSize ] = useState ( 0 ) ;
155- const [ error , setError ] = useState < ErrorMessage > ( null ) ;
151+ const [ internalError , setInternalError ] = useState < ErrorMessage > ( null ) ;
156152 const [ isInProgress , setIsInProgress ] = useState ( false ) ;
157153
158154 const controllerRef = useRef < null | ReadableStreamController < Uint8Array > > (
@@ -171,7 +167,7 @@ export default function useDownloader(
171167 'Download canceled' ,
172168 'The user aborted a request.' : 'Download timed out' ,
173169 } ;
174- setError ( ( ) => {
170+ setInternalError ( ( ) => {
175171 const resolvedError = errorMap [ err . message as keyof typeof errorMap ]
176172 ? errorMap [ err . message as keyof typeof errorMap ]
177173 : err . message ;
@@ -207,7 +203,7 @@ export default function useDownloader(
207203 if ( isInProgress ) return null ;
208204
209205 clearAllStateCallback ( ) ;
210- setError ( ( ) => null ) ;
206+ setInternalError ( ( ) => null ) ;
211207 setIsInProgress ( ( ) => true ) ;
212208
213209 const intervalId = setInterval (
@@ -244,35 +240,39 @@ export default function useDownloader(
244240 } )
245241 . catch ( async ( error ) => {
246242 clearAllStateCallback ( ) ;
243+ let errorResponse = null ;
247244
248-
249245 const errorMessage = await ( async ( ) => {
250246 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+
254252 const errorBody = isJson
255253 ? await error . json ( ) . catch ( ( ) => null )
256254 : await error . text ( ) . catch ( ( ) => null ) ;
257-
255+
258256 return [
259257 `${ error . status } - ${ error . statusText } ` ,
260258 errorBody ?. error ,
261- errorBody ?. reason || ( typeof errorBody === "string" ? errorBody : null ) ,
259+ errorBody ?. reason ||
260+ ( typeof errorBody === 'string' ? errorBody : null ) ,
262261 ]
263262 . filter ( Boolean )
264- . join ( ": " ) ;
263+ . join ( ': ' ) ;
265264 }
266-
267- return error ?. message || " An unknown error occurred." ;
265+
266+ return error ?. message || ' An unknown error occurred.' ;
268267 } ) ( ) ;
269-
270- setError ( { errorMessage } ) ;
271-
268+
269+ const downloaderError : ErrorMessage = { errorMessage } ;
270+ if ( errorResponse ) downloaderError . errorResponse = errorResponse ;
271+ setInternalError ( downloaderError ) ;
272+
272273 clearTimeout ( timeoutId ) ;
273274 clearInterval ( intervalId ) ;
274275 } ) ;
275-
276276 } ,
277277 [
278278 isInProgress ,
@@ -285,24 +285,30 @@ export default function useDownloader(
285285 ]
286286 ) ;
287287
288- return useMemo (
288+ const downloadState = useMemo (
289289 ( ) => ( {
290290 elapsed,
291291 percentage,
292292 size,
293+ error : internalError ,
294+ isInProgress,
295+ } ) ,
296+ [ elapsed , percentage , size , internalError , isInProgress ]
297+ ) ;
298+
299+ const downloadActions = useMemo (
300+ ( ) => ( {
293301 download : handleDownload ,
294302 cancel : closeControllerCallback ,
295- error,
296- isInProgress,
297303 } ) ,
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 ]
307313 ) ;
308314}
0 commit comments