@lucas-barake/effect-form 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,13 +8,11 @@
8
8
  */
9
9
  import * as Atom from "@effect-atom/atom/Atom";
10
10
  import * as Effect from "effect/Effect";
11
- import * as Equal from "effect/Equal";
12
11
  import { pipe } from "effect/Function";
13
12
  import * as Option from "effect/Option";
14
13
  import * as Schema from "effect/Schema";
15
- import * as Utils from "effect/Utils";
16
14
  import * as Field from "./Field.js";
17
- import * as Form from "./Form.js";
15
+ import * as FormBuilder from "./FormBuilder.js";
18
16
  import { recalculateDirtyFieldsForArray, recalculateDirtySubtree } from "./internal/dirty.js";
19
17
  import { getNestedValue, setNestedValue } from "./internal/path.js";
20
18
  import { createWeakRegistry } from "./internal/weak-registry.js";
@@ -30,9 +28,9 @@ import { createWeakRegistry } from "./internal/weak-registry.js";
30
28
  *
31
29
  * const runtime = Atom.runtime(Layer.empty)
32
30
  *
33
- * const loginForm = Form.empty
34
- * .addField(Form.makeField("email", Schema.String))
35
- * .addField(Form.makeField("password", Schema.String))
31
+ * const loginForm = FormBuilder.empty
32
+ * .addField(FormBuilder.makeField("email", Schema.String))
33
+ * .addField(FormBuilder.makeField("password", Schema.String))
36
34
  *
37
35
  * const atoms = FormAtoms.make({
38
36
  * runtime,
@@ -52,24 +50,27 @@ export const make = config => {
52
50
  const {
53
51
  fields
54
52
  } = formBuilder;
55
- const combinedSchema = Form.buildSchema(formBuilder);
53
+ const combinedSchema = FormBuilder.buildSchema(formBuilder);
56
54
  const stateAtom = Atom.make(Option.none()).pipe(Atom.setIdleTTL(0));
57
55
  const crossFieldErrorsAtom = Atom.make(new Map()).pipe(Atom.setIdleTTL(0));
58
56
  const dirtyFieldsAtom = Atom.readable(get => Option.getOrThrow(get(stateAtom)).dirtyFields).pipe(Atom.setIdleTTL(0));
59
57
  const isDirtyAtom = Atom.readable(get => Option.getOrThrow(get(stateAtom)).dirtyFields.size > 0).pipe(Atom.setIdleTTL(0));
60
58
  const submitCountAtom = Atom.readable(get => Option.getOrThrow(get(stateAtom)).submitCount).pipe(Atom.setIdleTTL(0));
59
+ const lastSubmittedValuesAtom = Atom.readable(get => Option.getOrThrow(get(stateAtom)).lastSubmittedValues).pipe(Atom.setIdleTTL(0));
60
+ const changedSinceSubmitFieldsAtom = Atom.readable(get => {
61
+ const state = Option.getOrThrow(get(stateAtom));
62
+ return Option.match(state.lastSubmittedValues, {
63
+ onNone: () => new Set(),
64
+ onSome: lastSubmitted => recalculateDirtySubtree(new Set(), lastSubmitted, state.values, "")
65
+ });
66
+ }).pipe(Atom.setIdleTTL(0));
67
+ const hasChangedSinceSubmitAtom = Atom.readable(get => {
68
+ const state = Option.getOrThrow(get(stateAtom));
69
+ if (Option.isNone(state.lastSubmittedValues)) return false;
70
+ if (state.values === state.lastSubmittedValues.value) return false;
71
+ return get(changedSinceSubmitFieldsAtom).size > 0;
72
+ }).pipe(Atom.setIdleTTL(0));
61
73
  const onSubmitAtom = Atom.make(null).pipe(Atom.setIdleTTL(0));
62
- const updateDirtyFields = (state, fieldPath, newValue) => {
63
- const initialValue = getNestedValue(state.initialValues, fieldPath);
64
- const isEqual = Utils.structuralRegion(() => Equal.equals(newValue, initialValue));
65
- const newDirtyFields = new Set(state.dirtyFields);
66
- if (!isEqual) {
67
- newDirtyFields.add(fieldPath);
68
- } else {
69
- newDirtyFields.delete(fieldPath);
70
- }
71
- return newDirtyFields;
72
- };
73
74
  const validationAtomsRegistry = createWeakRegistry();
74
75
  const fieldAtomsRegistry = createWeakRegistry();
75
76
  const getOrCreateValidationAtom = (fieldPath, schema) => {
@@ -84,10 +85,11 @@ export const make = config => {
84
85
  if (existing) return existing;
85
86
  const valueAtom = Atom.writable(get => getNestedValue(Option.getOrThrow(get(stateAtom)).values, fieldPath), (ctx, value) => {
86
87
  const currentState = Option.getOrThrow(ctx.get(stateAtom));
88
+ const newValues = setNestedValue(currentState.values, fieldPath, value);
87
89
  ctx.set(stateAtom, Option.some({
88
90
  ...currentState,
89
- values: setNestedValue(currentState.values, fieldPath, value),
90
- dirtyFields: updateDirtyFields(currentState, fieldPath, value)
91
+ values: newValues,
92
+ dirtyFields: recalculateDirtySubtree(currentState.dirtyFields, currentState.initialValues, newValues, fieldPath)
91
93
  }));
92
94
  }).pipe(Atom.setIdleTTL(0));
93
95
  const initialValueAtom = Atom.readable(get => getNestedValue(Option.getOrThrow(get(stateAtom)).initialValues, fieldPath)).pipe(Atom.setIdleTTL(0));
@@ -127,11 +129,12 @@ export const make = config => {
127
129
  suspendOnWaiting: true
128
130
  });
129
131
  })).pipe(Atom.setIdleTTL(0));
130
- const fieldRefs = Object.fromEntries(Object.keys(fields).map(key => [key, Form.makeFieldRef(key)]));
132
+ const fieldRefs = Object.fromEntries(Object.keys(fields).map(key => [key, FormBuilder.makeFieldRef(key)]));
131
133
  const operations = {
132
134
  createInitialState: defaultValues => ({
133
135
  values: defaultValues,
134
136
  initialValues: defaultValues,
137
+ lastSubmittedValues: Option.none(),
135
138
  touched: Field.createTouchedRecord(fields, false),
136
139
  submitCount: 0,
137
140
  dirtyFields: new Set()
@@ -139,12 +142,14 @@ export const make = config => {
139
142
  createResetState: state => ({
140
143
  values: state.initialValues,
141
144
  initialValues: state.initialValues,
145
+ lastSubmittedValues: Option.none(),
142
146
  touched: Field.createTouchedRecord(fields, false),
143
147
  submitCount: 0,
144
148
  dirtyFields: new Set()
145
149
  }),
146
150
  createSubmitState: state => ({
147
151
  ...state,
152
+ lastSubmittedValues: Option.some(state.values),
148
153
  touched: Field.createTouchedRecord(fields, true),
149
154
  submitCount: state.submitCount + 1
150
155
  }),
@@ -216,6 +221,20 @@ export const make = config => {
216
221
  values: setNestedValue(state.values, arrayPath, newItems),
217
222
  dirtyFields: recalculateDirtyFieldsForArray(state.dirtyFields, state.initialValues, arrayPath, newItems)
218
223
  };
224
+ },
225
+ revertToLastSubmit: state => {
226
+ if (Option.isNone(state.lastSubmittedValues)) {
227
+ return state;
228
+ }
229
+ if (state.values === state.lastSubmittedValues.value) {
230
+ return state;
231
+ }
232
+ const newDirtyFields = recalculateDirtySubtree(state.dirtyFields, state.initialValues, state.lastSubmittedValues.value, "");
233
+ return {
234
+ ...state,
235
+ values: state.lastSubmittedValues.value,
236
+ dirtyFields: newDirtyFields
237
+ };
219
238
  }
220
239
  };
221
240
  return {
@@ -224,6 +243,9 @@ export const make = config => {
224
243
  dirtyFieldsAtom,
225
244
  isDirtyAtom,
226
245
  submitCountAtom,
246
+ lastSubmittedValuesAtom,
247
+ changedSinceSubmitFieldsAtom,
248
+ hasChangedSinceSubmitAtom,
227
249
  onSubmitAtom,
228
250
  decodeAndSubmit,
229
251
  combinedSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"FormAtoms.js","names":["Atom","Effect","Equal","pipe","Option","Schema","Utils","Field","Form","recalculateDirtyFieldsForArray","recalculateDirtySubtree","getNestedValue","setNestedValue","createWeakRegistry","make","config","formBuilder","runtime","fields","combinedSchema","buildSchema","stateAtom","none","setIdleTTL","crossFieldErrorsAtom","Map","dirtyFieldsAtom","readable","get","getOrThrow","dirtyFields","isDirtyAtom","size","submitCountAtom","submitCount","onSubmitAtom","updateDirtyFields","state","fieldPath","newValue","initialValue","initialValues","isEqual","structuralRegion","equals","newDirtyFields","Set","add","delete","validationAtomsRegistry","fieldAtomsRegistry","getOrCreateValidationAtom","schema","existing","validationAtom","fn","value","decodeUnknown","asVoid","set","getOrCreateFieldAtoms","valueAtom","writable","values","ctx","currentState","some","initialValueAtom","touchedAtom","touched","crossFieldErrorAtom","errors","error","undefined","atoms","resetValidationAtoms","registry","Reset","clear","decodeAndSubmit","gen","decoded","onSubmit","result","suspendOnWaiting","fieldRefs","Object","fromEntries","keys","map","key","makeFieldRef","operations","createInitialState","defaultValues","createTouchedRecord","createResetState","createSubmitState","setFieldValue","newValues","setFormValues","setFieldTouched","appendArrayItem","arrayPath","itemSchema","newItem","getDefaultFromSchema","currentItems","newItems","removeArrayItem","index","filter","_","i","swapArrayItems","indexA","indexB","length","temp","moveArrayItem","fromIndex","toIndex","item","splice"],"sources":["../../src/FormAtoms.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FormAtoms.js","names":["Atom","Effect","pipe","Option","Schema","Field","FormBuilder","recalculateDirtyFieldsForArray","recalculateDirtySubtree","getNestedValue","setNestedValue","createWeakRegistry","make","config","formBuilder","runtime","fields","combinedSchema","buildSchema","stateAtom","none","setIdleTTL","crossFieldErrorsAtom","Map","dirtyFieldsAtom","readable","get","getOrThrow","dirtyFields","isDirtyAtom","size","submitCountAtom","submitCount","lastSubmittedValuesAtom","lastSubmittedValues","changedSinceSubmitFieldsAtom","state","match","onNone","Set","onSome","lastSubmitted","values","hasChangedSinceSubmitAtom","isNone","value","onSubmitAtom","validationAtomsRegistry","fieldAtomsRegistry","getOrCreateValidationAtom","fieldPath","schema","existing","validationAtom","fn","decodeUnknown","asVoid","set","getOrCreateFieldAtoms","valueAtom","writable","ctx","currentState","newValues","some","initialValues","initialValueAtom","touchedAtom","touched","crossFieldErrorAtom","errors","error","undefined","atoms","resetValidationAtoms","registry","Reset","clear","decodeAndSubmit","gen","decoded","onSubmit","result","suspendOnWaiting","fieldRefs","Object","fromEntries","keys","map","key","makeFieldRef","operations","createInitialState","defaultValues","createTouchedRecord","createResetState","createSubmitState","setFieldValue","newDirtyFields","setFormValues","setFieldTouched","appendArrayItem","arrayPath","itemSchema","newItem","getDefaultFromSchema","currentItems","newItems","removeArrayItem","index","filter","_","i","swapArrayItems","indexA","indexB","length","temp","moveArrayItem","fromIndex","toIndex","item","splice","revertToLastSubmit"],"sources":["../../src/FormAtoms.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -75,14 +75,14 @@ const FormBuilderProto = {
75
75
  *
76
76
  * @example
77
77
  * ```ts
78
- * import * as Form from "@lucas-barake/effect-form"
78
+ * import { FormBuilder } from "@lucas-barake/effect-form"
79
79
  *
80
- * const builder = Form.empty
80
+ * const builder = FormBuilder.empty
81
81
  *
82
- * console.log(Form.isFormBuilder(builder))
82
+ * console.log(FormBuilder.isFormBuilder(builder))
83
83
  * // Output: true
84
84
  *
85
- * console.log(Form.isFormBuilder({}))
85
+ * console.log(FormBuilder.isFormBuilder({}))
86
86
  * // Output: false
87
87
  * ```
88
88
  *
@@ -100,13 +100,13 @@ export const isFormBuilder = u => Predicate.hasProperty(u, TypeId);
100
100
  *
101
101
  * @example
102
102
  * ```ts
103
- * import * as Form from "@lucas-barake/effect-form"
103
+ * import { Field, FormBuilder } from "@lucas-barake/effect-form"
104
104
  * import * as Schema from "effect/Schema"
105
105
  *
106
- * const EmailField = Form.makeField("email", Schema.String)
107
- * const PasswordField = Form.makeField("password", Schema.String)
106
+ * const EmailField = Field.makeField("email", Schema.String)
107
+ * const PasswordField = Field.makeField("password", Schema.String)
108
108
  *
109
- * const loginForm = Form.empty
109
+ * const loginForm = FormBuilder.empty
110
110
  * .addField(EmailField)
111
111
  * .addField(PasswordField)
112
112
  * ```
@@ -146,4 +146,4 @@ export const buildSchema = self => {
146
146
  }
147
147
  return schema;
148
148
  };
149
- //# sourceMappingURL=Form.js.map
149
+ //# sourceMappingURL=FormBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormBuilder.js","names":["Predicate","Schema","isArrayFieldDef","isFieldDef","FieldTypeId","Symbol","for","makeFieldRef","key","_S","undefined","TypeId","FormBuilderProto","addField","field","newSelf","Object","create","fields","refinements","merge","other","refine","predicate","_tag","fn","values","refineEffect","isFormBuilder","u","hasProperty","empty","self","buildSchema","schemaFields","def","entries","Array","itemSchema","schema","Struct","refinement","pipe","filter","filterEffect"],"sources":["../../src/FormBuilder.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/dist/esm/index.js CHANGED
@@ -4,10 +4,6 @@
4
4
  * @since 1.0.0
5
5
  */
6
6
  export * as Field from "./Field.js";
7
- /**
8
- * @since 1.0.0
9
- */
10
- export * as Form from "./Form.js";
11
7
  /**
12
8
  * Atom infrastructure for form state management.
13
9
  *
@@ -17,6 +13,10 @@ export * as Form from "./Form.js";
17
13
  * @since 1.0.0
18
14
  */
19
15
  export * as FormAtoms from "./FormAtoms.js";
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ export * as FormBuilder from "./FormBuilder.js";
20
20
  /**
21
21
  * Form validation mode configuration.
22
22
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Field","Form","FormAtoms","Mode","Validation"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;AAKA,OAAO,KAAKA,KAAK,MAAM,YAAY;AAEnC;;;AAGA,OAAO,KAAKC,IAAI,MAAM,WAAW;AAEjC;;;;;;;;AAQA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;;;AAKA,OAAO,KAAKC,IAAI,MAAM,WAAW;AAEjC;;;;;AAKA,OAAO,KAAKC,UAAU,MAAM,iBAAiB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Field","FormAtoms","FormBuilder","Mode","Validation"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;AAKA,OAAO,KAAKA,KAAK,MAAM,YAAY;AAEnC;;;;;;;;AAQA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAE/C;;;;;AAKA,OAAO,KAAKC,IAAI,MAAM,WAAW;AAEjC;;;;;AAKA,OAAO,KAAKC,UAAU,MAAM,iBAAiB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucas-barake/effect-form",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Type-safe form builder powered by Effect Schema",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,16 +29,16 @@
29
29
  "import": "./dist/esm/Field.js",
30
30
  "default": "./dist/cjs/Field.js"
31
31
  },
32
- "./Form": {
33
- "types": "./dist/dts/Form.d.ts",
34
- "import": "./dist/esm/Form.js",
35
- "default": "./dist/cjs/Form.js"
36
- },
37
32
  "./FormAtoms": {
38
33
  "types": "./dist/dts/FormAtoms.d.ts",
39
34
  "import": "./dist/esm/FormAtoms.js",
40
35
  "default": "./dist/cjs/FormAtoms.js"
41
36
  },
37
+ "./FormBuilder": {
38
+ "types": "./dist/dts/FormBuilder.d.ts",
39
+ "import": "./dist/esm/FormBuilder.js",
40
+ "default": "./dist/cjs/FormBuilder.js"
41
+ },
42
42
  "./Mode": {
43
43
  "types": "./dist/dts/Mode.d.ts",
44
44
  "import": "./dist/esm/Mode.js",
@@ -55,12 +55,12 @@
55
55
  "Field": [
56
56
  "./dist/dts/Field.d.ts"
57
57
  ],
58
- "Form": [
59
- "./dist/dts/Form.d.ts"
60
- ],
61
58
  "FormAtoms": [
62
59
  "./dist/dts/FormAtoms.d.ts"
63
60
  ],
61
+ "FormBuilder": [
62
+ "./dist/dts/FormBuilder.d.ts"
63
+ ],
64
64
  "Mode": [
65
65
  "./dist/dts/Mode.d.ts"
66
66
  ],
package/src/FormAtoms.ts CHANGED
@@ -9,14 +9,12 @@
9
9
  import * as Atom from "@effect-atom/atom/Atom"
10
10
  import type * as Registry from "@effect-atom/atom/Registry"
11
11
  import * as Effect from "effect/Effect"
12
- import * as Equal from "effect/Equal"
13
12
  import { pipe } from "effect/Function"
14
13
  import * as Option from "effect/Option"
15
14
  import type * as ParseResult from "effect/ParseResult"
16
15
  import * as Schema from "effect/Schema"
17
- import * as Utils from "effect/Utils"
18
16
  import * as Field from "./Field.js"
19
- import * as Form from "./Form.js"
17
+ import * as FormBuilder from "./FormBuilder.js"
20
18
  import { recalculateDirtyFieldsForArray, recalculateDirtySubtree } from "./internal/dirty.js"
21
19
  import { getNestedValue, setNestedValue } from "./internal/path.js"
22
20
  import { createWeakRegistry, type WeakRegistry } from "./internal/weak-registry.js"
@@ -42,7 +40,7 @@ export interface FieldAtoms {
42
40
  */
43
41
  export interface FormAtomsConfig<TFields extends Field.FieldsRecord, R> {
44
42
  readonly runtime: Atom.AtomRuntime<R, any>
45
- readonly formBuilder: Form.FormBuilder<TFields, R>
43
+ readonly formBuilder: FormBuilder.FormBuilder<TFields, R>
46
44
  }
47
45
 
48
46
  /**
@@ -52,8 +50,10 @@ export interface FormAtomsConfig<TFields extends Field.FieldsRecord, R> {
52
50
  * @category Models
53
51
  */
54
52
  export type FieldRefs<TFields extends Field.FieldsRecord> = {
55
- readonly [K in keyof TFields]: TFields[K] extends Field.FieldDef<any, infer S> ? Form.Field<Schema.Schema.Encoded<S>>
56
- : TFields[K] extends Field.ArrayFieldDef<any, infer S> ? Form.Field<ReadonlyArray<Schema.Schema.Encoded<S>>>
53
+ readonly [K in keyof TFields]: TFields[K] extends Field.FieldDef<any, infer S> ?
54
+ FormBuilder.FieldRef<Schema.Schema.Encoded<S>>
55
+ : TFields[K] extends Field.ArrayFieldDef<any, infer S> ?
56
+ FormBuilder.FieldRef<ReadonlyArray<Schema.Schema.Encoded<S>>>
57
57
  : never
58
58
  }
59
59
 
@@ -64,11 +64,17 @@ export type FieldRefs<TFields extends Field.FieldsRecord> = {
64
64
  * @category Models
65
65
  */
66
66
  export interface FormAtoms<TFields extends Field.FieldsRecord, R> {
67
- readonly stateAtom: Atom.Writable<Option.Option<Form.FormState<TFields>>, Option.Option<Form.FormState<TFields>>>
67
+ readonly stateAtom: Atom.Writable<
68
+ Option.Option<FormBuilder.FormState<TFields>>,
69
+ Option.Option<FormBuilder.FormState<TFields>>
70
+ >
68
71
  readonly crossFieldErrorsAtom: Atom.Writable<Map<string, string>, Map<string, string>>
69
72
  readonly dirtyFieldsAtom: Atom.Atom<ReadonlySet<string>>
70
73
  readonly isDirtyAtom: Atom.Atom<boolean>
71
74
  readonly submitCountAtom: Atom.Atom<number>
75
+ readonly lastSubmittedValuesAtom: Atom.Atom<Option.Option<Field.EncodedFromFields<TFields>>>
76
+ readonly changedSinceSubmitFieldsAtom: Atom.Atom<ReadonlySet<string>>
77
+ readonly hasChangedSinceSubmitAtom: Atom.Atom<boolean>
72
78
  readonly onSubmitAtom: Atom.Writable<
73
79
  Atom.AtomResultFn<Field.DecodedFromFields<TFields>, unknown, unknown> | null,
74
80
  Atom.AtomResultFn<Field.DecodedFromFields<TFields>, unknown, unknown> | null
@@ -102,85 +108,61 @@ export interface FormAtoms<TFields extends Field.FieldsRecord, R> {
102
108
  * @category Models
103
109
  */
104
110
  export interface FormOperations<TFields extends Field.FieldsRecord> {
105
- /**
106
- * Creates the initial form state from default values.
107
- */
108
- readonly createInitialState: (defaultValues: Field.EncodedFromFields<TFields>) => Form.FormState<TFields>
111
+ readonly createInitialState: (defaultValues: Field.EncodedFromFields<TFields>) => FormBuilder.FormState<TFields>
109
112
 
110
- /**
111
- * Creates a reset state (back to initial values).
112
- */
113
- readonly createResetState: (state: Form.FormState<TFields>) => Form.FormState<TFields>
113
+ readonly createResetState: (state: FormBuilder.FormState<TFields>) => FormBuilder.FormState<TFields>
114
114
 
115
- /**
116
- * Creates state with all fields marked as touched and submit count incremented.
117
- */
118
- readonly createSubmitState: (state: Form.FormState<TFields>) => Form.FormState<TFields>
115
+ readonly createSubmitState: (state: FormBuilder.FormState<TFields>) => FormBuilder.FormState<TFields>
119
116
 
120
- /**
121
- * Updates a single field value in the state.
122
- */
123
117
  readonly setFieldValue: (
124
- state: Form.FormState<TFields>,
118
+ state: FormBuilder.FormState<TFields>,
125
119
  fieldPath: string,
126
120
  value: unknown,
127
- ) => Form.FormState<TFields>
121
+ ) => FormBuilder.FormState<TFields>
128
122
 
129
- /**
130
- * Sets all form values, recalculating dirty fields.
131
- */
132
123
  readonly setFormValues: (
133
- state: Form.FormState<TFields>,
124
+ state: FormBuilder.FormState<TFields>,
134
125
  values: Field.EncodedFromFields<TFields>,
135
- ) => Form.FormState<TFields>
126
+ ) => FormBuilder.FormState<TFields>
136
127
 
137
- /**
138
- * Sets a field as touched.
139
- */
140
128
  readonly setFieldTouched: (
141
- state: Form.FormState<TFields>,
129
+ state: FormBuilder.FormState<TFields>,
142
130
  fieldPath: string,
143
131
  touched: boolean,
144
- ) => Form.FormState<TFields>
132
+ ) => FormBuilder.FormState<TFields>
145
133
 
146
- /**
147
- * Appends an item to an array field.
148
- */
149
134
  readonly appendArrayItem: (
150
- state: Form.FormState<TFields>,
135
+ state: FormBuilder.FormState<TFields>,
151
136
  arrayPath: string,
152
137
  itemSchema: Schema.Schema.Any,
153
138
  value?: unknown,
154
- ) => Form.FormState<TFields>
139
+ ) => FormBuilder.FormState<TFields>
155
140
 
156
- /**
157
- * Removes an item from an array field.
158
- */
159
141
  readonly removeArrayItem: (
160
- state: Form.FormState<TFields>,
142
+ state: FormBuilder.FormState<TFields>,
161
143
  arrayPath: string,
162
144
  index: number,
163
- ) => Form.FormState<TFields>
145
+ ) => FormBuilder.FormState<TFields>
164
146
 
165
- /**
166
- * Swaps two items in an array field.
167
- */
168
147
  readonly swapArrayItems: (
169
- state: Form.FormState<TFields>,
148
+ state: FormBuilder.FormState<TFields>,
170
149
  arrayPath: string,
171
150
  indexA: number,
172
151
  indexB: number,
173
- ) => Form.FormState<TFields>
152
+ ) => FormBuilder.FormState<TFields>
174
153
 
175
- /**
176
- * Moves an item in an array field.
177
- */
178
154
  readonly moveArrayItem: (
179
- state: Form.FormState<TFields>,
155
+ state: FormBuilder.FormState<TFields>,
180
156
  arrayPath: string,
181
157
  fromIndex: number,
182
158
  toIndex: number,
183
- ) => Form.FormState<TFields>
159
+ ) => FormBuilder.FormState<TFields>
160
+
161
+ /**
162
+ * Reverts values to the last submitted state.
163
+ * No-op if form has never been submitted or is already in sync.
164
+ */
165
+ readonly revertToLastSubmit: (state: FormBuilder.FormState<TFields>) => FormBuilder.FormState<TFields>
184
166
  }
185
167
 
186
168
  /**
@@ -195,9 +177,9 @@ export interface FormOperations<TFields extends Field.FieldsRecord> {
195
177
  *
196
178
  * const runtime = Atom.runtime(Layer.empty)
197
179
  *
198
- * const loginForm = Form.empty
199
- * .addField(Form.makeField("email", Schema.String))
200
- * .addField(Form.makeField("password", Schema.String))
180
+ * const loginForm = FormBuilder.empty
181
+ * .addField(FormBuilder.makeField("email", Schema.String))
182
+ * .addField(FormBuilder.makeField("password", Schema.String))
201
183
  *
202
184
  * const atoms = FormAtoms.make({
203
185
  * runtime,
@@ -215,9 +197,9 @@ export const make = <TFields extends Field.FieldsRecord, R>(
215
197
  const { formBuilder, runtime } = config
216
198
  const { fields } = formBuilder
217
199
 
218
- const combinedSchema = Form.buildSchema(formBuilder)
200
+ const combinedSchema = FormBuilder.buildSchema(formBuilder)
219
201
 
220
- const stateAtom = Atom.make(Option.none<Form.FormState<TFields>>()).pipe(Atom.setIdleTTL(0))
202
+ const stateAtom = Atom.make(Option.none<FormBuilder.FormState<TFields>>()).pipe(Atom.setIdleTTL(0))
221
203
  const crossFieldErrorsAtom = Atom.make<Map<string, string>>(new Map()).pipe(Atom.setIdleTTL(0))
222
204
 
223
205
  const dirtyFieldsAtom = Atom.readable((get) => Option.getOrThrow(get(stateAtom)).dirtyFields).pipe(
@@ -232,27 +214,29 @@ export const make = <TFields extends Field.FieldsRecord, R>(
232
214
  Atom.setIdleTTL(0),
233
215
  )
234
216
 
217
+ const lastSubmittedValuesAtom = Atom.readable(
218
+ (get) => Option.getOrThrow(get(stateAtom)).lastSubmittedValues,
219
+ ).pipe(Atom.setIdleTTL(0))
220
+
221
+ const changedSinceSubmitFieldsAtom = Atom.readable((get) => {
222
+ const state = Option.getOrThrow(get(stateAtom))
223
+ return Option.match(state.lastSubmittedValues, {
224
+ onNone: () => new Set<string>(),
225
+ onSome: (lastSubmitted) => recalculateDirtySubtree(new Set(), lastSubmitted, state.values, ""),
226
+ })
227
+ }).pipe(Atom.setIdleTTL(0))
228
+
229
+ const hasChangedSinceSubmitAtom = Atom.readable((get) => {
230
+ const state = Option.getOrThrow(get(stateAtom))
231
+ if (Option.isNone(state.lastSubmittedValues)) return false
232
+ if (state.values === state.lastSubmittedValues.value) return false
233
+ return get(changedSinceSubmitFieldsAtom).size > 0
234
+ }).pipe(Atom.setIdleTTL(0))
235
+
235
236
  const onSubmitAtom = Atom.make<Atom.AtomResultFn<Field.DecodedFromFields<TFields>, unknown, unknown> | null>(
236
237
  null,
237
238
  ).pipe(Atom.setIdleTTL(0))
238
239
 
239
- const updateDirtyFields = (
240
- state: Form.FormState<TFields>,
241
- fieldPath: string,
242
- newValue: unknown,
243
- ): ReadonlySet<string> => {
244
- const initialValue = getNestedValue(state.initialValues, fieldPath)
245
- const isEqual = Utils.structuralRegion(() => Equal.equals(newValue, initialValue))
246
-
247
- const newDirtyFields = new Set(state.dirtyFields)
248
- if (!isEqual) {
249
- newDirtyFields.add(fieldPath)
250
- } else {
251
- newDirtyFields.delete(fieldPath)
252
- }
253
- return newDirtyFields
254
- }
255
-
256
240
  const validationAtomsRegistry = createWeakRegistry<Atom.AtomResultFn<unknown, void, ParseResult.ParseError>>()
257
241
  const fieldAtomsRegistry = createWeakRegistry<FieldAtoms>()
258
242
 
@@ -282,12 +266,18 @@ export const make = <TFields extends Field.FieldsRecord, R>(
282
266
  (get) => getNestedValue(Option.getOrThrow(get(stateAtom)).values, fieldPath),
283
267
  (ctx, value) => {
284
268
  const currentState = Option.getOrThrow(ctx.get(stateAtom))
269
+ const newValues = setNestedValue(currentState.values, fieldPath, value)
285
270
  ctx.set(
286
271
  stateAtom,
287
272
  Option.some({
288
273
  ...currentState,
289
- values: setNestedValue(currentState.values, fieldPath, value),
290
- dirtyFields: updateDirtyFields(currentState, fieldPath, value),
274
+ values: newValues,
275
+ dirtyFields: recalculateDirtySubtree(
276
+ currentState.dirtyFields,
277
+ currentState.initialValues,
278
+ newValues,
279
+ fieldPath,
280
+ ),
291
281
  }),
292
282
  )
293
283
  },
@@ -344,13 +334,14 @@ export const make = <TFields extends Field.FieldsRecord, R>(
344
334
  ).pipe(Atom.setIdleTTL(0)) as Atom.AtomResultFn<Field.EncodedFromFields<TFields>, unknown, unknown>
345
335
 
346
336
  const fieldRefs = Object.fromEntries(
347
- Object.keys(fields).map((key) => [key, Form.makeFieldRef(key)]),
337
+ Object.keys(fields).map((key) => [key, FormBuilder.makeFieldRef(key)]),
348
338
  ) as FieldRefs<TFields>
349
339
 
350
340
  const operations: FormOperations<TFields> = {
351
341
  createInitialState: (defaultValues) => ({
352
342
  values: defaultValues,
353
343
  initialValues: defaultValues,
344
+ lastSubmittedValues: Option.none(),
354
345
  touched: Field.createTouchedRecord(fields, false) as { readonly [K in keyof TFields]: boolean },
355
346
  submitCount: 0,
356
347
  dirtyFields: new Set(),
@@ -359,6 +350,7 @@ export const make = <TFields extends Field.FieldsRecord, R>(
359
350
  createResetState: (state) => ({
360
351
  values: state.initialValues,
361
352
  initialValues: state.initialValues,
353
+ lastSubmittedValues: Option.none(),
362
354
  touched: Field.createTouchedRecord(fields, false) as { readonly [K in keyof TFields]: boolean },
363
355
  submitCount: 0,
364
356
  dirtyFields: new Set(),
@@ -366,6 +358,7 @@ export const make = <TFields extends Field.FieldsRecord, R>(
366
358
 
367
359
  createSubmitState: (state) => ({
368
360
  ...state,
361
+ lastSubmittedValues: Option.some(state.values),
369
362
  touched: Field.createTouchedRecord(fields, true) as { readonly [K in keyof TFields]: boolean },
370
363
  submitCount: state.submitCount + 1,
371
364
  }),
@@ -463,6 +456,29 @@ export const make = <TFields extends Field.FieldsRecord, R>(
463
456
  dirtyFields: recalculateDirtyFieldsForArray(state.dirtyFields, state.initialValues, arrayPath, newItems),
464
457
  }
465
458
  },
459
+
460
+ revertToLastSubmit: (state) => {
461
+ if (Option.isNone(state.lastSubmittedValues)) {
462
+ return state
463
+ }
464
+
465
+ if (state.values === state.lastSubmittedValues.value) {
466
+ return state
467
+ }
468
+
469
+ const newDirtyFields = recalculateDirtySubtree(
470
+ state.dirtyFields,
471
+ state.initialValues,
472
+ state.lastSubmittedValues.value,
473
+ "",
474
+ )
475
+
476
+ return {
477
+ ...state,
478
+ values: state.lastSubmittedValues.value,
479
+ dirtyFields: newDirtyFields,
480
+ }
481
+ },
466
482
  }
467
483
 
468
484
  return {
@@ -471,6 +487,9 @@ export const make = <TFields extends Field.FieldsRecord, R>(
471
487
  dirtyFieldsAtom,
472
488
  isDirtyAtom,
473
489
  submitCountAtom,
490
+ lastSubmittedValuesAtom,
491
+ changedSinceSubmitFieldsAtom,
492
+ hasChangedSinceSubmitAtom,
474
493
  onSubmitAtom,
475
494
  decodeAndSubmit,
476
495
  combinedSchema,