@se-studio/hubspot 17.0.28 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +11 -1
- package/dist/external/createHubspotFormExternalRenderer.d.ts +4 -0
- package/dist/external/createHubspotFormExternalRenderer.d.ts.map +1 -1
- package/dist/external/createHubspotFormExternalRenderer.js +1 -1
- package/dist/external/createHubspotFormExternalRenderer.js.map +1 -1
- package/dist/forms/client/HubspotDynamicForm.d.ts +10 -1
- package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -1
- package/dist/forms/client/HubspotDynamicForm.js +6 -3
- package/dist/forms/client/HubspotDynamicForm.js.map +1 -1
- package/dist/forms/client/navigateAfterSubmit.d.ts +6 -1
- package/dist/forms/client/navigateAfterSubmit.d.ts.map +1 -1
- package/dist/forms/client/navigateAfterSubmit.js +27 -2
- package/dist/forms/client/navigateAfterSubmit.js.map +1 -1
- package/dist/forms/client/useHubspotSubmit.d.ts +13 -1
- package/dist/forms/client/useHubspotSubmit.d.ts.map +1 -1
- package/dist/forms/client/useHubspotSubmit.js +124 -24
- package/dist/forms/client/useHubspotSubmit.js.map +1 -1
- package/dist/forms/server/evaluateSubmitResponse.d.ts +17 -0
- package/dist/forms/server/evaluateSubmitResponse.d.ts.map +1 -0
- package/dist/forms/server/evaluateSubmitResponse.js +42 -0
- package/dist/forms/server/evaluateSubmitResponse.js.map +1 -0
- package/dist/forms/server/submitForm.d.ts.map +1 -1
- package/dist/forms/server/submitForm.js +10 -3
- package/dist/forms/server/submitForm.js.map +1 -1
- package/dist/forms/types.d.ts +5 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/docs/llms.md +20 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @se-studio/hubspot
|
|
2
2
|
|
|
3
|
+
## 17.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 4c3ae6a: Treat HubSpot Forms API error HTTP statuses and error bodies as real submit failures. Add pending (`isSubmitting`) and error (`onError`, `submitError`) handling on the standard form so visitors can retry without losing input. Pending/error labels are overridable (`submittingButtonText`, `submitErrorText`) with English defaults. After a successful redirect that leaves the page, keep the submit button pending until navigation, a 10s timeout, bfcache restore, or a navigation error.
|
|
8
|
+
|
|
3
9
|
## 17.0.28
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -60,6 +60,8 @@ Add `"Hubspot form"` to your `externalComponent` enum. `data` JSON:
|
|
|
60
60
|
"formId": "hubspot-form-guid",
|
|
61
61
|
"portalId": "optional-override",
|
|
62
62
|
"submitButtonText": "Optional label",
|
|
63
|
+
"submittingButtonText": "Optional pending label",
|
|
64
|
+
"submitErrorText": "Optional error copy",
|
|
63
65
|
"hiddenFields": { "campaign": "value" }
|
|
64
66
|
}
|
|
65
67
|
```
|
|
@@ -77,6 +79,9 @@ export const HubspotFormRegistration = defineExternalComponent({
|
|
|
77
79
|
{children}
|
|
78
80
|
</Section>
|
|
79
81
|
),
|
|
82
|
+
// Optional site-level defaults; CMS `data.submittingButtonText` / `data.submitErrorText` win
|
|
83
|
+
submittingButtonText: 'Sending…',
|
|
84
|
+
submitErrorText: 'Please try again later.',
|
|
80
85
|
}),
|
|
81
86
|
});
|
|
82
87
|
```
|
|
@@ -123,14 +128,19 @@ These forms are **not** HubSpot’s native embed script — the package rebuilds
|
|
|
123
128
|
|
|
124
129
|
**Navigation:** external absolute URLs use `window.location.assign`; same-origin paths use Next.js `router.push`. Full redirect URLs are preserved (hosts are not stripped).
|
|
125
130
|
|
|
126
|
-
**`onSuccess`:** side-effect only (analytics, swap to CMS `extraCopy`). It does **not** suppress thank-you or redirect. When a redirect is configured, navigation wins after the callback.
|
|
131
|
+
**`onSuccess`:** side-effect only (analytics, swap to CMS `extraCopy`). It does **not** suppress thank-you or redirect. When a redirect is configured, navigation wins after the callback. Do **not** send `onSuccess` field values (email included) to analytics.
|
|
132
|
+
|
|
133
|
+
**`onError`:** optional. HubSpot HTTP errors (`!ok`, `status: "error"`, or `errors[]`) fail the submit instead of showing a thank-you. The standard form disables the submit button while in flight (`isSubmitting`), shows `submitErrorText` (default English), and keeps field values so the visitor can retry. Pass `submittingButtonText` / `submitErrorText` on `HubspotDynamicForm`, or via CMS JSON `data` / renderer options — not new Contentful fields. After a successful submit that leaves the page, the button stays pending until navigation, a 10s safety timeout, a bfcache `pageshow`, or a thrown `router.push`. Same-path or hash redirects do not keep the lock. Blank or whitespace-only `submittingButtonText` / `submitErrorText` fall back to the English defaults. If navigation takes longer than 10s the button re-enables (safety valve, a second submit is possible in that window). Do **not** forward the raw HubSpot `onError` string or any field values to analytics; send a coarse category only.
|
|
127
134
|
|
|
128
135
|
```tsx
|
|
129
136
|
<HubspotDynamicForm
|
|
130
137
|
portalId={portalId}
|
|
131
138
|
formDefinition={formDefinition}
|
|
132
139
|
redirectUrlOverride={cmsExternalUrl} // optional CMS override
|
|
140
|
+
submittingButtonText="Sending…" // optional; default "Submitting…"
|
|
141
|
+
submitErrorText="Please try again later." // optional
|
|
133
142
|
onSuccess={() => setShowExtraCopy(true)} // optional; redirect still runs if set
|
|
143
|
+
onError={() => reportFormError('hubspot_submit_failed')} // coarse category only
|
|
134
144
|
/>
|
|
135
145
|
```
|
|
136
146
|
|
|
@@ -13,6 +13,10 @@ export interface HubspotFormExternalRendererOptions<TExternal extends ITyped> {
|
|
|
13
13
|
getPortalId?: () => string | undefined;
|
|
14
14
|
/** Optional Tailwind/class overrides for form fields. */
|
|
15
15
|
classNames?: HubspotFormClassNames;
|
|
16
|
+
/** Default pending button label when CMS `data.submittingButtonText` is unset. */
|
|
17
|
+
submittingButtonText?: string;
|
|
18
|
+
/** Default visitor-facing error when CMS `data.submitErrorText` is unset. */
|
|
19
|
+
submitErrorText?: string;
|
|
16
20
|
}
|
|
17
21
|
/**
|
|
18
22
|
* Factory for a CMS external component renderer (`externalComponentType: "Hubspot form"`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createHubspotFormExternalRenderer.d.ts","sourceRoot":"","sources":["../../src/external/createHubspotFormExternalRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,qBAAqB,EAA2B,MAAM,gBAAgB,CAAC;AAErF,MAAM,WAAW,kCAAkC,CAAC,SAAS,SAAS,MAAM;IAC1E,+DAA+D;IAC/D,IAAI,EAAE,CAAC,MAAM,EAAE;QACb,WAAW,EAAE,SAAS,CAAC;QACvB,QAAQ,EAAE,SAAS,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,KAAK,SAAS,CAAC;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,yDAAyD;IACzD,UAAU,CAAC,EAAE,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"createHubspotFormExternalRenderer.d.ts","sourceRoot":"","sources":["../../src/external/createHubspotFormExternalRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,qBAAqB,EAA2B,MAAM,gBAAgB,CAAC;AAErF,MAAM,WAAW,kCAAkC,CAAC,SAAS,SAAS,MAAM;IAC1E,+DAA+D;IAC/D,IAAI,EAAE,CAAC,MAAM,EAAE;QACb,WAAW,EAAE,SAAS,CAAC;QACvB,QAAQ,EAAE,SAAS,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,KAAK,SAAS,CAAC;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,yDAAyD;IACzD,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,SAAS,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7F,OAAO,EAAE,kCAAkC,CAAC,SAAS,CAAC,GACrD,yBAAyB,CAAC,SAAS,CAAC,CAiCtC"}
|
|
@@ -19,7 +19,7 @@ export function createHubspotFormExternalRenderer(options) {
|
|
|
19
19
|
return options.wrap({
|
|
20
20
|
information,
|
|
21
21
|
componentName: 'Hubspot form',
|
|
22
|
-
children: (_jsx(HubspotDynamicForm, { portalId: portalId, formDefinition: formDefinition, submitButtonText: data.submitButtonText, classNames: options.classNames, hiddenFields: data.hiddenFields, initialValues: data.initialValues })),
|
|
22
|
+
children: (_jsx(HubspotDynamicForm, { portalId: portalId, formDefinition: formDefinition, submitButtonText: data.submitButtonText, submittingButtonText: data.submittingButtonText?.trim() || options.submittingButtonText, submitErrorText: data.submitErrorText?.trim() || options.submitErrorText, classNames: options.classNames, hiddenFields: data.hiddenFields, initialValues: data.initialValues })),
|
|
23
23
|
});
|
|
24
24
|
};
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createHubspotFormExternalRenderer.js","sourceRoot":"","sources":["../../src/external/createHubspotFormExternalRenderer.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"createHubspotFormExternalRenderer.js","sourceRoot":"","sources":["../../src/external/createHubspotFormExternalRenderer.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAoB7E;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAC/C,OAAsD;IAEtD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEjF,OAAO,KAAK,UAAU,2BAA2B,CAAC,EAAE,WAAW,EAAE;QAC/D,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;QAEhD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,CAAC;YAClB,WAAW;YACX,aAAa,EAAE,cAAc;YAC7B,QAAQ,EAAE,CACR,KAAC,kBAAkB,IACjB,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,oBAAoB,EACvF,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,eAAe,EACxE,UAAU,EAAE,OAAO,CAAC,UAAU,EAC9B,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,aAAa,EAAE,IAAI,CAAC,aAAa,GACjC,CACH;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -18,10 +18,19 @@ export interface HubspotDynamicFormProps {
|
|
|
18
18
|
* Side-effect after successful submit (does not suppress HubSpot thank-you / redirect).
|
|
19
19
|
*/
|
|
20
20
|
onSuccess?: (fields: Record<string, HubspotFieldResponse>) => void;
|
|
21
|
+
/**
|
|
22
|
+
* Called when HubSpot rejects the submission or the request fails.
|
|
23
|
+
* The form keeps field values so the visitor can retry.
|
|
24
|
+
*/
|
|
25
|
+
onError?: (error: string) => void;
|
|
21
26
|
/**
|
|
22
27
|
* CMS redirect override (e.g. externalUrl / data.successRedirectUrl). Wins over HubSpot settings.
|
|
23
28
|
*/
|
|
24
29
|
redirectUrlOverride?: string;
|
|
30
|
+
/** Label shown on the submit button while the request is in flight. Default: `Submitting…`. */
|
|
31
|
+
submittingButtonText?: string;
|
|
32
|
+
/** Visitor-facing submit error. Default: {@link HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE}. */
|
|
33
|
+
submitErrorText?: string;
|
|
25
34
|
}
|
|
26
|
-
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, redirectUrlOverride, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
35
|
+
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
27
36
|
//# sourceMappingURL=HubspotDynamicForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAyBnG;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,EACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CA8CtC;AAgBD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAyBnG;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,EACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CA8CtC;AAgBD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+FAA+F;IAC/F,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uFAAuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,GAChB,EAAE,uBAAuB,+BA8HzB"}
|
|
@@ -79,14 +79,16 @@ function renderRichText(content, className) {
|
|
|
79
79
|
// biome-ignore lint/security/noDangerouslySetInnerHtml: HubSpot form rich text from API
|
|
80
80
|
dangerouslySetInnerHTML: { __html: cleanContent } }));
|
|
81
81
|
}
|
|
82
|
-
export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, redirectUrlOverride, }) {
|
|
82
|
+
export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, }) {
|
|
83
83
|
const classNames = useMemo(() => ({ ...DEFAULT_CLASS_NAMES, ...classNamesProp }), [classNamesProp]);
|
|
84
|
-
const { handleSubmit, handleInputChange, message, formData, setFormData } = useHubspotSubmit({
|
|
84
|
+
const { handleSubmit, handleInputChange, message, formData, setFormData, isSubmitting, submitError, } = useHubspotSubmit({
|
|
85
85
|
portalId,
|
|
86
86
|
formDefinition,
|
|
87
87
|
ipAddress,
|
|
88
88
|
onSuccess,
|
|
89
|
+
onError,
|
|
89
90
|
redirectUrlOverride,
|
|
91
|
+
errorMessage: submitErrorText?.trim() || undefined,
|
|
90
92
|
});
|
|
91
93
|
useEffect(() => {
|
|
92
94
|
setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
|
|
@@ -108,6 +110,7 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
108
110
|
});
|
|
109
111
|
}, [classNames, dependentFieldsMap, formData, handleInputChange, visibleFields]);
|
|
110
112
|
const buttonText = submitButtonText ?? formDefinition.submitButtonText;
|
|
111
|
-
|
|
113
|
+
const pendingButtonText = submittingButtonText?.trim() || 'Submitting…';
|
|
114
|
+
return (_jsxs("form", { onSubmit: handleSubmit, className: classNames.form, "data-hsforms-manual": "true", "data-hs-do-not-collect": "true", children: [formDefinition.recaptchaEnabled && (_jsx("p", { className: classNames.message, children: "This form requires CAPTCHA in HubSpot. Configure bot protection for your deployment." })), formDefinition.fieldGroups.map((group) => (_jsxs("div", { className: classNames.fieldGroup, children: [renderRichText(group.richText, classNames.richText), group.fields.map((field) => renderField(field.name, field))] }, `${group.groupType}-${group.richText ?? group.fields.map((f) => f.name).join('-')}`))), formDefinition.legalConsentOptions && (_jsxs("div", { className: classNames.legalConsent, children: [formDefinition.legalConsentOptions.privacyText && (_jsx("p", { children: decode(formDefinition.legalConsentOptions.privacyText) })), formDefinition.legalConsentOptions.consentToProcessCheckboxLabel && (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: true, name: "consentToProcess" }), _jsx("span", { children: decode(formDefinition.legalConsentOptions.consentToProcessCheckboxLabel) })] })), formDefinition.legalConsentOptions.communicationsCheckboxes?.map((checkbox) => (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: checkbox.required, name: `communication-${checkbox.subscriptionTypeId ?? checkbox.label}` }), _jsx("span", { children: decode(checkbox.label) })] }, checkbox.label)))] })), _jsx("button", { type: "submit", className: classNames.submitButton, disabled: isSubmitting, "aria-busy": isSubmitting, children: decode(isSubmitting ? pendingButtonText : buttonText) }), submitError && (_jsx("p", { className: classNames.error ?? classNames.message, role: "alert", children: submitError })), message && !submitError && _jsx("p", { className: classNames.message, children: message })] }));
|
|
112
115
|
}
|
|
113
116
|
//# sourceMappingURL=HubspotDynamicForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,mBAAmB,GAA0B;IACjD,IAAI,EAAE,qBAAqB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,oBAAoB;IACjC,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,kBAAkB;IAC1B,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,yBAAyB;IACxC,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,yBAAyB;IACrC,YAAY,EAAE,8BAA8B;IAC5C,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,6BAA6B;IAC3C,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,cAAqC,EACrC,YAAqC,EACrC,aAAsC,EACtC,OAA4C;IAE5C,IAAI,QAAQ,GAAyC,EAAE,CAAC;IAExD,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;gBAChD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,KAAK,EACH,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACxF,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,KAAK,EAAE,KAAK,CAAC,YAAY;iBAC1B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,IAAI,OAAO,EAAE,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC5C,sBAAsB,EAAE,CAAC;QACzB,QAAQ,GAAG,kCAAkC,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,IAAI;YACJ,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK;YACnD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,IAAI;YACJ,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK;YACnD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,OAA2B,EAAE,SAAkB;IACrE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,OAAO,CACL,cACE,SAAS,EAAE,SAAS;QACpB,wFAAwF;QACxF,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,GACjD,CACH,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare function navigateAfterSubmit(url: string, router: {
|
|
6
6
|
push: (href: string) => void;
|
|
7
|
-
}, location?: Pick<Location, 'origin' | 'assign'>): void;
|
|
7
|
+
}, location?: Pick<Location, 'origin' | 'assign' | 'href'>): void;
|
|
8
|
+
/**
|
|
9
|
+
* Hold the submit pending lock only when navigation will unmount this page:
|
|
10
|
+
* a different origin, or a different pathname. Same-path query/hash stays mounted.
|
|
11
|
+
*/
|
|
12
|
+
export declare function shouldHoldRedirectLock(url: string, location?: Pick<Location, 'origin' | 'pathname' | 'href'>): boolean;
|
|
8
13
|
//# sourceMappingURL=navigateAfterSubmit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigateAfterSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/navigateAfterSubmit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigateAfterSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/navigateAfterSubmit.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;IAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,EACxC,QAAQ,GAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAEiC,GACrF,IAAI,CAWN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAEqB,GAC3E,OAAO,CAUT"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a post-submit URL against the current page so hash/query-only
|
|
3
|
+
* targets keep the existing path (`#thanks` stays on `/contact`, not `/`).
|
|
4
|
+
*/
|
|
5
|
+
function resolveSubmitUrl(url, location) {
|
|
6
|
+
return new URL(url, location.href);
|
|
7
|
+
}
|
|
1
8
|
/**
|
|
2
9
|
* Navigate after a successful HubSpot form submit.
|
|
3
10
|
* External absolute URLs use a full page navigation; same-origin paths use the Next.js router.
|
|
4
11
|
*/
|
|
5
12
|
export function navigateAfterSubmit(url, router, location = typeof window !== 'undefined'
|
|
6
13
|
? window.location
|
|
7
|
-
: { origin: 'http://localhost', assign: () => undefined }) {
|
|
14
|
+
: { origin: 'http://localhost', href: 'http://localhost/', assign: () => undefined }) {
|
|
8
15
|
try {
|
|
9
|
-
const parsed =
|
|
16
|
+
const parsed = resolveSubmitUrl(url, location);
|
|
10
17
|
if (parsed.origin !== location.origin) {
|
|
11
18
|
location.assign(parsed.href);
|
|
12
19
|
return;
|
|
@@ -17,4 +24,22 @@ export function navigateAfterSubmit(url, router, location = typeof window !== 'u
|
|
|
17
24
|
router.push(url);
|
|
18
25
|
}
|
|
19
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Hold the submit pending lock only when navigation will unmount this page:
|
|
29
|
+
* a different origin, or a different pathname. Same-path query/hash stays mounted.
|
|
30
|
+
*/
|
|
31
|
+
export function shouldHoldRedirectLock(url, location = typeof window !== 'undefined'
|
|
32
|
+
? window.location
|
|
33
|
+
: { origin: 'http://localhost', pathname: '/', href: 'http://localhost/' }) {
|
|
34
|
+
try {
|
|
35
|
+
const parsed = resolveSubmitUrl(url, location);
|
|
36
|
+
if (parsed.origin !== location.origin) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return parsed.pathname !== location.pathname;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return !url.startsWith('#');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
20
45
|
//# sourceMappingURL=navigateAfterSubmit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigateAfterSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/navigateAfterSubmit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,MAAwC,EACxC,QAAQ,
|
|
1
|
+
{"version":3,"file":"navigateAfterSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/navigateAfterSubmit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAW,EAAE,QAAgC;IACrE,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,MAAwC,EACxC,QAAQ,GAAiD,OAAO,MAAM,KAAK,WAAW;IACpF,CAAC,CAAC,MAAM,CAAC,QAAQ;IACjB,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;IAEtF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAW,EACX,QAAQ,GAAmD,OAAO,MAAM,KAAK,WAAW;IACtF,CAAC,CAAC,MAAM,CAAC,QAAQ;IACjB,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAE5E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { HubspotFieldResponse, HubspotFormDefinition } from '../types';
|
|
2
|
+
export declare const HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE = "Form submission failed. Please try again later.";
|
|
3
|
+
export declare const HUBSPOT_REDIRECT_PENDING_MS = 10000;
|
|
2
4
|
export interface UseHubspotSubmitOptions {
|
|
3
5
|
portalId: string;
|
|
4
6
|
formDefinition: HubspotFormDefinition;
|
|
@@ -9,17 +11,27 @@ export interface UseHubspotSubmitOptions {
|
|
|
9
11
|
* CMS success UIs (extraCopy) should swap state here; redirect still wins when configured.
|
|
10
12
|
*/
|
|
11
13
|
onSuccess?: (fields: Record<string, HubspotFieldResponse>) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Called when HubSpot rejects the submission or the request fails.
|
|
16
|
+
* Receives the package failure string (API error message when available).
|
|
17
|
+
* Does not run for the bot-timing short-circuit (that still calls `onSuccess`).
|
|
18
|
+
*/
|
|
19
|
+
onError?: (error: string) => void;
|
|
12
20
|
/**
|
|
13
21
|
* CMS override (e.g. externalUrl / data.successRedirectUrl). Evaluated first on success,
|
|
14
22
|
* before HubSpot submit redirectUri or form postSubmitAction.
|
|
15
23
|
*/
|
|
16
24
|
redirectUrlOverride?: string;
|
|
25
|
+
/** Visitor-facing error copy. Defaults to {@link HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE}. */
|
|
26
|
+
errorMessage?: string;
|
|
17
27
|
}
|
|
18
|
-
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, redirectUrlOverride, }: UseHubspotSubmitOptions): {
|
|
28
|
+
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, }: UseHubspotSubmitOptions): {
|
|
19
29
|
handleSubmit: (e: React.FormEvent) => void;
|
|
20
30
|
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
21
31
|
message: string | null;
|
|
22
32
|
formData: Record<string, HubspotFieldResponse>;
|
|
23
33
|
setFormData: import("react").Dispatch<import("react").SetStateAction<Record<string, HubspotFieldResponse>>>;
|
|
34
|
+
isSubmitting: boolean;
|
|
35
|
+
submitError: string | null;
|
|
24
36
|
};
|
|
25
37
|
//# sourceMappingURL=useHubspotSubmit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHubspotSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAI5E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAI5E,eAAO,MAAM,iCAAiC,oDAAoD,CAAC;AACnG,eAAO,MAAM,2BAA2B,QAAS,CAAC;AA2BlD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,YAAY,GACb,EAAE,uBAAuB;sBA+ElB,KAAK,CAAC,SAAS;2BA3ChB,KAAK,CAAC,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;;;;;;EA8JnF"}
|
|
@@ -1,14 +1,63 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useRouter } from 'next/navigation';
|
|
3
|
-
import { useCallback, useRef, useState } from 'react';
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
4
|
import { submitHubspotForm } from '../server/submitForm';
|
|
5
5
|
import { getCookieValue } from './getCookieValue';
|
|
6
|
-
import { navigateAfterSubmit } from './navigateAfterSubmit';
|
|
7
|
-
export
|
|
6
|
+
import { navigateAfterSubmit, shouldHoldRedirectLock } from './navigateAfterSubmit';
|
|
7
|
+
export const HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE = 'Form submission failed. Please try again later.';
|
|
8
|
+
export const HUBSPOT_REDIRECT_PENDING_MS = 10_000;
|
|
9
|
+
/**
|
|
10
|
+
* Same priority as post-submit handling: CMS override, then inline message (no
|
|
11
|
+
* redirect), then HubSpot redirectUri, then form redirect_url.
|
|
12
|
+
*/
|
|
13
|
+
function resolveRedirectAfterSuccess(result, formDefinition, redirectUrlOverride) {
|
|
14
|
+
const override = redirectUrlOverride?.trim();
|
|
15
|
+
if (override) {
|
|
16
|
+
return override;
|
|
17
|
+
}
|
|
18
|
+
if (result.data?.inlineMessage) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
if (result.data?.redirectUri) {
|
|
22
|
+
return result.data.redirectUri;
|
|
23
|
+
}
|
|
24
|
+
if (formDefinition.postSubmitAction.type === 'redirect_url') {
|
|
25
|
+
return formDefinition.postSubmitAction.value;
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, }) {
|
|
8
30
|
const router = useRouter();
|
|
31
|
+
const visitorError = errorMessage?.trim() || HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE;
|
|
9
32
|
const [formData, setFormData] = useState({});
|
|
10
33
|
const formStartTimeRef = useRef(0);
|
|
34
|
+
const submittingRef = useRef(false);
|
|
35
|
+
const pendingTimerRef = useRef(undefined);
|
|
36
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
11
37
|
const [message, setMessage] = useState(null);
|
|
38
|
+
const [submitError, setSubmitError] = useState(null);
|
|
39
|
+
const releasePending = useCallback(() => {
|
|
40
|
+
if (pendingTimerRef.current !== undefined) {
|
|
41
|
+
clearTimeout(pendingTimerRef.current);
|
|
42
|
+
pendingTimerRef.current = undefined;
|
|
43
|
+
}
|
|
44
|
+
submittingRef.current = false;
|
|
45
|
+
setIsSubmitting(false);
|
|
46
|
+
}, []);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
const onPageShow = (event) => {
|
|
49
|
+
if ('persisted' in event && event.persisted) {
|
|
50
|
+
releasePending();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
window.addEventListener('pageshow', onPageShow);
|
|
54
|
+
return () => {
|
|
55
|
+
window.removeEventListener('pageshow', onPageShow);
|
|
56
|
+
if (pendingTimerRef.current !== undefined) {
|
|
57
|
+
clearTimeout(pendingTimerRef.current);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}, [releasePending]);
|
|
12
61
|
const handleInputChange = (e) => {
|
|
13
62
|
if (formStartTimeRef.current === 0) {
|
|
14
63
|
formStartTimeRef.current = Date.now();
|
|
@@ -50,10 +99,23 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
50
99
|
};
|
|
51
100
|
const handleSubmit = useCallback((e) => {
|
|
52
101
|
e.preventDefault();
|
|
102
|
+
if (submittingRef.current) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
submittingRef.current = true;
|
|
106
|
+
setIsSubmitting(true);
|
|
107
|
+
setSubmitError(null);
|
|
53
108
|
const transformedFields = Object.values(formData).map((field) => ({
|
|
54
109
|
...field,
|
|
55
110
|
value: Array.isArray(field.value) ? field.value.join(';') : field.value,
|
|
56
111
|
}));
|
|
112
|
+
// Stay pending through a real page change so the button cannot be clicked
|
|
113
|
+
// again while the next page loads.
|
|
114
|
+
let stayPending = false;
|
|
115
|
+
const showSubmitError = () => {
|
|
116
|
+
setMessage(visitorError);
|
|
117
|
+
setSubmitError(visitorError);
|
|
118
|
+
};
|
|
57
119
|
submitHubspotForm(portalId, formDefinition.id, transformedFields, {
|
|
58
120
|
hutk: getCookieValue('hubspotutk'),
|
|
59
121
|
ipAddress,
|
|
@@ -62,36 +124,74 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
62
124
|
}, formStartTimeRef.current, Date.now())
|
|
63
125
|
.then((result) => {
|
|
64
126
|
if (result.failure) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
// Side-effect only — do not suppress default post-submit handling.
|
|
69
|
-
onSuccess?.(formData);
|
|
70
|
-
const override = redirectUrlOverride?.trim();
|
|
71
|
-
if (override) {
|
|
72
|
-
navigateAfterSubmit(override, router);
|
|
127
|
+
showSubmitError();
|
|
128
|
+
onError?.(result.failure);
|
|
73
129
|
return;
|
|
74
130
|
}
|
|
75
|
-
|
|
76
|
-
|
|
131
|
+
setSubmitError(null);
|
|
132
|
+
try {
|
|
133
|
+
onSuccess?.(formData);
|
|
77
134
|
}
|
|
78
|
-
|
|
79
|
-
|
|
135
|
+
catch {
|
|
136
|
+
// HubSpot already accepted; do not report a submit failure.
|
|
80
137
|
}
|
|
81
|
-
|
|
82
|
-
|
|
138
|
+
const redirectUrl = resolveRedirectAfterSuccess(result, formDefinition, redirectUrlOverride);
|
|
139
|
+
if (!redirectUrl) {
|
|
140
|
+
if (result.data?.inlineMessage) {
|
|
141
|
+
setMessage(result.data.inlineMessage);
|
|
142
|
+
}
|
|
143
|
+
else if (formDefinition.postSubmitAction.type === 'thank_you') {
|
|
144
|
+
setMessage(formDefinition.postSubmitAction.value);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
setMessage('Form submitted successfully');
|
|
148
|
+
}
|
|
149
|
+
return;
|
|
83
150
|
}
|
|
84
|
-
|
|
85
|
-
|
|
151
|
+
try {
|
|
152
|
+
if (shouldHoldRedirectLock(redirectUrl)) {
|
|
153
|
+
stayPending = true;
|
|
154
|
+
pendingTimerRef.current = setTimeout(releasePending, HUBSPOT_REDIRECT_PENDING_MS);
|
|
155
|
+
}
|
|
156
|
+
navigateAfterSubmit(redirectUrl, router);
|
|
86
157
|
}
|
|
87
|
-
|
|
88
|
-
|
|
158
|
+
catch {
|
|
159
|
+
stayPending = false;
|
|
160
|
+
showSubmitError();
|
|
161
|
+
onError?.(visitorError);
|
|
162
|
+
releasePending();
|
|
89
163
|
}
|
|
90
164
|
})
|
|
91
165
|
.catch(() => {
|
|
92
|
-
|
|
166
|
+
showSubmitError();
|
|
167
|
+
onError?.(visitorError);
|
|
168
|
+
})
|
|
169
|
+
.finally(() => {
|
|
170
|
+
if (stayPending && submittingRef.current) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
releasePending();
|
|
93
174
|
});
|
|
94
|
-
}, [
|
|
95
|
-
|
|
175
|
+
}, [
|
|
176
|
+
formData,
|
|
177
|
+
formDefinition,
|
|
178
|
+
ipAddress,
|
|
179
|
+
onError,
|
|
180
|
+
onSuccess,
|
|
181
|
+
portalId,
|
|
182
|
+
redirectUrlOverride,
|
|
183
|
+
releasePending,
|
|
184
|
+
router,
|
|
185
|
+
visitorError,
|
|
186
|
+
]);
|
|
187
|
+
return {
|
|
188
|
+
handleSubmit,
|
|
189
|
+
handleInputChange,
|
|
190
|
+
message,
|
|
191
|
+
formData,
|
|
192
|
+
setFormData,
|
|
193
|
+
isSubmitting,
|
|
194
|
+
submitError,
|
|
195
|
+
};
|
|
96
196
|
}
|
|
97
197
|
//# sourceMappingURL=useHubspotSubmit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHubspotSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HubspotFormSubmissionResponse } from '../types';
|
|
2
|
+
export declare const HUBSPOT_SUBMIT_FAILURE_MESSAGE = "error submitting form";
|
|
3
|
+
/**
|
|
4
|
+
* HubSpot Forms API v3 error payloads use `status: "error"` and/or `errors[]`
|
|
5
|
+
* (typically with HTTP 400). Also treat a 2xx body with those fields as failure.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isHubspotErrorPayload(body: unknown): boolean;
|
|
8
|
+
export declare function messageFromHubspotBody(body: unknown, fallback: string): string;
|
|
9
|
+
export declare function evaluateHubspotSubmitResponse(response: {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
status: number;
|
|
12
|
+
}, body: unknown): {
|
|
13
|
+
failure: string;
|
|
14
|
+
} | {
|
|
15
|
+
data: HubspotFormSubmissionResponse;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=evaluateSubmitResponse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluateSubmitResponse.d.ts","sourceRoot":"","sources":["../../../src/forms/server/evaluateSubmitResponse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAE9D,eAAO,MAAM,8BAA8B,0BAA0B,CAAC;AAMtE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAQ5D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB9E;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACzC,IAAI,EAAE,OAAO,GACZ;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,6BAA6B,CAAA;CAAE,CAQ/D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const HUBSPOT_SUBMIT_FAILURE_MESSAGE = 'error submitting form';
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* HubSpot Forms API v3 error payloads use `status: "error"` and/or `errors[]`
|
|
7
|
+
* (typically with HTTP 400). Also treat a 2xx body with those fields as failure.
|
|
8
|
+
*/
|
|
9
|
+
export function isHubspotErrorPayload(body) {
|
|
10
|
+
if (!isRecord(body)) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (body.status === 'error') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return Array.isArray(body.errors) && body.errors.length > 0;
|
|
17
|
+
}
|
|
18
|
+
export function messageFromHubspotBody(body, fallback) {
|
|
19
|
+
if (!isRecord(body)) {
|
|
20
|
+
return fallback;
|
|
21
|
+
}
|
|
22
|
+
if (Array.isArray(body.errors)) {
|
|
23
|
+
for (const entry of body.errors) {
|
|
24
|
+
if (isRecord(entry) && typeof entry.message === 'string' && entry.message.trim()) {
|
|
25
|
+
return entry.message;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (typeof body.message === 'string' && body.message.trim()) {
|
|
30
|
+
return body.message;
|
|
31
|
+
}
|
|
32
|
+
return fallback;
|
|
33
|
+
}
|
|
34
|
+
export function evaluateHubspotSubmitResponse(response, body) {
|
|
35
|
+
if (!response.ok || isHubspotErrorPayload(body)) {
|
|
36
|
+
return {
|
|
37
|
+
failure: messageFromHubspotBody(body, HUBSPOT_SUBMIT_FAILURE_MESSAGE),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return { data: isRecord(body) ? body : {} };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=evaluateSubmitResponse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluateSubmitResponse.js","sourceRoot":"","sources":["../../../src/forms/server/evaluateSubmitResponse.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,8BAA8B,GAAG,uBAAuB,CAAC;AAEtE,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAa,EAAE,QAAgB;IACpE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjF,OAAO,KAAK,CAAC,OAAO,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAyC,EACzC,IAAa;IAEb,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,sBAAsB,CAAC,IAAI,EAAE,8BAA8B,CAAC;SACtE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAsC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACjF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submitForm.d.ts","sourceRoot":"","sources":["../../../src/forms/server/submitForm.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"submitForm.d.ts","sourceRoot":"","sources":["../../../src/forms/server/submitForm.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,UAAU,CAAC;AAMlB,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,6BAA6B,CAAC;CACtC;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,oBAAoB,EAAE,EAC9B,OAAO,EAAE,kBAAkB,EAC3B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAqClC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
'use server';
|
|
2
|
+
import { evaluateHubspotSubmitResponse, HUBSPOT_SUBMIT_FAILURE_MESSAGE, } from './evaluateSubmitResponse';
|
|
2
3
|
export async function submitHubspotForm(portalId, formId, fields, context, formStartTime, formEndTime) {
|
|
3
4
|
if (!portalId) {
|
|
4
5
|
return { failure: 'no portal ID' };
|
|
@@ -20,11 +21,17 @@ export async function submitHubspotForm(portalId, formId, fields, context, formS
|
|
|
20
21
|
});
|
|
21
22
|
// Preserve full redirectUri (including external hosts such as Vimeo / meetings).
|
|
22
23
|
// Client navigates with window.location for cross-origin, router.push for same-origin.
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
let body;
|
|
25
|
+
try {
|
|
26
|
+
body = await response.json();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { failure: HUBSPOT_SUBMIT_FAILURE_MESSAGE };
|
|
30
|
+
}
|
|
31
|
+
return evaluateHubspotSubmitResponse(response, body);
|
|
25
32
|
}
|
|
26
33
|
catch {
|
|
27
|
-
return { failure:
|
|
34
|
+
return { failure: HUBSPOT_SUBMIT_FAILURE_MESSAGE };
|
|
28
35
|
}
|
|
29
36
|
}
|
|
30
37
|
//# sourceMappingURL=submitForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submitForm.js","sourceRoot":"","sources":["../../../src/forms/server/submitForm.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"submitForm.js","sourceRoot":"","sources":["../../../src/forms/server/submitForm.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAOb,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAQlC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,MAAc,EACd,MAA8B,EAC9B,OAA2B,EAC3B,aAAqB,EACrB,WAAmB;IAEnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,aAAa,GAAG,WAAW,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,GAAG,aAAa,GAAG,IAAI,EAAE,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,6DAA6D,QAAQ,IAAI,MAAM,EAAE,EACjF;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;SAC1C,CACF,CAAC;QACF,iFAAiF;QACjF,uFAAuF;QACvF,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QACrD,CAAC;QAED,OAAO,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;IACrD,CAAC;AACH,CAAC"}
|
package/dist/forms/types.d.ts
CHANGED
|
@@ -77,6 +77,10 @@ export interface HubspotFormExternalData {
|
|
|
77
77
|
formId: string;
|
|
78
78
|
portalId?: string;
|
|
79
79
|
submitButtonText?: string;
|
|
80
|
+
/** Pending submit button label. Optional JSON `data` key — not a Contentful field. */
|
|
81
|
+
submittingButtonText?: string;
|
|
82
|
+
/** Visitor-facing submit error. Optional JSON `data` key — not a Contentful field. */
|
|
83
|
+
submitErrorText?: string;
|
|
80
84
|
widthPercentage?: number;
|
|
81
85
|
hiddenFields?: Record<string, string>;
|
|
82
86
|
initialValues?: Record<string, string>;
|
|
@@ -96,6 +100,7 @@ export interface HubspotFormClassNames {
|
|
|
96
100
|
radioLabel?: string;
|
|
97
101
|
submitButton?: string;
|
|
98
102
|
message?: string;
|
|
103
|
+
error?: string;
|
|
99
104
|
legalConsent?: string;
|
|
100
105
|
richText?: string;
|
|
101
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
|
package/docs/llms.md
CHANGED
|
@@ -13,8 +13,21 @@
|
|
|
13
13
|
- `externalComponentType`: `"Hubspot form"`
|
|
14
14
|
- `data.formId` (required): HubSpot form GUID
|
|
15
15
|
- `data.portalId` (optional): defaults to `HUBSPOT_PORTAL_ID`
|
|
16
|
+
- `data.submitButtonText` / `data.submittingButtonText` / `data.submitErrorText` (optional JSON keys, not Contentful fields). Renderer options supply site-level defaults; `data` wins. Blank/whitespace values are treated as unset.
|
|
16
17
|
- Hidden UTM fields: `HubspotDynamicForm` auto-fills empty hidden fields from URL query + first-touch `sessionStorage` (`utm_source`, etc.). CMS `hiddenFields` override. Forks should import `buildDefaultValues` / `applyMarketingParamsToHiddenFields` rather than reimplementing.
|
|
17
18
|
|
|
19
|
+
## Forms: brand, submit path, and failure behaviour
|
|
20
|
+
|
|
21
|
+
Policy (`docs/PHILOSOPHY.md` R7.6). Implementation gaps are tracked as se-core #187 (status/error handling) and related issues.
|
|
22
|
+
|
|
23
|
+
- Render with our form components (`HubspotDynamicForm` / `createHubspotFormExternalRenderer`), not the HubSpot embed script. Submit server-side via `submitHubspotForm`.
|
|
24
|
+
- Check HubSpot's HTTP/response status. On failure, show the user an error, fire `form_error`, and do not treat the submit as success.
|
|
25
|
+
- Block double submits while a request is in flight.
|
|
26
|
+
- Anti-bot (no typing, or under 3 seconds): record that a submission was skipped; do not return a silent fake success with no telemetry.
|
|
27
|
+
- Known site gaps (e.g. HSD still on embed) get filled toward this path.
|
|
28
|
+
|
|
29
|
+
Standard analytics names for the form lifecycle: `form_view`, `form_start`, `form_submit`, `form_error` — see `packages/core-ui/ANALYTICS.md`.
|
|
30
|
+
|
|
18
31
|
## Post-submit
|
|
19
32
|
|
|
20
33
|
Not native HubSpot embed — client must handle redirect/thank-you.
|
|
@@ -24,12 +37,17 @@ Priority: `redirectUrlOverride` → submit `redirectUri` → form `postSubmitAct
|
|
|
24
37
|
- External URLs → `window.location.assign` (via `navigateAfterSubmit`)
|
|
25
38
|
- Same-origin → `router.push`
|
|
26
39
|
- `onSuccess` is a **side-effect only** — does not suppress redirect/thank-you
|
|
40
|
+
- `onError` is optional; HubSpot `!ok` / `status: "error"` / `errors[]` are failures (not thank-you)
|
|
41
|
+
- `useHubspotSubmit` returns `isSubmitting` and `submitError`; the standard form disables submit while in flight
|
|
42
|
+
- Pending lock after redirect only when origin or pathname changes; 10s timeout (re-enables if navigation is slower), `pageshow` (bfcache), and navigation errors release it
|
|
43
|
+
- `submittingButtonText` / `submitErrorText` override English defaults; pass from CMS `data` or renderer options
|
|
44
|
+
- Do not send field values or raw `onError` text to analytics
|
|
27
45
|
- Preserve full `redirectUri` from HubSpot (do not strip host)
|
|
28
46
|
|
|
29
47
|
```tsx
|
|
30
|
-
useHubspotSubmit({ portalId, formDefinition, onSuccess, redirectUrlOverride })
|
|
48
|
+
useHubspotSubmit({ portalId, formDefinition, onSuccess, onError, redirectUrlOverride, errorMessage })
|
|
31
49
|
// or
|
|
32
|
-
<HubspotDynamicForm redirectUrlOverride={url} onSuccess={fn}
|
|
50
|
+
<HubspotDynamicForm submittingButtonText={…} submitErrorText={…} redirectUrlOverride={url} onSuccess={fn} onError={fn} />
|
|
33
51
|
```
|
|
34
52
|
|
|
35
53
|
After HubSpot form editor changes, revalidate: `revalidateTag(hubspotFormTag(formId), { expire: 0 })` (definitions cached ~1h). Do not use `'max'` — that is stale-while-revalidate.
|