From 11dfcdaf855b2b9343887261129860f80eefca06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 1 Oct 2025 22:55:16 +0200 Subject: [PATCH] Example fixes --- packages/effect-fc/package.json | 14 ++++++++++---- .../src/lib/form/TextFieldFormInput.tsx | 2 +- .../example/src/lib/input/TextAreaInput.tsx | 7 ++++--- .../example/src/lib/input/TextFieldInput.tsx | 9 +++++---- packages/example/src/routes/form.tsx | 6 +++--- packages/example/src/routes/index.tsx | 8 ++++---- packages/example/src/todo/Todo.tsx | 19 ++++++++----------- .../example/src/todo/TodosState.service.ts | 4 ++-- 8 files changed, 37 insertions(+), 32 deletions(-) diff --git a/packages/effect-fc/package.json b/packages/effect-fc/package.json index 48c8af8..bc2b1a1 100644 --- a/packages/effect-fc/package.json +++ b/packages/effect-fc/package.json @@ -17,10 +17,16 @@ "types": "./dist/index.d.ts", "default": "./dist/index.js" }, - "./*": { - "types": "./dist/*.d.ts", - "default": "./dist/*.js" - } + "./*": [ + { + "types": "./dist/*/index.d.ts", + "default": "./dist/*/index.js" + }, + { + "types": "./dist/*.d.ts", + "default": "./dist/*.js" + } + ] }, "scripts": { "build": "tsc", diff --git a/packages/example/src/lib/form/TextFieldFormInput.tsx b/packages/example/src/lib/form/TextFieldFormInput.tsx index 907fbde..040a3dc 100644 --- a/packages/example/src/lib/form/TextFieldFormInput.tsx +++ b/packages/example/src/lib/form/TextFieldFormInput.tsx @@ -1,7 +1,7 @@ import { Callout, Flex, Spinner, TextField } from "@radix-ui/themes" import { Array, Option } from "effect" import { Component, Form } from "effect-fc" -import { useSubscribables } from "effect-fc/hooks" +import { useSubscribables } from "effect-fc/Hooks" export interface TextFieldFormInputProps diff --git a/packages/example/src/lib/input/TextAreaInput.tsx b/packages/example/src/lib/input/TextAreaInput.tsx index d4413fd..64fb1a0 100644 --- a/packages/example/src/lib/input/TextAreaInput.tsx +++ b/packages/example/src/lib/input/TextAreaInput.tsx @@ -1,7 +1,8 @@ -import { Callout, Flex, TextArea, TextAreaProps } from "@radix-ui/themes" -import { Array, Equivalence, Option, ParseResult, Schema, Struct } from "effect" +/** biome-ignore-all lint/correctness/useHookAtTopLevel: effect-fc HOC */ +import { Callout, Flex, TextArea, type TextAreaProps } from "@radix-ui/themes" +import { Array, type Equivalence, Option, ParseResult, type Schema, Struct } from "effect" import { Component } from "effect-fc" -import { useInput } from "effect-fc/hooks" +import { useInput } from "effect-fc/Hooks" import * as React from "react" diff --git a/packages/example/src/lib/input/TextFieldInput.tsx b/packages/example/src/lib/input/TextFieldInput.tsx index d5f8432..905c0f8 100644 --- a/packages/example/src/lib/input/TextFieldInput.tsx +++ b/packages/example/src/lib/input/TextFieldInput.tsx @@ -1,7 +1,8 @@ +/** biome-ignore-all lint/correctness/useHookAtTopLevel: effect-fc HOC */ import { Callout, Checkbox, Flex, TextField } from "@radix-ui/themes" -import { Array, Equivalence, Option, ParseResult, Schema, Struct } from "effect" -import { Component, Memo } from "effect-fc" -import { useInput, useOptionalInput } from "effect-fc/hooks" +import { Array, type Equivalence, Option, ParseResult, type Schema, Struct } from "effect" +import { Component } from "effect-fc" +import { useInput, useOptionalInput } from "effect-fc/Hooks" import * as React from "react" @@ -67,4 +68,4 @@ export const TextFieldInput = (options: { } ) -}).pipe(Memo.memo) +}) diff --git a/packages/example/src/routes/form.tsx b/packages/example/src/routes/form.tsx index 4653e1f..879f2f8 100644 --- a/packages/example/src/routes/form.tsx +++ b/packages/example/src/routes/form.tsx @@ -1,10 +1,10 @@ -import { TextFieldFormInput } from "@/lib/form/TextFieldFormInput" -import { runtime } from "@/runtime" import { Button, Container, Flex } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Effect, ParseResult, Schema } from "effect" import { Component, Form } from "effect-fc" -import { useContext, useSubscribables } from "effect-fc/hooks" +import { useContext, useSubscribables } from "effect-fc/Hooks" +import { TextFieldFormInput } from "@/lib/form/TextFieldFormInput" +import { runtime } from "@/runtime" const email = Schema.pattern( diff --git a/packages/example/src/routes/index.tsx b/packages/example/src/routes/index.tsx index 3bf279f..3e0835c 100644 --- a/packages/example/src/routes/index.tsx +++ b/packages/example/src/routes/index.tsx @@ -1,10 +1,10 @@ -import { runtime } from "@/runtime" -import { Todos } from "@/todo/Todos" -import { TodosState } from "@/todo/TodosState.service" import { createFileRoute } from "@tanstack/react-router" import { Effect } from "effect" import { Component } from "effect-fc" -import { useContext } from "effect-fc/hooks" +import { useContext } from "effect-fc/Hooks" +import { runtime } from "@/runtime" +import { Todos } from "@/todo/Todos" +import { TodosState } from "@/todo/TodosState.service" const TodosStateLive = TodosState.Default("todos") diff --git a/packages/example/src/todo/Todo.tsx b/packages/example/src/todo/Todo.tsx index 469be99..e84c504 100644 --- a/packages/example/src/todo/Todo.tsx +++ b/packages/example/src/todo/Todo.tsx @@ -1,15 +1,13 @@ +import { Box, Button, Flex, IconButton } from "@radix-ui/themes" +import { GetRandomValues, makeUuid4 } from "@typed/id" +import { Chunk, DateTime, Effect, Match, Option, Ref, Runtime, Schema, Stream, SubscriptionRef } from "effect" +import { Component, Hooks } from "effect-fc" +import { FaArrowDown, FaArrowUp } from "react-icons/fa" +import { FaDeleteLeft } from "react-icons/fa6" import * as Domain from "@/domain" import { TextAreaInput } from "@/lib/input/TextAreaInput" import { TextFieldInput } from "@/lib/input/TextFieldInput" import { DateTimeUtcFromZonedInput } from "@/lib/schema" -import { Box, Button, Flex, IconButton } from "@radix-ui/themes" -import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Chunk, DateTime, Effect, Match, Option, Ref, Runtime, Schema, Stream, SubscriptionRef } from "effect" -import { Component, Memo } from "effect-fc" -import { useMemo, useOnce, useSubscribables } from "effect-fc/hooks" -import { Subscribable, SubscriptionSubRef } from "effect-fc/types" -import { FaArrowDown, FaArrowUp } from "react-icons/fa" -import { FaDeleteLeft } from "react-icons/fa6" import { TodosState } from "./TodosState.service" @@ -35,7 +33,7 @@ export class Todo extends Component.makeUntraced("Todo")(function*(props: TodoPr const runtime = yield* Effect.runtime() const state = yield* TodosState - const { ref, indexRef, contentRef, completedAtRef } = yield* useMemo(() => Match.value(props).pipe( + const { ref, indexRef, contentRef, completedAtRef } = yield* Hooks.useMemo(() => Match.value(props).pipe( Match.tag("new", () => Effect.Do.pipe( Effect.bind("ref", () => Effect.andThen(makeTodo, SubscriptionRef.make)), Effect.let("indexRef", () => Subscribable.make({ get: Effect.succeed(-1), changes: Stream.empty })), @@ -48,10 +46,9 @@ export class Todo extends Component.makeUntraced("Todo")(function*(props: TodoPr Effect.let("contentRef", ({ ref }) => SubscriptionSubRef.makeFromPath(ref, ["content"])), Effect.let("completedAtRef", ({ ref }) => SubscriptionSubRef.makeFromPath(ref, ["completedAt"])), - // eslint-disable-next-line react-hooks/exhaustive-deps ), [props._tag, props._tag === "edit" ? props.id : undefined]) - const [index, size] = yield* useSubscribables(indexRef, state.sizeSubscribable) + const [index, size] = yield* Hooks.useSubscribables(indexRef, state.sizeSubscribable) const StringTextAreaInputFC = yield* StringTextAreaInput const OptionalDateTimeInputFC = yield* OptionalDateTimeInput diff --git a/packages/example/src/todo/TodosState.service.ts b/packages/example/src/todo/TodosState.service.ts index d024847..14595c0 100644 --- a/packages/example/src/todo/TodosState.service.ts +++ b/packages/example/src/todo/TodosState.service.ts @@ -1,8 +1,8 @@ -import { Todo } from "@/domain" import { KeyValueStore } from "@effect/platform" import { BrowserKeyValueStore } from "@effect/platform-browser" import { Chunk, Console, Effect, Option, Schema, Stream, SubscriptionRef } from "effect" -import { Subscribable, SubscriptionSubRef } from "effect-fc/types" +import { Subscribable, SubscriptionSubRef } from "effect-fc" +import { Todo } from "@/domain" export class TodosState extends Effect.Service()("TodosState", {