@conform-to/react 1.2.1 → 1.3.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.
package/helpers.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import type { FormMetadata, FieldMetadata, Metadata, Pretty } from './context';
3
3
  type FormControlProps = {
4
- key?: string;
4
+ key: string | undefined;
5
5
  id: string;
6
6
  name: string;
7
7
  form: string;
package/helpers.js CHANGED
@@ -73,6 +73,7 @@ function getFieldsetProps(metadata, options) {
73
73
  */
74
74
  function getFormControlProps(metadata, options) {
75
75
  return simplify(_rollupPluginBabelHelpers.objectSpread2({
76
+ key: metadata.key,
76
77
  required: metadata.required || undefined
77
78
  }, getFieldsetProps(metadata, options)));
78
79
  }
package/helpers.mjs CHANGED
@@ -69,6 +69,7 @@ function getFieldsetProps(metadata, options) {
69
69
  */
70
70
  function getFormControlProps(metadata, options) {
71
71
  return simplify(_objectSpread2({
72
+ key: metadata.key,
72
73
  required: metadata.required || undefined
73
74
  }, getFieldsetProps(metadata, options)));
74
75
  }
package/hooks.js CHANGED
@@ -56,61 +56,10 @@ function useForm(options) {
56
56
  formId
57
57
  }));
58
58
  });
59
- var subjectRef = context.useSubjectRef({
60
- key: {
61
- // Subscribe to all key changes so it will re-render and
62
- // update the field value as soon as the DOM is updated
63
- prefix: ['']
64
- }
65
- });
59
+ var subjectRef = context.useSubjectRef();
66
60
  var stateSnapshot = context.useFormState(context$1, subjectRef);
67
61
  var noValidate = useNoValidate(options.defaultNoValidate);
68
62
  var form = context.getFormMetadata(context$1, subjectRef, stateSnapshot, noValidate);
69
- react.useEffect(() => {
70
- var formElement = document.forms.namedItem(formId);
71
- if (!formElement) {
72
- return;
73
- }
74
- var getAll = value => {
75
- if (typeof value === 'string') {
76
- return [value];
77
- }
78
- if (Array.isArray(value) && value.every(item => typeof item === 'string')) {
79
- return value;
80
- }
81
- return undefined;
82
- };
83
- var get = value => {
84
- var _getAll;
85
- return (_getAll = getAll(value)) === null || _getAll === void 0 ? void 0 : _getAll[0];
86
- };
87
- for (var element of formElement.elements) {
88
- if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {
89
- var prev = element.dataset.conform;
90
- var next = stateSnapshot.key[element.name];
91
- var defaultValue = stateSnapshot.initialValue[element.name];
92
- if (prev === 'managed' || element.type === 'submit' || element.type === 'reset' || element.type === 'button') {
93
- // Skip buttons and fields managed by useInputControl()
94
- continue;
95
- }
96
- if (typeof prev === 'undefined' || prev !== next) {
97
- element.dataset.conform = next;
98
- if ('options' in element) {
99
- var _getAll2;
100
- var value = (_getAll2 = getAll(defaultValue)) !== null && _getAll2 !== void 0 ? _getAll2 : [];
101
- for (var option of element.options) {
102
- option.selected = value.includes(option.value);
103
- }
104
- } else if ('checked' in element && (element.type === 'checkbox' || element.type === 'radio')) {
105
- element.checked = get(defaultValue) === element.value;
106
- } else {
107
- var _get;
108
- element.value = (_get = get(defaultValue)) !== null && _get !== void 0 ? _get : '';
109
- }
110
- }
111
- }
112
- }
113
- }, [formId, stateSnapshot]);
114
63
  return [form, form.getFieldset()];
115
64
  }
116
65
  function useFormMetadata(formId) {
package/hooks.mjs CHANGED
@@ -52,61 +52,10 @@ function useForm(options) {
52
52
  formId
53
53
  }));
54
54
  });
55
- var subjectRef = useSubjectRef({
56
- key: {
57
- // Subscribe to all key changes so it will re-render and
58
- // update the field value as soon as the DOM is updated
59
- prefix: ['']
60
- }
61
- });
55
+ var subjectRef = useSubjectRef();
62
56
  var stateSnapshot = useFormState(context, subjectRef);
63
57
  var noValidate = useNoValidate(options.defaultNoValidate);
64
58
  var form = getFormMetadata(context, subjectRef, stateSnapshot, noValidate);
65
- useEffect(() => {
66
- var formElement = document.forms.namedItem(formId);
67
- if (!formElement) {
68
- return;
69
- }
70
- var getAll = value => {
71
- if (typeof value === 'string') {
72
- return [value];
73
- }
74
- if (Array.isArray(value) && value.every(item => typeof item === 'string')) {
75
- return value;
76
- }
77
- return undefined;
78
- };
79
- var get = value => {
80
- var _getAll;
81
- return (_getAll = getAll(value)) === null || _getAll === void 0 ? void 0 : _getAll[0];
82
- };
83
- for (var element of formElement.elements) {
84
- if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {
85
- var prev = element.dataset.conform;
86
- var next = stateSnapshot.key[element.name];
87
- var defaultValue = stateSnapshot.initialValue[element.name];
88
- if (prev === 'managed' || element.type === 'submit' || element.type === 'reset' || element.type === 'button') {
89
- // Skip buttons and fields managed by useInputControl()
90
- continue;
91
- }
92
- if (typeof prev === 'undefined' || prev !== next) {
93
- element.dataset.conform = next;
94
- if ('options' in element) {
95
- var _getAll2;
96
- var value = (_getAll2 = getAll(defaultValue)) !== null && _getAll2 !== void 0 ? _getAll2 : [];
97
- for (var option of element.options) {
98
- option.selected = value.includes(option.value);
99
- }
100
- } else if ('checked' in element && (element.type === 'checkbox' || element.type === 'radio')) {
101
- element.checked = get(defaultValue) === element.value;
102
- } else {
103
- var _get;
104
- element.value = (_get = get(defaultValue)) !== null && _get !== void 0 ? _get : '';
105
- }
106
- }
107
- }
108
- }
109
- }, [formId, stateSnapshot]);
110
59
  return [form, form.getFieldset()];
111
60
  }
112
61
  function useFormMetadata(formId) {
package/integrations.js CHANGED
@@ -31,7 +31,7 @@ function createDummySelect(form, name, value) {
31
31
  var options = typeof value === 'string' ? [value] : value !== null && value !== void 0 ? value : [];
32
32
  select.name = name;
33
33
  select.multiple = true;
34
- select.dataset.conform = 'managed';
34
+ select.dataset.conform = 'true';
35
35
 
36
36
  // To make sure the input is hidden but still focusable
37
37
  select.setAttribute('aria-hidden', 'true');
@@ -52,7 +52,7 @@ function createDummySelect(form, name, value) {
52
52
  return select;
53
53
  }
54
54
  function isDummySelect(element) {
55
- return element.dataset.conform === 'managed';
55
+ return element.dataset.conform === 'true';
56
56
  }
57
57
  function updateFieldValue(element, value) {
58
58
  if (element instanceof HTMLInputElement && (element.type === 'checkbox' || element.type === 'radio')) {
@@ -216,8 +216,21 @@ function useControl(meta) {
216
216
  setValue(value);
217
217
  change(value);
218
218
  };
219
+ var refCallback = element => {
220
+ var _meta$key;
221
+ register(element);
222
+ if (!element) {
223
+ return;
224
+ }
225
+ var prevKey = element.dataset.conform;
226
+ var nextKey = "".concat((_meta$key = meta.key) !== null && _meta$key !== void 0 ? _meta$key : '');
227
+ if (prevKey !== nextKey) {
228
+ element.dataset.conform = nextKey;
229
+ updateFieldValue(element, value !== null && value !== void 0 ? value : '');
230
+ }
231
+ };
219
232
  return {
220
- register,
233
+ register: refCallback,
221
234
  value,
222
235
  change: handleChange,
223
236
  focus,
package/integrations.mjs CHANGED
@@ -27,7 +27,7 @@ function createDummySelect(form, name, value) {
27
27
  var options = typeof value === 'string' ? [value] : value !== null && value !== void 0 ? value : [];
28
28
  select.name = name;
29
29
  select.multiple = true;
30
- select.dataset.conform = 'managed';
30
+ select.dataset.conform = 'true';
31
31
 
32
32
  // To make sure the input is hidden but still focusable
33
33
  select.setAttribute('aria-hidden', 'true');
@@ -48,7 +48,7 @@ function createDummySelect(form, name, value) {
48
48
  return select;
49
49
  }
50
50
  function isDummySelect(element) {
51
- return element.dataset.conform === 'managed';
51
+ return element.dataset.conform === 'true';
52
52
  }
53
53
  function updateFieldValue(element, value) {
54
54
  if (element instanceof HTMLInputElement && (element.type === 'checkbox' || element.type === 'radio')) {
@@ -212,8 +212,21 @@ function useControl(meta) {
212
212
  setValue(value);
213
213
  change(value);
214
214
  };
215
+ var refCallback = element => {
216
+ var _meta$key;
217
+ register(element);
218
+ if (!element) {
219
+ return;
220
+ }
221
+ var prevKey = element.dataset.conform;
222
+ var nextKey = "".concat((_meta$key = meta.key) !== null && _meta$key !== void 0 ? _meta$key : '');
223
+ if (prevKey !== nextKey) {
224
+ element.dataset.conform = nextKey;
225
+ updateFieldValue(element, value !== null && value !== void 0 ? value : '');
226
+ }
227
+ };
215
228
  return {
216
- register,
229
+ register: refCallback,
217
230
  value,
218
231
  change: handleChange,
219
232
  focus,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Conform view adapter for react",
4
4
  "homepage": "https://conform.guide",
5
5
  "license": "MIT",
6
- "version": "1.2.1",
6
+ "version": "1.3.0",
7
7
  "main": "index.js",
8
8
  "module": "index.mjs",
9
9
  "types": "index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "url": "https://github.com/edmundhung/conform/issues"
31
31
  },
32
32
  "dependencies": {
33
- "@conform-to/dom": "1.2.1"
33
+ "@conform-to/dom": "1.3.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@babel/core": "^7.17.8",