diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index c692bfa..5a7f6cb 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -368,14 +368,21 @@ export const memoWithOptions: { export interface Suspense { readonly suspense: true + readonly suspenseOptions: Suspense.Options } -export type SuspenseProps = Omit +export namespace Suspense { + export interface Options { + readonly defaultFallback?: React.ReactNode + } + + export type Props = Omit +} export const suspense = , P extends {}>( - self: ExcludeKeys & Component> + self: ExcludeKeys & Component> ): T & Suspense => Object.setPrototypeOf( - { ...self, suspense: true }, + { ...self, suspense: true, suspenseOptions: {} }, Object.getPrototypeOf(self), ) @@ -383,7 +390,7 @@ export const suspense = , P extends {}>( export const useFC: { ( self: Component & Suspense - ): Effect.Effect, never, Exclude> + ): Effect.Effect, never, Exclude> ( self: Component ): Effect.Effect, never, Exclude> @@ -408,14 +415,14 @@ export const useFC: { return React.use(props.promise) }, - SuspenseInner => ({ fallback, name, ...props }: P & SuspenseProps) => { + SuspenseInner => ({ fallback, name, ...props }: P & Suspense.Props) => { const promise = Runtime.runPromise(runtimeRef.current)( Effect.provideService(self.body(props as P), Scope.Scope, scope) ) return React.createElement( React.Suspense, - { fallback, name }, + { fallback: fallback ?? self.suspenseOptions.defaultFallback, name }, React.createElement(SuspenseInner, { promise }), ) }, @@ -437,7 +444,7 @@ export const useFC: { export const use: { ( self: Component & Suspense, - fn: (Component: React.FC

) => React.ReactNode, + fn: (Component: React.FC

) => React.ReactNode, ): Effect.Effect> ( self: Component, @@ -451,13 +458,13 @@ export const withRuntime: { , R>( context: React.Context>, ): (self: T) => React.FC & SuspenseProps + ? Component.Props & Suspense.Props : Component.Props > ( self: Component & Suspense, context: React.Context>, - ): React.FC

+ ): React.FC

( self: Component, context: React.Context>,