1- import { useEffect , useContext , useRef , useReducer } from 'react' ;
1+ import { useEffect , useContext , useRef , useReducer , useState } from 'react' ;
22import { useField } from 'react-final-form' ;
33import enhancedOnChange from '../form-renderer/enhanced-on-change' ;
44import RendererContext from './renderer-context' ;
@@ -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
@@ -66,8 +84,9 @@ const createFieldProps = (name, formOptions) => {
6684 } ;
6785} ;
6886
69- const useFieldApi = ( { name, initializeOnMount, component, render, validate, resolveProps, ...props } ) => {
87+ const useFieldApi = ( { name, initializeOnMount, component, render, validate, resolveProps, useWarnings , ...props } ) => {
7088 const { validatorMapper, formOptions } = useContext ( RendererContext ) ;
89+ const [ warning , setWarning ] = useState ( ) ;
7190
7291 const { validate : resolvePropsValidate , ...resolvedProps } = resolveProps
7392 ? resolveProps ( props , createFieldProps ( name , formOptions ) , formOptions ) || { }
@@ -77,7 +96,7 @@ const useFieldApi = ({ name, initializeOnMount, component, render, validate, res
7796
7897 const [ { type, initialValue, validate : stateValidate , arrayValidator } , dispatch ] = useReducer (
7998 reducer ,
80- { props : { ...props , ...resolvedProps } , validate : finalValidate , component, validatorMapper } ,
99+ { props : { ...props , ...resolvedProps } , validate : finalValidate , component, validatorMapper, setWarning , useWarnings } ,
81100 init
82101 ) ;
83102
@@ -108,7 +127,7 @@ const useFieldApi = ({ name, initializeOnMount, component, render, validate, res
108127 if ( mounted . current ) {
109128 dispatch ( {
110129 type : 'setValidators' ,
111- validate : calculateValidate ( enhancedProps , finalValidate , component , validatorMapper ) ,
130+ validate : calculateValidate ( enhancedProps , finalValidate , component , validatorMapper , setWarning , useWarnings ) ,
112131 arrayValidator : calculateArrayValidator ( enhancedProps , finalValidate , component , validatorMapper )
113132 } ) ;
114133 }
@@ -193,7 +212,13 @@ const useFieldApi = ({ name, initializeOnMount, component, render, validate, res
193212 return {
194213 ...cleanProps ,
195214 ...fieldProps ,
196- ...( arrayValidator ? { arrayValidator } : { } ) ,
215+ ...( arrayValidator && { arrayValidator } ) ,
216+ ...( useWarnings && {
217+ meta : {
218+ ...fieldProps . meta ,
219+ warning
220+ }
221+ } ) ,
197222 input : {
198223 ...fieldProps . input ,
199224 value :
0 commit comments