| 586 | } |
| 587 | |
| 588 | function Root({ |
| 589 | callbacks, |
| 590 | children, |
| 591 | }: React.PropsWithChildren<{ |
| 592 | callbacks: Array<() => void> |
| 593 | }>): React.ReactElement { |
| 594 | // We use `useLayoutEffect` to guarantee the callbacks are executed |
| 595 | // as soon as React flushes the update |
| 596 | React.useLayoutEffect( |
| 597 | () => callbacks.forEach((callback) => callback()), |
| 598 | [callbacks] |
| 599 | ) |
| 600 | |
| 601 | if (process.env.__NEXT_TEST_MODE) { |
| 602 | // eslint-disable-next-line react-hooks/rules-of-hooks |
| 603 | React.useEffect(() => { |
| 604 | window.__NEXT_HYDRATED = true |
| 605 | window.__NEXT_HYDRATED_AT = performance.now() |
| 606 | |
| 607 | if (window.__NEXT_HYDRATED_CB) { |
| 608 | window.__NEXT_HYDRATED_CB() |
| 609 | } |
| 610 | }, []) |
| 611 | } |
| 612 | |
| 613 | return children as React.ReactElement |
| 614 | } |
| 615 | |
| 616 | function doRender(input: RenderRouteInfo): Promise<any> { |
| 617 | let { App, Component, props, err }: RenderRouteInfo = input |