@@ -224,8 +224,10 @@ const ChildrenContextProvider = memo(ChildrenContext.Provider);
224
224
225
225
type OuterSlotProps = {
226
226
elementsPromise : Elements ;
227
- shouldRenderPrev : ( ( err : unknown ) => boolean ) | undefined ;
228
- renderSlot : ( elements : Record < string , ReactNode > ) => ReactNode ;
227
+ unstable_shouldRenderPrev :
228
+ | ( ( err : unknown , prevElements : Record < string , ReactNode > ) => boolean )
229
+ | undefined ;
230
+ renderSlot : ( elements : Record < string , ReactNode > , err ?: unknown ) => ReactNode ;
229
231
children ?: ReactNode ;
230
232
} ;
231
233
@@ -245,9 +247,12 @@ class OuterSlot extends Component<OuterSlotProps, { error?: unknown }> {
245
247
// probably caused by history api fallback
246
248
( e as any ) . statusCode = 404 ;
247
249
}
248
- if ( this . props . shouldRenderPrev ?.( e ) && this . props . elementsPromise . prev ) {
249
- const elements = this . props . elementsPromise . prev ;
250
- return this . props . renderSlot ( elements ) ;
250
+ const prevElements = this . props . elementsPromise . prev ;
251
+ if (
252
+ prevElements &&
253
+ this . props . unstable_shouldRenderPrev ?.( e , prevElements )
254
+ ) {
255
+ return this . props . renderSlot ( prevElements , e ) ;
251
256
} else {
252
257
throw e ;
253
258
}
@@ -261,12 +266,16 @@ const InnerSlot = ({
261
266
renderSlot,
262
267
} : {
263
268
elementsPromise : Elements ;
264
- renderSlot : ( elements : Record < string , ReactNode > ) => ReactNode ;
269
+ renderSlot : ( elements : Record < string , ReactNode > , err ?: unknown ) => ReactNode ;
265
270
} ) => {
266
271
const elements = use ( elementsPromise ) ;
267
272
return renderSlot ( elements ) ;
268
273
} ;
269
274
275
+ const InnerErr = ( { err } : { err : unknown } ) => {
276
+ throw err ;
277
+ } ;
278
+
270
279
/**
271
280
* Slot component
272
281
* This is used under the Root component.
@@ -286,19 +295,32 @@ export const Slot = ({
286
295
children,
287
296
fallback,
288
297
unstable_shouldRenderPrev,
298
+ unstable_renderPrev,
289
299
} : {
290
300
id : string ;
291
301
children ?: ReactNode ;
292
302
fallback ?: ReactNode ;
293
- unstable_shouldRenderPrev ?: ( err : unknown ) => boolean ;
303
+ unstable_shouldRenderPrev ?: (
304
+ err : unknown ,
305
+ prevElements : Record < string , ReactNode > ,
306
+ ) => boolean ;
307
+ unstable_renderPrev ?: boolean ;
294
308
} ) => {
295
309
const elementsPromise = use ( ElementsContext ) ;
296
310
if ( ! elementsPromise ) {
297
311
throw new Error ( 'Missing Root component' ) ;
298
312
}
299
- const renderSlot = ( elements : Record < string , ReactNode > ) => {
313
+ const renderSlot = ( elements : Record < string , ReactNode > , err ?: unknown ) => {
300
314
if ( ! ( id in elements ) ) {
301
315
if ( fallback ) {
316
+ if ( err ) {
317
+ // HACK I'm not sure if this is the right way
318
+ return createElement (
319
+ ChildrenContextProvider ,
320
+ { value : createElement ( InnerErr , { err } ) } ,
321
+ fallback ,
322
+ ) ;
323
+ }
302
324
return fallback ;
303
325
}
304
326
throw new Error ( 'Not found: ' + id ) ;
@@ -309,11 +331,17 @@ export const Slot = ({
309
331
elements [ id ] ,
310
332
) ;
311
333
} ;
334
+ if ( unstable_renderPrev ) {
335
+ if ( ! elementsPromise . prev ) {
336
+ throw new Error ( 'Missing prev elements' ) ;
337
+ }
338
+ return renderSlot ( elementsPromise . prev ) ;
339
+ }
312
340
return createElement (
313
341
OuterSlot ,
314
342
{
315
343
elementsPromise,
316
- shouldRenderPrev : unstable_shouldRenderPrev ,
344
+ unstable_shouldRenderPrev,
317
345
renderSlot,
318
346
} ,
319
347
createElement ( InnerSlot , { elementsPromise, renderSlot } ) ,
0 commit comments