From 30bd1a0180883faf3e58bf8fcdf1c11ba40d12d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Jul 2025 11:19:55 +0200 Subject: [PATCH] Suspense refactoring --- packages/effect-fc/src/Component.ts | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) 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>,