@@ -30,6 +30,7 @@ let React;
3030let ReactDOMClient ;
3131let ReactServerDOMWriter ;
3232let ReactServerDOMReader ;
33+ let ReactServerDOMHooks ;
3334
3435describe ( 'ReactFlightDOM' , ( ) => {
3536 beforeEach ( ( ) => {
@@ -42,6 +43,7 @@ describe('ReactFlightDOM', () => {
4243 ReactDOMClient = require ( 'react-dom/client' ) ;
4344 ReactServerDOMWriter = require ( 'react-server-dom-webpack/writer.node.server' ) ;
4445 ReactServerDOMReader = require ( 'react-server-dom-webpack' ) ;
46+ ReactServerDOMHooks = require ( 'react-server-dom-webpack/flight-hooks' ) ;
4547 } ) ;
4648
4749 function getTestStream ( ) {
@@ -545,4 +547,105 @@ describe('ReactFlightDOM', () => {
545547 expect ( inputB . tagName ) . toBe ( 'INPUT' ) ;
546548 expect ( inputB . value ) . toBe ( 'goodbye' ) ;
547549 } ) ;
550+
551+ // @gate enableServerContext
552+ it ( 'supports useServerContextsForRefetch' , async ( ) => {
553+ let ServerContext = React . createServerContext ( 'ServerContext' , 'default' ) ;
554+
555+ function Foo ( ) {
556+ return (
557+ < >
558+ < ServerContext . Provider value = "hi this is server outer" >
559+ < ServerContext . Provider value = "hi this is server" >
560+ < Bar value = "" />
561+ </ ServerContext . Provider >
562+ < ServerContext . Provider value = "hi this is server2" >
563+ < Bar value = "2" />
564+ </ ServerContext . Provider >
565+ < Bar value = "outer" />
566+ </ ServerContext . Provider >
567+ < ServerContext . Provider value = "hi this is server outer2" >
568+ < Bar value = "outer2" />
569+ </ ServerContext . Provider >
570+ < Bar value = "default" />
571+ </ >
572+ ) ;
573+ }
574+ const contextsForRefetch = [ ] ;
575+ function ClientBaz ( ) {
576+ const context = React . useContext ( ServerContext ) ;
577+ contextsForRefetch . push (
578+ ReactServerDOMHooks . useServerContextsForRefetch ( ) ,
579+ ) ;
580+ return < span > { context } </ span > ;
581+ }
582+ function ClientBar ( { value} ) {
583+ return (
584+ < ServerContext . Provider
585+ value = { 'hi this is client' + ( value ? ' ' + value : '' ) } >
586+ < ClientBaz />
587+ </ ServerContext . Provider >
588+ ) ;
589+ }
590+ const Bar = moduleReference ( ClientBar ) ;
591+
592+ const { writable, readable} = getTestStream ( ) ;
593+ const { pipe} = ReactServerDOMWriter . renderToPipeableStream (
594+ < Foo /> ,
595+ webpackMap ,
596+ ) ;
597+ pipe ( writable ) ;
598+
599+ // Reset modules
600+ jest . resetModules ( ) ;
601+ act = require ( 'jest-react' ) . act ;
602+ Stream = require ( 'stream' ) ;
603+ React = require ( 'react' ) ;
604+ ReactDOMClient = require ( 'react-dom/client' ) ;
605+ ReactServerDOMWriter = require ( 'react-server-dom-webpack/writer.node.server' ) ;
606+ ReactServerDOMReader = require ( 'react-server-dom-webpack' ) ;
607+ ReactServerDOMHooks = require ( 'react-server-dom-webpack/flight-hooks' ) ;
608+
609+ ServerContext = React . createServerContext ( 'ServerContext' , 'default' ) ;
610+
611+ const response = ReactServerDOMReader . createFromReadableStream ( readable ) ;
612+
613+ const container = document . createElement ( 'div' ) ;
614+ const root = ReactDOMClient . createRoot ( container ) ;
615+
616+ function App ( { response : res } ) {
617+ return res . readRoot ( ) ;
618+ }
619+
620+ await act ( async ( ) => {
621+ root . render ( < App response = { response } /> ) ;
622+ } ) ;
623+
624+ expect ( container . innerHTML ) . toBe (
625+ '<span>hi this is client</span>' +
626+ '<span>hi this is client 2</span>' +
627+ '<span>hi this is client outer</span>' +
628+ '<span>hi this is client outer2</span>' +
629+ '<span>hi this is client default</span>' ,
630+ ) ;
631+
632+ const outer = [ 'ServerContext' , 'hi this is server outer' , null ] ;
633+ expect ( contextsForRefetch [ 0 ] ) . toEqual ( [
634+ 'ServerContext' ,
635+ 'hi this is server' ,
636+ outer ,
637+ ] ) ;
638+ expect ( contextsForRefetch [ 1 ] ) . toEqual ( [
639+ 'ServerContext' ,
640+ 'hi this is server2' ,
641+ outer ,
642+ ] ) ;
643+ expect ( contextsForRefetch [ 2 ] ) . toEqual ( outer ) ;
644+ expect ( contextsForRefetch [ 3 ] ) . toEqual ( [
645+ 'ServerContext' ,
646+ 'hi this is server outer2' ,
647+ null ,
648+ ] ) ;
649+ expect ( contextsForRefetch [ 4 ] ) . toEqual ( null ) ;
650+ } ) ;
548651} ) ;
0 commit comments