@@ -19,7 +19,8 @@ import CreateManagerApi, {
19
19
ManagerApiFunctions ,
20
20
ExtendedFieldState ,
21
21
InitilizeInputFunction ,
22
- CreateManagerApiConfig
22
+ CreateManagerApiConfig ,
23
+ FieldListener
23
24
} from '../types/manager-api' ;
24
25
import AnyObject from '../types/any-object' ;
25
26
import FieldConfig , { IsEqual } from '../types/field-config' ;
@@ -33,7 +34,8 @@ import focusError from './focus-error';
33
34
34
35
export const defaultIsEqual = ( a : any , b : any ) => a === b ;
35
36
36
- const isLast = ( fieldListeners : AnyObject , name : string ) => fieldListeners ?. [ name ] ?. count === 1 ;
37
+ const isLast = ( fieldListeners : AnyObject , name : string , registeringFields : string [ ] ) =>
38
+ fieldListeners ?. [ name ] ?. count - registeringFields . filter ( ( field ) => field === name ) . length === 1 ;
37
39
38
40
const noState = ( fieldListeners : AnyObject , name : string ) => ! fieldListeners ?. [ name ] ?. state ;
39
41
@@ -256,6 +258,7 @@ const createManagerApi: CreateManagerApi = ({
256
258
let runningValidators = 0 ;
257
259
let flatSubmitErrors : AnyObject = { } ;
258
260
let flatErrors : AnyObject = { } ;
261
+ const registeringFields : string [ ] = [ ] ;
259
262
260
263
function updateRunningValidators ( increment : number ) : void {
261
264
runningValidators = Math . max ( runningValidators + increment , 0 ) ;
@@ -610,7 +613,10 @@ const createManagerApi: CreateManagerApi = ({
610
613
}
611
614
612
615
function handleSubmit ( event ?: FormEvent ) : void {
613
- event && event . preventDefault && event . preventDefault ( ) ;
616
+ if ( event ) {
617
+ typeof event . preventDefault && typeof event . preventDefault === 'function' && event . preventDefault ( ) ;
618
+ typeof event . stopPropagation && typeof event . stopPropagation === 'function' && event . stopPropagation ( ) ;
619
+ }
614
620
615
621
if ( state . submitting ) {
616
622
return ;
@@ -643,7 +649,7 @@ const createManagerApi: CreateManagerApi = ({
643
649
return ;
644
650
}
645
651
646
- const result = config . onSubmit ( state . values ) ;
652
+ const result = config . onSubmit ( { ... state . values } , { ... state , values : { ... state . values } } , event ) ;
647
653
648
654
if ( isPromise ( result ) ) {
649
655
setSubmitting ( ) ;
@@ -747,6 +753,7 @@ const createManagerApi: CreateManagerApi = ({
747
753
function registerField ( field : FieldConfig ) : void {
748
754
isSilent = field . silent ? isSilent + 1 : isSilent ;
749
755
registeringField = field . internalId || field . name ;
756
+ field . silent && registeringFields . push ( field . name ) ;
750
757
batch ( ( ) => {
751
758
const render = prepareRerender ( ) ;
752
759
addIfUnique ( state . registeredFields , field . name ) ;
@@ -755,7 +762,11 @@ const createManagerApi: CreateManagerApi = ({
755
762
shouldExecute ( config . initializeOnMount , field . initializeOnMount ) ||
756
763
( ! isInitialized ( field . name ) && typeof field . initialValue !== 'undefined' )
757
764
) {
758
- set ( state . values , field . name , field . initialValue || get ( state . initialValues , field . name ) ) ;
765
+ set (
766
+ state . values ,
767
+ field . name ,
768
+ Object . prototype . hasOwnProperty . call ( field , 'initialValue' ) ? field . initialValue : get ( state . initialValues , field . name )
769
+ ) ;
759
770
}
760
771
761
772
let setDirty = false ;
@@ -815,6 +826,8 @@ const createManagerApi: CreateManagerApi = ({
815
826
rerender ( silentRender ) ;
816
827
silentRender = [ ] ;
817
828
registeringField = undefined ;
829
+
830
+ registeringFields . splice ( registeringFields . indexOf ( field . name ) , 1 ) ;
818
831
}
819
832
}
820
833
@@ -823,15 +836,23 @@ const createManagerApi: CreateManagerApi = ({
823
836
const render = prepareRerender ( ) ;
824
837
delete state . fieldListeners [ field . name ] . fields [ field . internalId ] ;
825
838
826
- if ( isLast ( state . fieldListeners , field . name ) ) {
839
+ if ( isLast ( state . fieldListeners , field . name , registeringFields ) ) {
827
840
state . registeredFields = state . registeredFields . filter ( ( fieldName : string ) => fieldName !== field . name ) ;
828
841
if ( shouldExecute ( config . clearOnUnmount || config . destroyOnUnregister , field . clearOnUnmount ) ) {
829
842
set ( state . values , field . name , field . value ) ;
830
843
}
844
+
845
+ updateError ( field . name ) ;
831
846
}
832
847
833
848
unsubscribe ( field as SubscriberConfig ) ;
834
849
850
+ revalidateFields ( state . registeredFields ) ;
851
+
852
+ if ( config . validate ) {
853
+ validateForm ( config . validate ) ;
854
+ }
855
+
835
856
render ( ) ;
836
857
} ) ;
837
858
}
@@ -861,7 +882,7 @@ const createManagerApi: CreateManagerApi = ({
861
882
}
862
883
863
884
function getState ( ) : ManagerState {
864
- return { ...state } ;
885
+ return { ...state , values : { ... state . values } } ;
865
886
}
866
887
867
888
function updateValidating ( validating : boolean ) {
@@ -918,17 +939,34 @@ const createManagerApi: CreateManagerApi = ({
918
939
subscribeTo && subscribeTo . forEach ( ( to ) => addIfUnique ( batched , to ) ) ;
919
940
shouldRerender = true ;
920
941
} else {
942
+ if ( config . subscription ) {
943
+ let refreshForm : boolean | undefined = false ;
944
+
945
+ traverseObject ( config . subscription , ( subscribed , key ) => {
946
+ if ( ! refreshForm ) {
947
+ refreshForm = subscribed && ( key === 'all' || subscribeTo ?. includes ( key ) ) ;
948
+ }
949
+ } ) ;
950
+
951
+ if ( refreshForm ) {
952
+ const formField = Object . values ( state . fieldListeners ) ?. find ( ( fieldListener : FieldListener ) => fieldListener . isForm ) ?. fields [ 0 ] ;
953
+
954
+ if ( formField ) {
955
+ formField . render ( ) ;
956
+ return ;
957
+ }
958
+ }
959
+ }
960
+
921
961
traverseObject ( state . fieldListeners , ( fieldListener ) => {
922
962
traverseObject ( fieldListener . fields , ( field , key ) => {
923
963
if ( String ( registeringField ) !== String ( key ) ) {
924
964
let shouldRender : boolean | undefined = false ;
925
965
926
- const mergedSubscription = { ...config . subscription , ...field . subscription } ;
927
-
928
966
if ( ! config . subscription && ! field . subscription ) {
929
967
shouldRender = true ;
930
- } else {
931
- traverseObject ( mergedSubscription , ( subscribed , key ) => {
968
+ } else if ( field . subscription ) {
969
+ traverseObject ( field . subscription , ( subscribed , key ) => {
932
970
if ( ! shouldRender ) {
933
971
shouldRender = subscribed && ( key === 'all' || subscribeTo ?. includes ( key ) ) ;
934
972
}
@@ -955,7 +993,7 @@ const createManagerApi: CreateManagerApi = ({
955
993
}
956
994
}
957
995
958
- function subscribe ( subscriberConfig : SubscriberConfig , isField ?: boolean ) : void {
996
+ function subscribe ( subscriberConfig : SubscriberConfig , isField ?: boolean , isForm ?: boolean ) : void {
959
997
state . fieldListeners [ subscriberConfig . name ] = {
960
998
...state . fieldListeners [ subscriberConfig . name ] ,
961
999
...( isField
@@ -977,12 +1015,16 @@ const createManagerApi: CreateManagerApi = ({
977
1015
beforeSubmit : subscriberConfig . beforeSubmit ,
978
1016
isEqual : subscriberConfig . isEqual
979
1017
}
980
- }
1018
+ } ,
1019
+ ...( isForm && { isForm : true } )
981
1020
} ;
982
1021
}
983
1022
984
1023
function unsubscribe ( subscriberConfig : Omit < SubscriberConfig , 'render' > ) : void {
985
- if ( isLast ( state . fieldListeners , String ( subscriberConfig . name ) ) && noState ( state . fieldListeners , String ( subscriberConfig . name ) ) ) {
1024
+ if (
1025
+ isLast ( state . fieldListeners , String ( subscriberConfig . name ) , registeringFields ) &&
1026
+ noState ( state . fieldListeners , String ( subscriberConfig . name ) )
1027
+ ) {
986
1028
delete state . fieldListeners [ subscriberConfig . name ] ;
987
1029
} else {
988
1030
state . fieldListeners [ subscriberConfig . name ] . count = state . fieldListeners [ subscriberConfig . name ] . count - 1 ;
@@ -1016,7 +1058,7 @@ const createManagerApi: CreateManagerApi = ({
1016
1058
}
1017
1059
1018
1060
function getRegisteredFields ( ) : Array < string > {
1019
- return state . registeredFields ;
1061
+ return [ ... state . registeredFields ] ;
1020
1062
}
1021
1063
1022
1064
return managerApi ;
0 commit comments