@@ -3,16 +3,17 @@ import React, { ReactNode, Suspense, useEffect, useState } from 'react'
3
3
import useSWR , { mutate } from 'swr'
4
4
import { createResponse , sleep } from './utils'
5
5
6
- class ErrorBoundary extends React . Component < { fallback : ReactNode } > {
7
- state = { hasError : false }
8
- static getDerivedStateFromError ( ) {
6
+ class ErrorBoundary extends React . Component < { fallback ? : ReactNode } > {
7
+ state = { hasError : false , message : null }
8
+ static getDerivedStateFromError ( error : Error ) {
9
9
return {
10
- hasError : true
10
+ hasError : true ,
11
+ message : error . message
11
12
}
12
13
}
13
14
render ( ) {
14
15
if ( this . state . hasError ) {
15
- return this . props . fallback
16
+ return this . props . fallback || this . state . message
16
17
}
17
18
return this . props . children
18
19
}
@@ -258,4 +259,46 @@ describe('useSWR - suspense', () => {
258
259
expect ( startRenderCount ) . toBe ( 2 ) // fallback + data
259
260
expect ( renderCount ) . toBe ( 1 ) // data
260
261
} )
262
+
263
+ it ( 'should throw an error if key is a falsy value' , async ( ) => {
264
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
265
+ jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
266
+
267
+ function Page ( ) {
268
+ const { data } = useSWR ( null , ( ) => createResponse ( 'SWR' ) , {
269
+ suspense : true
270
+ } )
271
+ return < div > hello, { data } </ div >
272
+ }
273
+ render (
274
+ < ErrorBoundary >
275
+ < Suspense fallback = { < div > fallback</ div > } >
276
+ < Page />
277
+ </ Suspense >
278
+ </ ErrorBoundary >
279
+ )
280
+
281
+ screen . getByText ( 'useSWR requires either key or fetcher with suspense mode' )
282
+ } )
283
+
284
+ it ( 'should throw an error if fetch is null' , async ( ) => {
285
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
286
+ jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
287
+
288
+ function Page ( ) {
289
+ const { data } = useSWR ( 'suspense-11' , null , {
290
+ suspense : true
291
+ } )
292
+ return < div > hello, { data } </ div >
293
+ }
294
+ render (
295
+ < ErrorBoundary >
296
+ < Suspense fallback = { < div > fallback</ div > } >
297
+ < Page />
298
+ </ Suspense >
299
+ </ ErrorBoundary >
300
+ )
301
+
302
+ screen . getByText ( 'useSWR requires either key or fetcher with suspense mode' )
303
+ } )
261
304
} )
0 commit comments