From c6655ba1687d0169b3db3fc6e90042d8db93a91a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 28 Mar 2026 21:36:43 +0100 Subject: [PATCH] Refactor Form --- bun.lock | 8 ++++---- package.json | 2 +- packages/effect-fc/package.json | 2 +- packages/effect-fc/src/Form.ts | 32 ++++++++++++++++---------------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/bun.lock b/bun.lock index 30703b6..eef3d3c 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@effect-fc/monorepo", "devDependencies": { "@biomejs/biome": "^2.4.9", - "@effect/language-service": "^0.84.1", + "@effect/language-service": "^0.84.2", "@types/bun": "^1.3.11", "npm-check-updates": "^19.6.6", "npm-sort": "^0.0.4", @@ -37,7 +37,7 @@ "name": "effect-fc", "version": "0.2.4", "dependencies": { - "effect-lens": "^0.1.2", + "effect-lens": "^0.1.3", }, "devDependencies": { "@effect/platform-browser": "^0.76.0", @@ -502,7 +502,7 @@ "@effect-fc/example": ["@effect-fc/example@workspace:packages/example"], - "@effect/language-service": ["@effect/language-service@0.84.1", "", { "bin": { "effect-language-service": "cli.js" } }, "sha512-YUqjJU24HeYgPV453cR2fDqkZ+zZKMuxGnmxWAPscWJ6gt6FB7JZohMCOczRTIOGPrQMcloJX7BjCaPu+RNhpw=="], + "@effect/language-service": ["@effect/language-service@0.84.2", "", { "bin": { "effect-language-service": "cli.js" } }, "sha512-l04qNxpiA8rY5yXWckRPJ7Mk5MNerXuNymSFf+IdflfI5i8jgL1bpBNLuP6ijg7wgjdHc/KmTnCj2kT0SCntuA=="], "@effect/platform": ["@effect/platform@0.96.0", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.4", "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^3.21.0" } }, "sha512-U7PLhkVzg7zzrgFvyWATOzD6reL87KG/fcdOxgLWBQ/J5CCU6qdPAVG+0o6o+IxcsLoqGwxs+rFxaFzrdtDV1A=="], @@ -1380,7 +1380,7 @@ "effect-fc": ["effect-fc@workspace:packages/effect-fc"], - "effect-lens": ["effect-lens@0.1.2", "", { "peerDependencies": { "effect": "^3.21.0" } }, "sha512-1HdT+xv+Nmy7sQlsK6tBjqKtTZbzb/OPco66/45QnRtdXUGDjFrGMn2jpm/yC5Wxyhb7sNea791aVVq3YgAuwQ=="], + "effect-lens": ["effect-lens@0.1.3", "", { "peerDependencies": { "effect": "^3.21.0" } }, "sha512-LtGugMzJehYlQfD9GAbvAOFolVj6UOokqA2EI3M43GC2+wqTDloQjyiW3hrpH3UlayDor7Yg1ZG05Do5a0knsA=="], "electron-to-chromium": ["electron-to-chromium@1.5.313", "", {}, "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA=="], diff --git a/package.json b/package.json index 5719a68..64a4c51 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@biomejs/biome": "^2.4.9", - "@effect/language-service": "^0.84.1", + "@effect/language-service": "^0.84.2", "@types/bun": "^1.3.11", "npm-check-updates": "^19.6.6", "npm-sort": "^0.0.4", diff --git a/packages/effect-fc/package.json b/packages/effect-fc/package.json index 9b72aa1..fee8cb4 100644 --- a/packages/effect-fc/package.json +++ b/packages/effect-fc/package.json @@ -46,6 +46,6 @@ "react": "^19.2.0" }, "dependencies": { - "effect-lens": "^0.1.2" + "effect-lens": "^0.1.3" } } diff --git a/packages/effect-fc/src/Form.ts b/packages/effect-fc/src/Form.ts index 6133196..fee273c 100644 --- a/packages/effect-fc/src/Form.ts +++ b/packages/effect-fc/src/Form.ts @@ -19,7 +19,7 @@ extends Pipeable.Pipeable { readonly value: Subscribable.Subscribable, ER, never> readonly encodedValue: Lens.Lens readonly error: Subscribable.Subscribable, ER, never> - readonly validationFiber: Subscribable.Subscribable>, ER, never> + readonly isValidating: Subscribable.Subscribable readonly canSubmit: Subscribable.Subscribable } @@ -33,10 +33,10 @@ extends Pipeable.Class() implements Form { constructor( readonly path: P, - readonly value: Lens.Lens, ER, EW, never, never>, + readonly value: Subscribable.Subscribable, ER, never>, readonly encodedValue: Lens.Lens, - readonly error: Lens.Lens, ER, EW, never, never>, - readonly validationFiber: Lens.Lens>, ER, EW, never, never>, + readonly error: Subscribable.Subscribable, ER, never>, + readonly isValidating: Subscribable.Subscribable, readonly canSubmit: Subscribable.Subscribable, ) { super() @@ -57,6 +57,8 @@ extends Form { > readonly autosubmit: boolean + readonly validationFiber: Subscribable.Subscribable>, never, never> + readonly run: Effect.Effect readonly submit: Effect.Effect>, Cause.NoSuchElementException> } @@ -74,11 +76,12 @@ extends FormImpl implements RootForm >, readonly autosubmit: boolean, - value: Lens.Lens, never, never, never, never>, - encodedValue: Lens.Lens, - error: Lens.Lens, never, never, never, never>, - validationFiber: Lens.Lens>, never, never, never, never>, - canSubmit: Subscribable.Subscribable, + readonly value: Lens.Lens, never, never, never, never>, + readonly encodedValue: Lens.Lens, + readonly error: Lens.Lens, never, never, never, never>, + readonly validationFiber: Lens.Lens>, never, never, never, never>, + readonly isValidating: Subscribable.Subscribable, + readonly canSubmit: Subscribable.Subscribable, readonly runSemaphore: Effect.Semaphore, ) { @@ -87,7 +90,7 @@ extends FormImpl implements RootForm value, encodedValue, error, - validationFiber, + isValidating, canSubmit, ) } @@ -202,6 +205,7 @@ export const make = Effect.fnUntraced(function* ( @@ -241,14 +245,10 @@ export const focusObjectField =

Option.map(a, v => v[key]), - (a, b) => Option.map(), - ), + Subscribable.map(form.value, Option.map(a => a[key])), Lens.focusObjectField(form.encodedValue, key), form.error, - form.validationFiber, + form.isValidating, form.canSubmit, ) }