import { Button, Container, Flex, Text, TextField } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Effect, Schema } from "effect" import { Component, Form, MutationForm, View } from "effect-fc-next" import { runtime } from "@/runtime" const RegisterSchema = Schema.Struct({ email: Schema.String, password: Schema.String, }) const RegisterRouteComponent = Component.make("RegisterRouteView")(function*() { const form = yield* Component.useOnMount(() => MutationForm.service({ schema: RegisterSchema, initialEncodedValue: { email: "", password: "" }, f: ([value]) => Effect.log(`Registered ${value.email}`), })) const emailField = yield* Form.useInput( Form.focusObjectOn(form, "email"), ) const passwordField = yield* Form.useInput( Form.focusObjectOn(form, "password"), ) const [canCommit, isCommitting] = yield* View.useAll([ form.canCommit, form.isCommitting, ]) const runPromise = yield* Component.useRunPromise() return (
{ event.preventDefault() void runPromise(form.submit) }}> emailField.setValue(event.currentTarget.value)} placeholder="Email" /> passwordField.setValue(event.currentTarget.value)} placeholder="Password" type="password" />
A MutationForm validates local input, then submits it.
) }).pipe( Component.withRuntime(runtime.context), ) export const Route = createFileRoute("/form")({ component: RegisterRouteComponent, })