diff --git a/packages/react-on-rails-pro/src/RSCProvider.tsx b/packages/react-on-rails-pro/src/RSCProvider.tsx index 3a25161d0e..20de75f18a 100644 --- a/packages/react-on-rails-pro/src/RSCProvider.tsx +++ b/packages/react-on-rails-pro/src/RSCProvider.tsx @@ -12,17 +12,19 @@ * https://github.com/shakacode/react_on_rails/blob/master/REACT-ON-RAILS-PRO-LICENSE.md */ -import * as React from 'react'; +'use client'; + +import React, { createContext, useContext, type ReactNode } from 'react'; import type { ClientGetReactServerComponentProps } from './getReactServerComponent.client.ts'; import { createRSCPayloadKey } from './utils.ts'; type RSCContextType = { - getComponent: (componentName: string, componentProps: unknown) => Promise; + getComponent: (componentName: string, componentProps: unknown) => Promise; - refetchComponent: (componentName: string, componentProps: unknown) => Promise; + refetchComponent: (componentName: string, componentProps: unknown) => Promise; }; -const RSCContext = React.createContext(undefined); +const RSCContext = createContext(undefined); /** * Creates a provider context for React Server Components. @@ -46,9 +48,9 @@ const RSCContext = React.createContext(undefined); export const createRSCProvider = ({ getServerComponent, }: { - getServerComponent: (props: ClientGetReactServerComponentProps) => Promise; + getServerComponent: (props: ClientGetReactServerComponentProps) => Promise; }) => { - const fetchRSCPromises: Record> = {}; + const fetchRSCPromises: Record> = {}; const getComponent = (componentName: string, componentProps: unknown) => { const key = createRSCPayloadKey(componentName, componentProps); @@ -74,7 +76,7 @@ export const createRSCProvider = ({ const contextValue = { getComponent, refetchComponent }; - return ({ children }: { children: React.ReactNode }) => { + return ({ children }: { children: ReactNode }) => { return {children}; }; }; @@ -95,11 +97,11 @@ export const createRSCProvider = ({ * @example * ```tsx * const { getComponent } = useRSC(); - * const serverComponent = React.use(getComponent('MyServerComponent', props)); + * const serverComponent = use(getComponent('MyServerComponent', props)); * ``` */ export const useRSC = () => { - const context = React.useContext(RSCContext); + const context = useContext(RSCContext); if (!context) { throw new Error('useRSC must be used within a RSCProvider'); } diff --git a/packages/react-on-rails-pro/src/RSCRoute.tsx b/packages/react-on-rails-pro/src/RSCRoute.tsx index 84d2a4b34c..715bbbb15f 100644 --- a/packages/react-on-rails-pro/src/RSCRoute.tsx +++ b/packages/react-on-rails-pro/src/RSCRoute.tsx @@ -16,7 +16,7 @@ 'use client'; -import * as React from 'react'; +import React, { Component, use, type ReactNode } from 'react'; import { useRSC } from './RSCProvider.tsx'; import { ServerComponentFetchError } from './ServerComponentFetchError.ts'; @@ -24,11 +24,11 @@ import { ServerComponentFetchError } from './ServerComponentFetchError.ts'; * Error boundary component for RSCRoute that adds server component name and props to the error * So, the parent ErrorBoundary can refetch the server component */ -class RSCRouteErrorBoundary extends React.Component< - { children: React.ReactNode; componentName: string; componentProps: unknown }, +class RSCRouteErrorBoundary extends Component< + { children: ReactNode; componentName: string; componentProps: unknown }, { error: Error | null } > { - constructor(props: { children: React.ReactNode; componentName: string; componentProps: unknown }) { + constructor(props: { children: ReactNode; componentName: string; componentProps: unknown }) { super(props); this.state = { error: null }; } @@ -75,9 +75,9 @@ export type RSCRouteProps = { componentProps: unknown; }; -const PromiseWrapper = ({ promise }: { promise: Promise }) => { - // React.use is available in React 18.3+ - const promiseResult = React.use(promise); +const PromiseWrapper = ({ promise }: { promise: Promise }) => { + // use is available in React 18.3+ + const promiseResult = use(promise); // In case that an error happened during the rendering of the RSC payload before the rendering of the component itself starts // RSC bundle will return an error object serialized inside the RSC payload @@ -88,7 +88,7 @@ const PromiseWrapper = ({ promise }: { promise: Promise }) => { return promiseResult; }; -const RSCRoute = ({ componentName, componentProps }: RSCRouteProps): React.ReactNode => { +const RSCRoute = ({ componentName, componentProps }: RSCRouteProps): ReactNode => { const { getComponent } = useRSC(); const componentPromise = getComponent(componentName, componentProps); return (