11// @flow
22
33import { type Node , type Element } from 'react'
4- import type { Visitor , YieldFrame , Frame , AbstractElement } from './types'
4+ import type {
5+ Visitor ,
6+ YieldFrame ,
7+ Frame ,
8+ AbstractElement ,
9+ RendererState
10+ } from './types'
511import { visit , update , SHOULD_YIELD } from './visitor'
612import { getChildrenArray } from './element'
713
@@ -10,6 +16,8 @@ import {
1016 setCurrentContextMap ,
1117 setCurrentErrorFrame ,
1218 getCurrentErrorFrame ,
19+ setCurrentRendererState ,
20+ initRendererState ,
1321 Dispatcher
1422} from './internals'
1523
@@ -18,7 +26,11 @@ import {
1826 the queue. Hence we recursively look at suspended components in
1927 this queue, wait for their promises to resolve, and continue
2028 calling visit() on their children. */
21- const flushFrames = ( queue : Frame [ ] , visitor : Visitor ) : Promise < void > => {
29+ const flushFrames = (
30+ queue : Frame [ ] ,
31+ visitor : Visitor ,
32+ state : RendererState
33+ ) : Promise < void > => {
2234 const frame = queue . shift ( )
2335 if ( ! frame ) {
2436 return Promise . resolve ( )
@@ -32,8 +44,9 @@ const flushFrames = (queue: Frame[], visitor: Visitor): Promise<void> => {
3244
3345 return Promise . resolve ( frame . thenable ) . then (
3446 ( ) => {
47+ setCurrentRendererState ( state )
3548 update ( frame , queue , visitor )
36- return flushFrames ( queue , visitor )
49+ return flushFrames ( queue , visitor , state )
3750 } ,
3851 ( error : Error ) => {
3952 if ( ! frame . errorFrame ) throw error
@@ -49,7 +62,10 @@ const renderPrepass = (element: Node, visitor?: Visitor): Promise<void> => {
4962 if ( ! visitor ) visitor = defaultVisitor
5063
5164 const queue : Frame [ ] = [ ]
52-
65+ // Renderer state is kept globally but restored and
66+ // passed around manually since it isn't dependent on the
67+ // render tree
68+ const state = initRendererState ( )
5369 // Context state is kept globally and is modified in-place.
5470 // Before we start walking the element tree we need to reset
5571 // its current state
@@ -63,7 +79,7 @@ const renderPrepass = (element: Node, visitor?: Visitor): Promise<void> => {
6379 return Promise . reject ( error )
6480 }
6581
66- return flushFrames ( queue , visitor )
82+ return flushFrames ( queue , visitor , state )
6783}
6884
6985export default renderPrepass
0 commit comments