@@ -2,7 +2,7 @@ import React from 'react';
22
33import _ from 'lodash' ;
44
5- import { isArraySpec , isNumberSpec , isObjectSpec } from '../../../helpers' ;
5+ import { isArraySpec , isCorrectSpec , isNumberSpec , isObjectSpec } from '../../../helpers' ;
66import { Spec } from '../../../types' ;
77import { EMPTY_MUTATOR , OBJECT_ARRAY_CNT , OBJECT_ARRAY_FLAG } from '../constants' ;
88import {
@@ -13,18 +13,23 @@ import {
1313 FieldRenderProps ,
1414 FieldValue ,
1515 ValidateError ,
16+ ValidatorsMap ,
1617} from '../types' ;
1718import {
1819 isArrayItem ,
20+ isCorrectConfig ,
1921 isErrorMutatorCorrect ,
2022 isValueMutatorCorrect ,
2123 transformArrIn ,
2224 transformArrOut ,
2325} from '../utils' ;
2426
27+ import { useDynamicFormsCtx } from './useDynamicFormsCtx' ;
28+
2529export interface UseFieldProps < Value extends FieldValue , SpecType extends Spec > {
2630 name : string ;
2731 spec : SpecType ;
32+ originalSpec : SpecType ;
2833 initialValue : Value ;
2934 value : Value ;
3035 validate ?: ( value ?: Value ) => ValidateError ;
@@ -39,10 +44,58 @@ export interface UseFieldProps<Value extends FieldValue, SpecType extends Spec>
3944 parentOnUnmount : ( ( childName : string ) => void ) | null ;
4045 mutators : DynamicFormMutators ;
4146}
47+ // TODO: remove
48+ const useExtraValidator = < Value extends FieldValue , SpecType extends Spec > ( {
49+ name,
50+ spec,
51+ } : {
52+ name : string ;
53+ spec : SpecType ;
54+ } ) => {
55+ const { mutators, config} = useDynamicFormsCtx ( ) ;
56+
57+ const nextSpec = ( ( ) => {
58+ const specMutator = _ . get ( mutators . spec , name , EMPTY_MUTATOR ) ;
59+
60+ if ( specMutator !== EMPTY_MUTATOR ) {
61+ return _ . merge ( _ . cloneDeep ( spec ) , specMutator ) ;
62+ }
63+
64+ return spec ;
65+ } ) ( ) ;
66+ const validator = ( ( ) => {
67+ if ( isCorrectConfig ( config ) && isCorrectSpec ( nextSpec ) ) {
68+ const { validators} = config [ nextSpec . type ] as unknown as {
69+ validators : ValidatorsMap < Value , SpecType > ;
70+ } ;
71+
72+ if ( validators ) {
73+ if (
74+ ( ! _ . isString ( nextSpec . validator ) || ! nextSpec . validator . length ) &&
75+ _ . isFunction ( validators . base )
76+ ) {
77+ return ( value ?: Value ) => validators . base ( nextSpec , value ) ;
78+ }
79+
80+ if (
81+ _ . isString ( nextSpec . validator ) &&
82+ _ . isFunction ( validators [ nextSpec . validator ] )
83+ ) {
84+ return ( value ?: Value ) => validators [ nextSpec . validator ! ] ! ( nextSpec , value ) ;
85+ }
86+ }
87+ }
88+
89+ return ;
90+ } ) ( ) ;
91+
92+ return validator ;
93+ } ;
4294
4395export const useField = < Value extends FieldValue , SpecType extends Spec > ( {
4496 name,
4597 spec,
98+ originalSpec,
4699 initialValue,
47100 value : externalValue ,
48101 validate : propsValidate ,
@@ -52,6 +105,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
52105 mutators,
53106} : UseFieldProps < Value , SpecType > ) : FieldRenderProps < Value > => {
54107 const firstRenderRef = React . useRef ( true ) ;
108+ const extraValidator = useExtraValidator < Value , SpecType > ( { name, spec : originalSpec } ) ;
55109
56110 const validate = React . useCallback (
57111 ( value : Value ) => propsValidate ?.( transformArrOut ( value ) ) ,
@@ -112,10 +166,12 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
112166 valOrSetter : Value | ( ( currentValue : Value ) => Value ) ,
113167 childErrors ?: Record < string , ValidateError > ,
114168 errorMutator ?: ValidateError ,
169+ extraValidator ?: ReturnType < typeof useExtraValidator < Value , SpecType > > ,
115170 ) => {
116171 setState ( ( state ) => {
117172 const _value = _ . isFunction ( valOrSetter ) ? valOrSetter ( state . value ) : valOrSetter ;
118- const error = validate ?.( _value ) || errorMutator ;
173+ const error =
174+ ( extraValidator ? extraValidator ( _value ) : validate ?.( _value ) ) || errorMutator ;
119175 let value = transformArrIn ( _value ) ;
120176
121177 if ( isNumberSpec ( spec ) && ! error ) {
@@ -298,7 +354,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
298354 valueMutator !== state . value &&
299355 valueMutator !== EMPTY_MUTATOR
300356 ) {
301- onLocalChange ( valueMutator , undefined , errorMutator ) ;
357+ onLocalChange ( valueMutator , undefined , errorMutator , extraValidator ) ;
302358 } else if ( state . error !== errorMutator && ! ( state . error && ! errorMutator ) ) {
303359 setState ( { ...state , error : errorMutator } ) ;
304360 ( parentOnChange ? parentOnChange : tools . onChange ) ( name , state . value , {
0 commit comments