@@ -91,7 +91,49 @@ def react_component(component_name, options = {})
9191 end
9292 end
9393
94+ # Streams a server-side rendered React component using React's `renderToPipeableStream`.
95+ # Supports React 18 features like Suspense, concurrent rendering, and selective hydration.
96+ # Enables progressive rendering and improved performance for large components.
97+ #
98+ # Note: This function can only be used with React on Rails Pro.
99+ # The view that uses this function must be rendered using the
100+ # `stream_view_containing_react_components` method from the React on Rails Pro gem.
101+ #
102+ # Example of an async React component that can benefit from streaming:
103+ #
104+ # const AsyncComponent = async () => {
105+ # const data = await fetchData();
106+ # return <div>{data}</div>;
107+ # };
108+ #
109+ # function App() {
110+ # return (
111+ # <Suspense fallback={<div>Loading...</div>}>
112+ # <AsyncComponent />
113+ # </Suspense>
114+ # );
115+ # }
116+ #
117+ # @param [String] component_name Name of your registered component
118+ # @param [Hash] options Options for rendering
119+ # @option options [Hash] :props Props to pass to the react component
120+ # @option options [String] :dom_id DOM ID of the component container
121+ # @option options [Hash] :html_options Options passed to content_tag
122+ # @option options [Boolean] :prerender Set to false to disable server-side rendering
123+ # @option options [Boolean] :trace Set to true to add extra debugging information to the HTML
124+ # @option options [Boolean] :raise_on_prerender_error Set to true to raise exceptions during server-side rendering
125+ # Any other options are passed to the content tag, including the id.
94126 def stream_react_component ( component_name , options = { } )
127+ unless ReactOnRails ::Utils . react_on_rails_pro?
128+ raise ReactOnRails ::Error ,
129+ "You must use React on Rails Pro to use the stream_react_component method."
130+ end
131+
132+ if @rorp_rendering_fibers . nil?
133+ raise ReactOnRails ::Error ,
134+ "You must call stream_view_containing_react_components to render the view containing the react component"
135+ end
136+
95137 rendering_fiber = Fiber . new do
96138 stream = internal_stream_react_component ( component_name , options )
97139 stream . each_chunk do |chunk |
@@ -100,11 +142,6 @@ def stream_react_component(component_name, options = {})
100142 Fiber . yield nil
101143 end
102144
103- if @rorp_rendering_fibers . nil?
104- raise ReactOnRails ::Error ,
105- "You must call stream_view_containing_react_components to render the view containing the react component"
106- end
107-
108145 @rorp_rendering_fibers << rendering_fiber
109146
110147 # return the first chunk of the fiber
0 commit comments