Skip to content

Commit 03fe2a4

Browse files
committed
Create validate-warning only once
1 parent 7926f20 commit 03fe2a4

File tree

1 file changed

+26
-29
lines changed

1 file changed

+26
-29
lines changed

packages/react-form-renderer/src/files/use-field-api.js

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,34 @@ const calculateArrayValidator = (props, validate, component, validatorMapper) =>
2121
}
2222
};
2323

24-
const calculateValidate = (props, validate, component, validatorMapper) => {
24+
const calculateValidate = (props, validate, component, validatorMapper, setWarning, useWarnings) => {
2525
if ((validate || props.dataType) && componentTypes.FIELD_ARRAY !== component) {
26-
return composeValidators(getValidate(validate, props.dataType, validatorMapper));
26+
const validateFn = composeValidators(getValidate(validate, props.dataType, validatorMapper));
27+
28+
if (useWarnings) {
29+
return async (...args) => {
30+
setWarning(undefined);
31+
32+
const result = await validateFn(...args);
33+
34+
if (result?.type === 'warning') {
35+
setWarning(result.error);
36+
37+
return;
38+
}
39+
40+
return result;
41+
};
42+
}
43+
44+
return validateFn;
2745
}
2846
};
2947

30-
const init = ({ props, validate, component, validatorMapper }) => ({
48+
const init = ({ props, validate, component, validatorMapper, setWarning, useWarnings }) => ({
3149
initialValue: calculateInitialValue(props),
3250
arrayValidator: calculateArrayValidator(props, validate, component, validatorMapper),
33-
validate: calculateValidate(props, validate, component, validatorMapper),
51+
validate: calculateValidate(props, validate, component, validatorMapper, setWarning, useWarnings),
3452
type: assignSpecialType(component)
3553
});
3654

@@ -68,9 +86,7 @@ const createFieldProps = (name, formOptions) => {
6886

6987
const useFieldApi = ({ name, initializeOnMount, component, render, validate, resolveProps, useWarnings, convertWarningToError, ...props }) => {
7088
const { validatorMapper, formOptions } = useContext(RendererContext);
71-
72-
// eslint-disable-next-line react-hooks/rules-of-hooks
73-
const [warning, setWarning] = useWarnings ? useState() : [undefined, () => undefined];
89+
const [warning, setWarning] = useState();
7490

7591
const { validate: resolvePropsValidate, ...resolvedProps } = resolveProps
7692
? resolveProps(props, createFieldProps(name, formOptions), formOptions) || {}
@@ -80,7 +96,7 @@ const useFieldApi = ({ name, initializeOnMount, component, render, validate, res
8096

8197
const [{ type, initialValue, validate: stateValidate, arrayValidator }, dispatch] = useReducer(
8298
reducer,
83-
{ props: { ...props, ...resolvedProps }, validate: finalValidate, component, validatorMapper },
99+
{ props: { ...props, ...resolvedProps }, validate: finalValidate, component, validatorMapper, setWarning, useWarnings },
84100
init
85101
);
86102

@@ -94,26 +110,7 @@ const useFieldApi = ({ name, initializeOnMount, component, render, validate, res
94110
...(stateValidate ? { validate: stateValidate } : {})
95111
};
96112

97-
const fieldProps = useField(name, {
98-
...enhancedProps,
99-
...(useWarnings && {
100-
validate: async (...args) => {
101-
warning && setWarning(undefined);
102-
103-
const result = await enhancedProps.validate(...args);
104-
105-
if (result?.type === 'warning') {
106-
if (warning !== result.error) {
107-
setWarning(result.error);
108-
}
109-
110-
return;
111-
}
112-
113-
return result;
114-
}
115-
})
116-
});
113+
const fieldProps = useField(name, enhancedProps);
117114

118115
/** Reinitilize type */
119116
useEffect(() => {
@@ -130,7 +127,7 @@ const useFieldApi = ({ name, initializeOnMount, component, render, validate, res
130127
if (mounted.current) {
131128
dispatch({
132129
type: 'setValidators',
133-
validate: calculateValidate(enhancedProps, finalValidate, component, validatorMapper),
130+
validate: calculateValidate(enhancedProps, finalValidate, component, validatorMapper, setWarning, useWarnings),
134131
arrayValidator: calculateArrayValidator(enhancedProps, finalValidate, component, validatorMapper)
135132
});
136133
}

0 commit comments

Comments
 (0)