@@ -1045,14 +1045,40 @@ function pushAdditionalFormField(
1045
1045
1046
1046
function pushAdditionalFormFields (
1047
1047
target : Array < Chunk | PrecomputedChunk > ,
1048
- formData : null | FormData ,
1048
+ formData : void | null | FormData ,
1049
1049
) {
1050
- if ( formData !== null ) {
1050
+ if ( formData != null ) {
1051
1051
// $FlowFixMe[prop-missing]: FormData has forEach.
1052
1052
formData . forEach ( pushAdditionalFormField , target ) ;
1053
1053
}
1054
1054
}
1055
1055
1056
+ function getCustomFormFields (
1057
+ resumableState : ResumableState ,
1058
+ formAction : any ,
1059
+ ) : null | ReactCustomFormAction {
1060
+ const customAction = formAction . $$FORM_ACTION ;
1061
+ if ( typeof customAction === 'function' ) {
1062
+ const prefix = makeFormFieldPrefix ( resumableState ) ;
1063
+ try {
1064
+ return formAction . $$FORM_ACTION ( prefix ) ;
1065
+ } catch ( x ) {
1066
+ if ( typeof x === 'object' && x !== null && typeof x . then === 'function' ) {
1067
+ // Rethrow suspense.
1068
+ throw x ;
1069
+ }
1070
+ // If we fail to encode the form action for progressive enhancement for some reason,
1071
+ // fallback to trying replaying on the client instead of failing the page. It might
1072
+ // work there.
1073
+ if ( __DEV__ ) {
1074
+ // TODO: Should this be some kind of recoverable error?
1075
+ console [ 'error' ] ( 'Failed to serialize an action for progressive enhancement:\n%o' , x ) ;
1076
+ }
1077
+ }
1078
+ }
1079
+ return null ;
1080
+ }
1081
+
1056
1082
function pushFormActionAttribute (
1057
1083
target : Array < Chunk | PrecomputedChunk > ,
1058
1084
resumableState : ResumableState ,
@@ -1062,7 +1088,7 @@ function pushFormActionAttribute(
1062
1088
formMethod : any ,
1063
1089
formTarget : any ,
1064
1090
name : any ,
1065
- ) : null | FormData {
1091
+ ) : void | null | FormData {
1066
1092
let formData = null ;
1067
1093
if ( enableFormActions && typeof formAction === 'function' ) {
1068
1094
// Function form actions cannot control the form properties
@@ -1092,12 +1118,10 @@ function pushFormActionAttribute(
1092
1118
) ;
1093
1119
}
1094
1120
}
1095
- const customAction : ReactCustomFormAction = formAction . $$FORM_ACTION ;
1096
- if ( typeof customAction === 'function' ) {
1121
+ const customFields = getCustomFormFields ( resumableState , formAction ) ;
1122
+ if ( customFields !== null ) {
1097
1123
// This action has a custom progressive enhancement form that can submit the form
1098
1124
// back to the server if it's invoked before hydration. Such as a Server Action.
1099
- const prefix = makeFormFieldPrefix ( resumableState ) ;
1100
- const customFields = formAction . $$FORM_ACTION ( prefix ) ;
1101
1125
name = customFields . name ;
1102
1126
formAction = customFields . action || '' ;
1103
1127
formEncType = customFields . encType ;
@@ -1882,12 +1906,10 @@ function pushStartForm(
1882
1906
) ;
1883
1907
}
1884
1908
}
1885
- const customAction : ReactCustomFormAction = formAction . $$FORM_ACTION ;
1886
- if ( typeof customAction === 'function' ) {
1909
+ const customFields = getCustomFormFields ( resumableState , formAction ) ;
1910
+ if ( customFields !== null ) {
1887
1911
// This action has a custom progressive enhancement form that can submit the form
1888
1912
// back to the server if it's invoked before hydration. Such as a Server Action.
1889
- const prefix = makeFormFieldPrefix ( resumableState ) ;
1890
- const customFields = formAction . $$FORM_ACTION ( prefix ) ;
1891
1913
formAction = customFields . action || '' ;
1892
1914
formEncType = customFields . encType ;
1893
1915
formMethod = customFields . method ;
0 commit comments