diff --git a/packages/effect-fc/src/Form.ts b/packages/effect-fc/src/Form.ts index b03c321..8a0c16b 100644 --- a/packages/effect-fc/src/Form.ts +++ b/packages/effect-fc/src/Form.ts @@ -24,7 +24,7 @@ extends Pipeable.Pipeable { readonly valueRef: SubscriptionRef.SubscriptionRef> readonly encodedValueRef: SubscriptionRef.SubscriptionRef readonly errorRef: SubscriptionRef.SubscriptionRef> - readonly validationFiberRef: SubscriptionRef.SubscriptionRef>> + readonly validationFiberRef: SubscriptionRef.SubscriptionRef>> readonly submitResultRef: SubscriptionRef.SubscriptionRef> readonly canSubmitSubscribable: Subscribable.Subscribable @@ -43,7 +43,7 @@ extends Pipeable.Class() implements Form { readonly valueRef: SubscriptionRef.SubscriptionRef>, readonly encodedValueRef: SubscriptionRef.SubscriptionRef, readonly errorRef: SubscriptionRef.SubscriptionRef>, - readonly validationFiberRef: SubscriptionRef.SubscriptionRef>>, + readonly validationFiberRef: SubscriptionRef.SubscriptionRef>>, readonly submitResultRef: SubscriptionRef.SubscriptionRef>, readonly canSubmitSubscribable: Subscribable.Subscribable, @@ -76,7 +76,7 @@ export const make: { ) { const valueRef = yield* SubscriptionRef.make(Option.none()) const errorRef = yield* SubscriptionRef.make(Option.none()) - const validationFiberRef = yield* SubscriptionRef.make(Option.none>()) + const validationFiberRef = yield* SubscriptionRef.make(Option.none>()) const submitResultRef = yield* SubscriptionRef.make>(Result.initial()) return new FormImpl( @@ -116,35 +116,31 @@ export const run = ( onNone: () => Effect.void, })), Effect.andThen( - Effect.addFinalizer(() => Ref.set(self.validationFiberRef, Option.none())).pipe( - Effect.andThen(Schema.decode(self.schema, { errors: "all" })(encodedValue)), - Effect.exit, - Effect.andThen(flow( - Exit.matchEffect({ - onSuccess: v => Ref.set(self.valueRef, Option.some(v)).pipe( - Effect.andThen(Ref.set(self.errorRef, Option.none())), - Effect.as(Option.some(v)), - ), - onFailure: c => Chunk.findFirst(Cause.failures(c), e => e._tag === "ParseError").pipe( - Option.match({ - onSome: e => Ref.set(self.errorRef, Option.some(e)), - onNone: () => Effect.void, - }), - Effect.as(Option.none()), + Effect.forkScoped(Effect.onExit( + Schema.decode(self.schema, { errors: "all" })(encodedValue), + exit => Effect.andThen( + Exit.matchEffect(exit, { + onSuccess: v => Effect.andThen( + Ref.set(self.valueRef, Option.some(v)), + Ref.set(self.errorRef, Option.none()), ), + onFailure: c => Option.match(Chunk.findFirst(Cause.failures(c), e => e._tag === "ParseError"), { + onSome: e => Ref.set(self.errorRef, Option.some(e)), + onNone: () => Effect.void, + }), }), - Effect.uninterruptible, - )), - Effect.scoped, - - Effect.andThen(value => Option.isSome(value) && self.autosubmit + Ref.set(self.validationFiberRef, Option.none()), + ), + )).pipe( + Effect.tap(fiber => Ref.set(self.validationFiberRef, Option.some(fiber))), + Effect.andThen(Fiber.join), + Effect.andThen(() => self.autosubmit ? Effect.asVoid(Effect.forkScoped(submit(self))) : Effect.void ), Effect.forkScoped, ) ), - Effect.andThen(fiber => Ref.set(self.validationFiberRef, Option.some(fiber))) ), )