diff --git a/packages/effect-fc/src/Form.ts b/packages/effect-fc/src/Form.ts index f523e4a..3109bbd 100644 --- a/packages/effect-fc/src/Form.ts +++ b/packages/effect-fc/src/Form.ts @@ -150,20 +150,16 @@ export const run = ( export const submit = ( self: Form -): Effect.Effect>, NoSuchElementException, SR> => Effect.whenEffect( +): Effect.Effect>, NoSuchElementException, Scope.Scope | SR> => Effect.whenEffect( self.valueRef.pipe( Effect.andThen(identity), - Effect.tap(Ref.set(self.submitStateRef, AsyncData.loading())), - Effect.andThen(flow( - self.onSubmit as (value: NoInfer) => Effect.Effect, - Effect.tapErrorTag("ParseError", e => Ref.set(self.errorRef, Option.some(e as ParseResult.ParseError))), - Effect.exit, - Effect.map(Exit.match({ - onSuccess: a => AsyncData.success(a), - onFailure: e => AsyncData.failure(e as Cause.Cause), - })), - Effect.tap(v => Ref.set(self.submitStateRef, v)), - )), + Effect.andThen(flow(self.onSubmit, Result.forkEffectScoped)), + Effect.andThen(Stream.fromQueue), + Stream.unwrap, + Stream.runFoldEffect( + Result.initial() as Result.Result, + (_, result) => Effect.as(Ref.set(self.submitResultRef, result), result), + ), ), self.canSubmitSubscribable.get, @@ -237,9 +233,9 @@ export const isFormField = (u: unknown): u is FormField => Pre export const useSubmit = ( self: Form ): Effect.Effect< - () => Promise>>, + () => Promise>>, never, - SR + Scope.Scope | SR > => Component.useCallbackPromise(() => submit(self), [self]) export const useField = >>( diff --git a/packages/effect-fc/src/Result.ts b/packages/effect-fc/src/Result.ts index 04784c3..d1ac16f 100644 --- a/packages/effect-fc/src/Result.ts +++ b/packages/effect-fc/src/Result.ts @@ -140,7 +140,7 @@ export const toExit = ( } } -export const forkEffect = ( +export const forkEffectScoped = ( effect: Effect.Effect ): Effect.Effect>, never, Scope.Scope | R> => Queue.unbounded>().pipe( Effect.tap(Queue.offer(initial())),