@formality-ui/react 0.2.5 → 0.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/dist/index.cjs CHANGED
@@ -164,12 +164,18 @@ function Form({
164
164
  return result;
165
165
  }, [providerConfig.inputs, formConfig.inputs]);
166
166
  const defaultValues = react.useMemo(() => {
167
- return core.resolveAllInitialValues(config, mergedInputs, record ?? {});
167
+ const resolved = core.resolveAllInitialValues(config, mergedInputs, record ?? {});
168
+ const baseline = { ...record ?? {}, ...resolved };
169
+ for (const fieldName of Object.keys(config)) {
170
+ if (!(fieldName in baseline)) baseline[fieldName] = void 0;
171
+ }
172
+ return baseline;
168
173
  }, [config, mergedInputs, record]);
169
174
  const methods = reactHookForm.useForm({
170
175
  mode: mode ?? "onChange",
171
176
  defaultValues,
172
- values: record
177
+ values: defaultValues
178
+ // was: `record as any` — see baseline comment above
173
179
  });
174
180
  const fieldRegistry = react.useRef(/* @__PURE__ */ new Set());
175
181
  const [registeredFields, setRegisteredFields] = react.useState(
@@ -335,8 +341,10 @@ function Form({
335
341
  }, [methods, config, record, defaultValues]);
336
342
  const handleSubmit = react.useCallback(
337
343
  async (values, overrideOnSubmit) => {
338
- for (const [, isValidating] of validatingFields.current) {
339
- if (isValidating) return;
344
+ for (const [fieldName, isValidating] of validatingFields.current) {
345
+ if (!isValidating) continue;
346
+ const subscribers = invertedSubscriptions.current.get(fieldName);
347
+ if (subscribers && subscribers.size > 0) return;
340
348
  }
341
349
  if (validate) {
342
350
  const errors = await validate(values);
@@ -934,13 +942,12 @@ function useSubscriptions(fieldName, subscriptions) {
934
942
  };
935
943
  }, [fieldName, subscriptions, addSubscription, removeSubscription]);
936
944
  }
937
- function Field({
945
+ function useField({
938
946
  name,
939
947
  type: typeProp,
940
948
  disabled: disabledProp,
941
949
  hidden: hiddenProp,
942
950
  children,
943
- shouldRegister = true,
944
951
  inputConfig: inputConfigProp,
945
952
  ...restProps
946
953
  }) {
@@ -948,8 +955,6 @@ function Field({
948
955
  config,
949
956
  formConfig,
950
957
  methods,
951
- registerField,
952
- unregisterField,
953
958
  registerWatcherSetter,
954
959
  unregisterWatcherSetter,
955
960
  changeField,
@@ -978,12 +983,6 @@ function Field({
978
983
  };
979
984
  return inputConfigProp ? { ...baseInputConfig, ...inputConfigProp } : baseInputConfig;
980
985
  }, [type, providerConfig.inputs, formConfig.inputs, inputConfigProp]);
981
- react.useEffect(() => {
982
- if (shouldRegister) {
983
- registerField(name);
984
- return () => unregisterField(name);
985
- }
986
- }, [name, shouldRegister, registerField, unregisterField]);
987
986
  const [watchers, setWatchers] = react.useState({});
988
987
  react.useEffect(() => {
989
988
  registerWatcherSetter(name, setWatchers);
@@ -1196,10 +1195,14 @@ function Field({
1196
1195
  inputConfig
1197
1196
  ]
1198
1197
  );
1199
- if (!isVisible) {
1200
- return null;
1201
- }
1202
- return /* @__PURE__ */ jsxRuntime.jsx(
1198
+ const fieldStateRef = react.useRef(
1199
+ {}
1200
+ );
1201
+ const formStateRef = react.useRef(
1202
+ {}
1203
+ );
1204
+ const fieldPropsRef = react.useRef({});
1205
+ const renderedField = isVisible ? /* @__PURE__ */ jsxRuntime.jsx(
1203
1206
  reactHookForm.Controller,
1204
1207
  {
1205
1208
  control: methods.control,
@@ -1250,13 +1253,16 @@ function Field({
1250
1253
  ...stateInjection
1251
1254
  }
1252
1255
  });
1256
+ fieldStateRef.current = fieldState;
1257
+ formStateRef.current = formState;
1258
+ fieldPropsRef.current = finalProps;
1253
1259
  const Component = inputConfig.component;
1254
1260
  const isHostComponent = typeof inputConfig.component === "string";
1255
1261
  const template = inputConfig.template ?? providerConfig.inputTemplates[type] ?? providerConfig.defaultInputTemplate;
1256
1262
  const TemplateComponent = template;
1257
- let renderedField;
1263
+ let renderedFieldEl;
1258
1264
  if (TemplateComponent) {
1259
- renderedField = /* @__PURE__ */ jsxRuntime.jsx(
1265
+ renderedFieldEl = /* @__PURE__ */ jsxRuntime.jsx(
1260
1266
  TemplateComponent,
1261
1267
  {
1262
1268
  Field: Component,
@@ -1279,27 +1285,64 @@ function Field({
1279
1285
  strippedHostProps[key] = value;
1280
1286
  }
1281
1287
  }
1282
- renderedField = react.createElement(inputConfig.component, {
1288
+ renderedFieldEl = react.createElement(inputConfig.component, {
1283
1289
  ...strippedHostProps,
1284
1290
  ref: finalProps.forwardRef
1285
1291
  });
1286
1292
  } else {
1287
- renderedField = /* @__PURE__ */ jsxRuntime.jsx(Component, { ...finalProps });
1293
+ renderedFieldEl = /* @__PURE__ */ jsxRuntime.jsx(Component, { ...finalProps });
1288
1294
  }
1289
1295
  if (typeof children === "function") {
1290
1296
  const result = children({
1291
1297
  fieldState,
1292
- renderedField,
1298
+ renderedField: renderedFieldEl,
1293
1299
  fieldProps: finalProps,
1294
1300
  watchers,
1295
1301
  formState
1296
1302
  });
1297
1303
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: result });
1298
1304
  }
1299
- return renderedField;
1305
+ return renderedFieldEl;
1300
1306
  }
1301
1307
  }
1302
- );
1308
+ ) : null;
1309
+ return {
1310
+ fieldState: fieldStateRef.current,
1311
+ renderedField,
1312
+ fieldProps: fieldPropsRef.current,
1313
+ watchers,
1314
+ formState: formStateRef.current
1315
+ };
1316
+ }
1317
+
1318
+ // src/components/Field.tsx
1319
+ function Field({
1320
+ name,
1321
+ type: typeProp,
1322
+ disabled: disabledProp,
1323
+ hidden: hiddenProp,
1324
+ children,
1325
+ shouldRegister = true,
1326
+ inputConfig: inputConfigProp,
1327
+ ...restProps
1328
+ }) {
1329
+ const { registerField, unregisterField } = useFormContext();
1330
+ react.useEffect(() => {
1331
+ if (shouldRegister) {
1332
+ registerField(name);
1333
+ return () => unregisterField(name);
1334
+ }
1335
+ }, [name, shouldRegister, registerField, unregisterField]);
1336
+ const { renderedField } = useField({
1337
+ name,
1338
+ type: typeProp,
1339
+ disabled: disabledProp,
1340
+ hidden: hiddenProp,
1341
+ children,
1342
+ inputConfig: inputConfigProp,
1343
+ ...restProps
1344
+ });
1345
+ return renderedField;
1303
1346
  }
1304
1347
  function FieldGroup({ name, children }) {
1305
1348
  const { formConfig } = useFormContext();
@@ -1456,6 +1499,7 @@ exports.makeDeepProxyState = makeDeepProxyState;
1456
1499
  exports.makeProxyState = makeProxyState;
1457
1500
  exports.useConditions = useConditions;
1458
1501
  exports.useConfigContext = useConfigContext;
1502
+ exports.useField = useField;
1459
1503
  exports.useFormContext = useFormContext;
1460
1504
  exports.useFormState = useFormState;
1461
1505
  exports.useGroupContext = useGroupContext;