diff --git a/packages/effect-fc/src/Component.ts b/packages/effect-fc/src/Component.ts index ab56dfa..ceb75f8 100644 --- a/packages/effect-fc/src/Component.ts +++ b/packages/effect-fc/src/Component.ts @@ -1,4 +1,4 @@ -import { Context, Effect, type Equivalence, ExecutionStrategy, Function, Pipeable, Runtime, Scope, String, Tracer, type Utils } from "effect" +import { Context, Effect, type Equivalence, ExecutionStrategy, Function, Pipeable, Predicate, Runtime, Scope, String, Tracer, type Utils } from "effect" import * as React from "react" import * as Hook from "./Hook.js" import type { ExcludeKeys } from "./utils.js" @@ -111,7 +111,9 @@ export const useFC: { self: Component ): Effect.Effect, never, Exclude> } = Effect.fn("useFC")(function* ( - self: Component + self: + | Component & Memoized

+ | Component ) { const runtimeRef = React.useRef>>(null!) runtimeRef.current = yield* Effect.runtime>() @@ -129,7 +131,9 @@ export const useFC: { Effect.provideService(self.body(props), Scope.Scope, scope) ) f.displayName = self.displayName ?? "Anonymous" - return f + return Predicate.hasProperty(self, "memo") + ? React.memo(f, self.propsAreEqual) + : f }, [scope]) return React.createElement(FC, props) diff --git a/packages/example/src/todo/Todo.tsx b/packages/example/src/todo/Todo.tsx index 3a2495f..7767e32 100644 --- a/packages/example/src/todo/Todo.tsx +++ b/packages/example/src/todo/Todo.tsx @@ -111,6 +111,3 @@ export const Todo = Component.make(function* Todo(props: TodoProps) { ) }) - -const MemoizedTodo = Component.memo(Todo) -const MemoizedTodo2 = Component.memo(MemoizedTodo)