From e2cd7bb671ee3c55f7d475e6ce3aeda850c9ad64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 23 Sep 2025 22:13:00 +0200 Subject: [PATCH] Fix --- packages/effect-fc/src/Form.ts | 3 ++- packages/example/src/routes/form.tsx | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/effect-fc/src/Form.ts b/packages/effect-fc/src/Form.ts index 1b982e7..aea44e6 100644 --- a/packages/effect-fc/src/Form.ts +++ b/packages/effect-fc/src/Form.ts @@ -11,6 +11,7 @@ export type TypeId = typeof TypeId export interface Form extends Pipeable.Pipeable { readonly schema: Schema.Schema, + /** A reference to the latest valid value produced by the form, if any. */ readonly valueRef: SubscriptionRef.SubscriptionRef>, readonly encodedValueRef: SubscriptionRef.SubscriptionRef, readonly errorRef: SubscriptionRef.SubscriptionRef>, @@ -73,7 +74,7 @@ export const make: { const run = (self: Form) => Stream.runForEach( self.encodedValueRef.changes, flow( - Schema.decode(self.schema), + Schema.decode(self.schema, { errors: "all" }), Effect.andThen(v => SubscriptionRef.set(self.valueRef, Option.some(v))), Effect.andThen(SubscriptionRef.set(self.errorRef, Option.none())), Effect.catchTag("ParseError", e => SubscriptionRef.set(self.errorRef, Option.some(e))) diff --git a/packages/example/src/routes/form.tsx b/packages/example/src/routes/form.tsx index c977569..f0d452e 100644 --- a/packages/example/src/routes/form.tsx +++ b/packages/example/src/routes/form.tsx @@ -6,8 +6,18 @@ import { Component, Form } from "effect-fc" import { useContext, useFork } from "effect-fc/hooks" +const email = Schema.pattern( + /^(?!\.)(?!.*\.\.)([A-Z0-9_+-.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9-]*\.)+[A-Z]{2,}$/i, + + { + identifier: "email", + title: "email", + message: () => "Not an email address", + }, +) + const RegisterFormSchema = Schema.Struct({ - email: Schema.String, + email: Schema.String.pipe(email), password: Schema.String.pipe(Schema.minLength(3)), }) @@ -24,6 +34,7 @@ class RegisterPage extends Component.makeUntraced(function* RegisterPage() { const passwordInput = yield* Form.useInput(form, ["password"], { debounce: "200 millis" }) yield* useFork(() => Stream.runForEach(form.valueRef.changes, Console.log), []) + // yield* useFork(() => Stream.runForEach(form.errorRef.changes, Console.log), []) return (