From 21028fd75bb98c5eb9025c4d5dee8331d3b458cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 27 Feb 2026 13:21:56 +0100 Subject: [PATCH] Refactor --- ...rmInput.tsx => TextFieldFormInputView.tsx} | 2 +- packages/example/src/routes/form.tsx | 24 +++++++++---------- packages/example/src/routes/index.tsx | 12 +++++----- packages/example/src/routes/query.tsx | 6 ++--- .../src/todo/{Todo.tsx => TodoView.tsx} | 12 +++++----- .../{TodosState.service.ts => TodosState.ts} | 0 .../src/todo/{Todos.tsx => TodosView.tsx} | 12 +++++----- 7 files changed, 34 insertions(+), 34 deletions(-) rename packages/example/src/lib/form/{TextFieldFormInput.tsx => TextFieldFormInputView.tsx} (95%) rename packages/example/src/todo/{Todo.tsx => TodoView.tsx} (92%) rename packages/example/src/todo/{TodosState.service.ts => TodosState.ts} (100%) rename packages/example/src/todo/{Todos.tsx => TodosView.tsx} (71%) diff --git a/packages/example/src/lib/form/TextFieldFormInput.tsx b/packages/example/src/lib/form/TextFieldFormInputView.tsx similarity index 95% rename from packages/example/src/lib/form/TextFieldFormInput.tsx rename to packages/example/src/lib/form/TextFieldFormInputView.tsx index b3ba633..664402f 100644 --- a/packages/example/src/lib/form/TextFieldFormInput.tsx +++ b/packages/example/src/lib/form/TextFieldFormInputView.tsx @@ -18,7 +18,7 @@ extends Omit, Form.useOptional export type TextFieldFormInputProps = Props | OptionalProps -export class TextFieldFormInput extends Component.makeUntraced("TextFieldFormInput")(function*(props: TextFieldFormInputProps) { +export class TextFieldFormInputView extends Component.make("TextFieldFormInput")(function*(props: TextFieldFormInputProps) { const input: ( | { readonly optional: true } & Form.useOptionalInput.Success | { readonly optional: false } & Form.useInput.Success diff --git a/packages/example/src/routes/form.tsx b/packages/example/src/routes/form.tsx index f9d8916..d8ba6d9 100644 --- a/packages/example/src/routes/form.tsx +++ b/packages/example/src/routes/form.tsx @@ -2,7 +2,7 @@ import { Button, Container, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Console, Effect, Match, Option, ParseResult, Schema } from "effect" import { Component, Form, Subscribable } from "effect-fc" -import { TextFieldFormInput } from "@/lib/form/TextFieldFormInput" +import { TextFieldFormInputView } from "@/lib/form/TextFieldFormInputView" import { DateTimeUtcFromZonedInput } from "@/lib/schema" import { runtime } from "@/runtime" @@ -38,7 +38,7 @@ const RegisterFormSubmitSchema = Schema.Struct({ birth: Schema.OptionFromSelf(Schema.DateTimeUtcFromSelf), }) -class RegisterForm extends Effect.Service()("RegisterForm", { +class RegisterFormService extends Effect.Service()("RegisterFormService", { scoped: Form.service({ schema: RegisterFormSchema.pipe( Schema.compose( @@ -62,15 +62,15 @@ class RegisterForm extends Effect.Service()("RegisterForm", { }) }) {} -class RegisterFormView extends Component.makeUntraced("RegisterFormView")(function*() { - const form = yield* RegisterForm +class RegisterFormView extends Component.make("RegisterFormView")(function*() { + const form = yield* RegisterFormService const [canSubmit, submitResult] = yield* Subscribable.useSubscribables([ form.canSubmit, form.mutation.result, ]) const runPromise = yield* Component.useRunPromise() - const TextFieldFormInputFC = yield* TextFieldFormInput.use + const TextFieldFormInput = yield* TextFieldFormInputView.use yield* Component.useOnMount(() => Effect.gen(function*() { yield* Effect.addFinalizer(() => Console.log("RegisterFormView unmounted")) @@ -85,15 +85,15 @@ class RegisterFormView extends Component.makeUntraced("RegisterFormView")(functi void runPromise(form.submit) }}> - - - + return }).pipe( Component.withRuntime(runtime.context) ) diff --git a/packages/example/src/routes/index.tsx b/packages/example/src/routes/index.tsx index 053474a..d747b39 100644 --- a/packages/example/src/routes/index.tsx +++ b/packages/example/src/routes/index.tsx @@ -2,19 +2,19 @@ import { createFileRoute } from "@tanstack/react-router" import { Effect } from "effect" import { Component } from "effect-fc" import { runtime } from "@/runtime" -import { Todos } from "@/todo/Todos" -import { TodosState } from "@/todo/TodosState.service" +import { TodosState } from "@/todo/TodosState" +import { TodosView } from "@/todo/TodosView" const TodosStateLive = TodosState.Default("todos") -const Index = Component.makeUntraced("Index")(function*() { - const TodosFC = yield* Effect.provide( - Todos.use, +const Index = Component.make("IndexView")(function*() { + const Todos = yield* Effect.provide( + TodosView.use, yield* Component.useContextFromLayer(TodosStateLive), ) - return + return }).pipe( Component.withRuntime(runtime.context) ) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index 2092c0c..1db5ef5 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -13,15 +13,15 @@ const Post = Schema.Struct({ body: Schema.String, }) -const ResultView = Component.makeUntraced("Result")(function*() { +const ResultView = Component.make("ResultView")(function*() { const runPromise = yield* Component.useRunPromise() const [idRef, query, mutation] = yield* Component.useOnMount(() => Effect.gen(function*() { const idRef = yield* SubscriptionRef.make(1) const query = yield* Query.service({ - key: Stream.zipLatest(Stream.make("posts" as const), idRef.changes), - f: ([, id]) => HttpClient.HttpClient.pipe( + key: Stream.map(idRef.changes, id => [id] as const), + f: ([id]) => HttpClient.HttpClient.pipe( Effect.tap(Effect.sleep("500 millis")), Effect.andThen(client => client.get(`https://jsonplaceholder.typicode.com/posts/${ id }`)), Effect.andThen(response => response.json), diff --git a/packages/example/src/todo/Todo.tsx b/packages/example/src/todo/TodoView.tsx similarity index 92% rename from packages/example/src/todo/Todo.tsx rename to packages/example/src/todo/TodoView.tsx index a26a511..4086c5b 100644 --- a/packages/example/src/todo/Todo.tsx +++ b/packages/example/src/todo/TodoView.tsx @@ -5,9 +5,9 @@ import { Component, Form, Subscribable } from "effect-fc" import { FaArrowDown, FaArrowUp } from "react-icons/fa" import { FaDeleteLeft } from "react-icons/fa6" import * as Domain from "@/domain" -import { TextFieldFormInput } from "@/lib/form/TextFieldFormInput" +import { TextFieldFormInputView } from "@/lib/form/TextFieldFormInputView" import { DateTimeUtcFromZonedInput } from "@/lib/schema" -import { TodosState } from "./TodosState.service" +import { TodosState } from "./TodosState" const TodoFormSchema = Schema.compose(Schema.Struct({ @@ -30,7 +30,7 @@ export type TodoProps = ( | { readonly _tag: "edit", readonly id: string } ) -export class Todo extends Component.makeUntraced("Todo")(function*(props: TodoProps) { +export class TodoView extends Component.make("TodoView")(function*(props: TodoProps) { const state = yield* TodosState const [ @@ -83,17 +83,17 @@ export class Todo extends Component.makeUntraced("Todo")(function*(props: TodoPr const runSync = yield* Component.useRunSync() const runPromise = yield* Component.useRunPromise() - const TextFieldFormInputFC = yield* TextFieldFormInput.use + const TextFieldFormInput = yield* TextFieldFormInputView.use return ( - + - Console.log("Todos unmounted")), )) - const TodoFC = yield* Todo.use + const Todo = yield* TodoView.use return ( Todos - + {Chunk.map(todos, todo => - + )}