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())),