From f327728b3a9c5d551a9ed2f478a064dc3a42cce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 26 Jun 2025 04:26:58 +0200 Subject: [PATCH] Fix --- .../effect-components/src/ReactComponent.ts | 2 +- .../src/routes/effect-component-tests.tsx | 21 +++++++------------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/effect-components/src/ReactComponent.ts b/packages/effect-components/src/ReactComponent.ts index 06c33e5..d205fd7 100644 --- a/packages/effect-components/src/ReactComponent.ts +++ b/packages/effect-components/src/ReactComponent.ts @@ -22,7 +22,7 @@ export const use = ( export const useFC = ( self: ReactComponent, options?: ReactHook.ScopeOptions, -): Effect.Effect, never, R | Scope.Scope> => Effect.map( +): Effect.Effect, never, Exclude> => Effect.map( Effect.runtime(), runtime => props => Runtime.runSync(runtime)(Effect.provideService(self(props), Scope.Scope, useScope(runtime, options))), ) diff --git a/packages/example/src/routes/effect-component-tests.tsx b/packages/example/src/routes/effect-component-tests.tsx index 6a506fd..ec39ef1 100644 --- a/packages/example/src/routes/effect-component-tests.tsx +++ b/packages/example/src/routes/effect-component-tests.tsx @@ -1,7 +1,7 @@ import { Box, Text, TextField } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Console, Effect, Layer, ManagedRuntime, Runtime } from "effect" -import { use } from "effect-components" +import { Console, Effect, Layer, ManagedRuntime } from "effect" +import { ReactComponent, ReactHook } from "effect-components" import * as React from "react" @@ -13,7 +13,7 @@ function RouteComponent() { const runtime = React.useMemo(() => ManagedRuntime.make(Layer.empty), []) return <> - {runtime.runSync(use(MyTestComponent, Component => ( + {runtime.runSync(ReactComponent.use(MyTestComponent, Component => ( )).pipe( Effect.scoped @@ -26,7 +26,10 @@ const MyTestComponent = Effect.fn(function* MyTestComponent(props?: { readonly v const [state, setState] = React.useState("value") const effectValue = yield* Effect.succeed(`state: ${ state }`) - yield* useEffect(() => Console.log("ouient"), []) + yield* ReactHook.useEffect(() => Effect.andThen( + Effect.addFinalizer(() => Console.log("MyTestComponent umounted")), + Console.log("MyTestComponent mounted"), + ), []) return <> {effectValue} @@ -39,13 +42,3 @@ const MyTestComponent = Effect.fn(function* MyTestComponent(props?: { readonly v }) - - -const useEffect = ( - effect: () => Effect.Effect, - deps?: React.DependencyList, -): Effect.Effect => Effect.gen(function* useEffect() { - const runtime = yield* Effect.runtime() - - React.useEffect(() => Runtime.runSync(runtime)(Effect.asVoid(effect())), deps) -})