@se-studio/hubspot 17.0.28 → 17.2.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 +12 -0
- package/README.md +14 -1
- package/dist/external/createHubspotFormExternalRenderer.d.ts +6 -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 +16 -1
- package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -1
- package/dist/forms/client/HubspotDynamicForm.js +7 -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 +19 -2
- package/dist/forms/client/useHubspotSubmit.d.ts.map +1 -1
- package/dist/forms/client/useHubspotSubmit.js +140 -25
- 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 +14 -11
- package/dist/forms/server/submitForm.js.map +1 -1
- package/dist/forms/submitGuard.d.ts +9 -0
- package/dist/forms/submitGuard.d.ts.map +1 -0
- package/dist/forms/submitGuard.js +14 -0
- package/dist/forms/submitGuard.js.map +1 -0
- package/dist/forms/types.d.ts +11 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -0
- package/dist/server.js.map +1 -1
- package/docs/llms.md +22 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @se-studio/hubspot
|
|
2
2
|
|
|
3
|
+
## 17.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Stop treating the HubSpot form anti-bot timing guard as a successful submit. Too-fast submissions still do not POST to HubSpot, but they now return a failure so visitors see a retry message (default "Please wait a moment and try again.") with their fields intact instead of a fake thank-you. The wait copy is overridable via `submitTooFastText` / CMS `data.submitTooFastText`, falling back to `submitErrorText`, then the English default. Public exports: `HUBSPOT_MIN_SUBMIT_MS`, `HUBSPOT_SUBMIT_TOO_FAST_MESSAGE`, `isHubspotSubmitTooFast`.
|
|
8
|
+
|
|
9
|
+
## 17.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 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.
|
|
14
|
+
|
|
3
15
|
## 17.0.28
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -60,6 +60,9 @@ 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",
|
|
65
|
+
"submitTooFastText": "Optional wait-and-retry copy",
|
|
63
66
|
"hiddenFields": { "campaign": "value" }
|
|
64
67
|
}
|
|
65
68
|
```
|
|
@@ -77,6 +80,10 @@ export const HubspotFormRegistration = defineExternalComponent({
|
|
|
77
80
|
{children}
|
|
78
81
|
</Section>
|
|
79
82
|
),
|
|
83
|
+
// Optional site-level defaults; CMS `data.submittingButtonText` / `data.submitErrorText` / `data.submitTooFastText` win
|
|
84
|
+
submittingButtonText: 'Sending…',
|
|
85
|
+
submitErrorText: 'Please try again later.',
|
|
86
|
+
submitTooFastText: 'Please wait a moment and try again.',
|
|
80
87
|
}),
|
|
81
88
|
});
|
|
82
89
|
```
|
|
@@ -123,14 +130,20 @@ These forms are **not** HubSpot’s native embed script — the package rebuilds
|
|
|
123
130
|
|
|
124
131
|
**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
132
|
|
|
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.
|
|
133
|
+
**`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.
|
|
134
|
+
|
|
135
|
+
**`onError`:** optional. HubSpot HTTP errors (`!ok`, `status: "error"`, or `errors[]`) and anti-bot timing skips fail the submit instead of showing a thank-you. The standard form disables the submit button while in flight (`isSubmitting`), shows `submitErrorText` or `submitTooFastText` (default English), and keeps field values so the visitor can retry. Pass `submittingButtonText` / `submitErrorText` / `submitTooFastText` on `HubspotDynamicForm`, or via CMS JSON `data` / renderer options — not new Contentful fields. Too-fast copy: `submitTooFastText` → `submitErrorText` → `Please wait a moment and try again.` 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` / `submitTooFastText` 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
136
|
|
|
128
137
|
```tsx
|
|
129
138
|
<HubspotDynamicForm
|
|
130
139
|
portalId={portalId}
|
|
131
140
|
formDefinition={formDefinition}
|
|
132
141
|
redirectUrlOverride={cmsExternalUrl} // optional CMS override
|
|
142
|
+
submittingButtonText="Sending…" // optional; default "Submitting…"
|
|
143
|
+
submitErrorText="Please try again later." // optional
|
|
144
|
+
submitTooFastText="Please wait a moment and try again." // optional
|
|
133
145
|
onSuccess={() => setShowExtraCopy(true)} // optional; redirect still runs if set
|
|
146
|
+
onError={() => reportFormError('hubspot_submit_failed')} // coarse category only
|
|
134
147
|
/>
|
|
135
148
|
```
|
|
136
149
|
|
|
@@ -13,6 +13,12 @@ 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;
|
|
20
|
+
/** Default too-fast copy when CMS `data.submitTooFastText` is unset. */
|
|
21
|
+
submitTooFastText?: string;
|
|
16
22
|
}
|
|
17
23
|
/**
|
|
18
24
|
* 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;IACzB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;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,CAkCtC"}
|
|
@@ -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, submitTooFastText: data.submitTooFastText?.trim() || options.submitTooFastText, 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;AAsB7E;;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,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,iBAAiB,EAC9E,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,25 @@ 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, the request fails, or the anti-bot
|
|
23
|
+
* timer skips the POST. 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;
|
|
34
|
+
/**
|
|
35
|
+
* Visitor-facing copy when the anti-bot timer skips the POST.
|
|
36
|
+
* Default: {@link HUBSPOT_SUBMIT_TOO_FAST_MESSAGE}. Falls back to `submitErrorText`
|
|
37
|
+
* when this prop is unset.
|
|
38
|
+
*/
|
|
39
|
+
submitTooFastText?: string;
|
|
25
40
|
}
|
|
26
|
-
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, redirectUrlOverride, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
41
|
+
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, submitTooFastText, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
27
42
|
//# 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;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;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,EACf,iBAAiB,GAClB,EAAE,uBAAuB,+BA+HzB"}
|
|
@@ -79,14 +79,17 @@ 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, submitTooFastText, }) {
|
|
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,
|
|
92
|
+
tooFastMessage: submitTooFastText?.trim() || undefined,
|
|
90
93
|
});
|
|
91
94
|
useEffect(() => {
|
|
92
95
|
setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
|
|
@@ -108,6 +111,7 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
108
111
|
});
|
|
109
112
|
}, [classNames, dependentFieldsMap, formData, handleInputChange, visibleFields]);
|
|
110
113
|
const buttonText = submitButtonText ?? formDefinition.submitButtonText;
|
|
111
|
-
|
|
114
|
+
const pendingButtonText = submittingButtonText?.trim() || 'Submitting…';
|
|
115
|
+
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
116
|
}
|
|
113
117
|
//# sourceMappingURL=HubspotDynamicForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"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
|
|
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,25 +1,42 @@
|
|
|
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;
|
|
5
7
|
ipAddress?: string;
|
|
6
8
|
/**
|
|
7
|
-
* Called after
|
|
9
|
+
* Called after HubSpot accepts the submission.
|
|
8
10
|
* Side-effect only — does not suppress HubSpot thank-you or redirect handling.
|
|
9
11
|
* CMS success UIs (extraCopy) should swap state here; redirect still wins when configured.
|
|
12
|
+
* Not called when the anti-bot timer skips the POST.
|
|
10
13
|
*/
|
|
11
14
|
onSuccess?: (fields: Record<string, HubspotFieldResponse>) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Called when HubSpot rejects the submission, the request fails, or the anti-bot
|
|
17
|
+
* timer skips the POST. Receives the package failure string.
|
|
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;
|
|
27
|
+
/**
|
|
28
|
+
* Visitor-facing too-fast copy. Defaults to {@link HUBSPOT_SUBMIT_TOO_FAST_MESSAGE}.
|
|
29
|
+
* When unset, `errorMessage` (CMS `submitErrorText`) is used if present.
|
|
30
|
+
*/
|
|
31
|
+
tooFastMessage?: string;
|
|
17
32
|
}
|
|
18
|
-
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, redirectUrlOverride, }: UseHubspotSubmitOptions): {
|
|
33
|
+
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, }: UseHubspotSubmitOptions): {
|
|
19
34
|
handleSubmit: (e: React.FormEvent) => void;
|
|
20
35
|
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
21
36
|
message: string | null;
|
|
22
37
|
formData: Record<string, HubspotFieldResponse>;
|
|
23
38
|
setFormData: import("react").Dispatch<import("react").SetStateAction<Record<string, HubspotFieldResponse>>>;
|
|
39
|
+
isSubmitting: boolean;
|
|
40
|
+
submitError: string | null;
|
|
24
41
|
};
|
|
25
42
|
//# sourceMappingURL=useHubspotSubmit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHubspotSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"AAMA,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;;;;;OAKG;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;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,EAAE,uBAAuB;sBAoFlB,KAAK,CAAC,SAAS;2BA3ChB,KAAK,CAAC,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;;;;;;EA0KnF"}
|
|
@@ -1,16 +1,70 @@
|
|
|
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
|
+
import { HUBSPOT_SUBMIT_TOO_FAST_MESSAGE } from '../submitGuard';
|
|
5
6
|
import { getCookieValue } from './getCookieValue';
|
|
6
|
-
import { navigateAfterSubmit } from './navigateAfterSubmit';
|
|
7
|
-
export
|
|
7
|
+
import { navigateAfterSubmit, shouldHoldRedirectLock } from './navigateAfterSubmit';
|
|
8
|
+
export const HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE = 'Form submission failed. Please try again later.';
|
|
9
|
+
export const HUBSPOT_REDIRECT_PENDING_MS = 10_000;
|
|
10
|
+
/**
|
|
11
|
+
* Same priority as post-submit handling: CMS override, then inline message (no
|
|
12
|
+
* redirect), then HubSpot redirectUri, then form redirect_url.
|
|
13
|
+
*/
|
|
14
|
+
function resolveRedirectAfterSuccess(result, formDefinition, redirectUrlOverride) {
|
|
15
|
+
const override = redirectUrlOverride?.trim();
|
|
16
|
+
if (override) {
|
|
17
|
+
return override;
|
|
18
|
+
}
|
|
19
|
+
if (result.data?.inlineMessage) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
if (result.data?.redirectUri) {
|
|
23
|
+
return result.data.redirectUri;
|
|
24
|
+
}
|
|
25
|
+
if (formDefinition.postSubmitAction.type === 'redirect_url') {
|
|
26
|
+
return formDefinition.postSubmitAction.value;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, }) {
|
|
8
31
|
const router = useRouter();
|
|
32
|
+
const visitorError = errorMessage?.trim() || HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE;
|
|
33
|
+
const visitorTooFast = tooFastMessage?.trim() || errorMessage?.trim() || HUBSPOT_SUBMIT_TOO_FAST_MESSAGE;
|
|
9
34
|
const [formData, setFormData] = useState({});
|
|
10
|
-
const formStartTimeRef = useRef(
|
|
35
|
+
const formStartTimeRef = useRef(undefined);
|
|
36
|
+
if (formStartTimeRef.current === undefined) {
|
|
37
|
+
formStartTimeRef.current = Date.now();
|
|
38
|
+
}
|
|
39
|
+
const submittingRef = useRef(false);
|
|
40
|
+
const pendingTimerRef = useRef(undefined);
|
|
41
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
11
42
|
const [message, setMessage] = useState(null);
|
|
43
|
+
const [submitError, setSubmitError] = useState(null);
|
|
44
|
+
const releasePending = useCallback(() => {
|
|
45
|
+
if (pendingTimerRef.current !== undefined) {
|
|
46
|
+
clearTimeout(pendingTimerRef.current);
|
|
47
|
+
pendingTimerRef.current = undefined;
|
|
48
|
+
}
|
|
49
|
+
submittingRef.current = false;
|
|
50
|
+
setIsSubmitting(false);
|
|
51
|
+
}, []);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const onPageShow = (event) => {
|
|
54
|
+
if ('persisted' in event && event.persisted) {
|
|
55
|
+
releasePending();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
window.addEventListener('pageshow', onPageShow);
|
|
59
|
+
return () => {
|
|
60
|
+
window.removeEventListener('pageshow', onPageShow);
|
|
61
|
+
if (pendingTimerRef.current !== undefined) {
|
|
62
|
+
clearTimeout(pendingTimerRef.current);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}, [releasePending]);
|
|
12
66
|
const handleInputChange = (e) => {
|
|
13
|
-
if (formStartTimeRef.current === 0) {
|
|
67
|
+
if (formStartTimeRef.current === undefined || formStartTimeRef.current === 0) {
|
|
14
68
|
formStartTimeRef.current = Date.now();
|
|
15
69
|
}
|
|
16
70
|
const { name, value, type } = e.target;
|
|
@@ -50,48 +104,109 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
50
104
|
};
|
|
51
105
|
const handleSubmit = useCallback((e) => {
|
|
52
106
|
e.preventDefault();
|
|
107
|
+
if (submittingRef.current) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
submittingRef.current = true;
|
|
111
|
+
setIsSubmitting(true);
|
|
112
|
+
setSubmitError(null);
|
|
53
113
|
const transformedFields = Object.values(formData).map((field) => ({
|
|
54
114
|
...field,
|
|
55
115
|
value: Array.isArray(field.value) ? field.value.join(';') : field.value,
|
|
56
116
|
}));
|
|
117
|
+
// Stay pending through a real page change so the button cannot be clicked
|
|
118
|
+
// again while the next page loads.
|
|
119
|
+
let stayPending = false;
|
|
120
|
+
const showSubmitError = (displayMessage) => {
|
|
121
|
+
const text = displayMessage?.trim() || visitorError;
|
|
122
|
+
setMessage(text);
|
|
123
|
+
setSubmitError(text);
|
|
124
|
+
};
|
|
125
|
+
const formStartTime = formStartTimeRef.current ?? Date.now();
|
|
126
|
+
formStartTimeRef.current = formStartTime;
|
|
57
127
|
submitHubspotForm(portalId, formDefinition.id, transformedFields, {
|
|
58
128
|
hutk: getCookieValue('hubspotutk'),
|
|
59
129
|
ipAddress,
|
|
60
130
|
pageUri: window.location.href,
|
|
61
131
|
pageName: document.title,
|
|
62
|
-
},
|
|
132
|
+
}, formStartTime, Date.now())
|
|
63
133
|
.then((result) => {
|
|
64
134
|
if (result.failure) {
|
|
65
|
-
|
|
135
|
+
const tooFast = result.failure === HUBSPOT_SUBMIT_TOO_FAST_MESSAGE;
|
|
136
|
+
showSubmitError(tooFast ? visitorTooFast : undefined);
|
|
137
|
+
onError?.(tooFast ? visitorTooFast : result.failure);
|
|
66
138
|
return;
|
|
67
139
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (override) {
|
|
72
|
-
navigateAfterSubmit(override, router);
|
|
140
|
+
if (result.data === undefined) {
|
|
141
|
+
showSubmitError(visitorTooFast);
|
|
142
|
+
onError?.(visitorTooFast);
|
|
73
143
|
return;
|
|
74
144
|
}
|
|
75
|
-
|
|
76
|
-
|
|
145
|
+
setSubmitError(null);
|
|
146
|
+
try {
|
|
147
|
+
onSuccess?.(formData);
|
|
77
148
|
}
|
|
78
|
-
|
|
79
|
-
|
|
149
|
+
catch {
|
|
150
|
+
// HubSpot already accepted; do not report a submit failure.
|
|
80
151
|
}
|
|
81
|
-
|
|
82
|
-
|
|
152
|
+
const redirectUrl = resolveRedirectAfterSuccess(result, formDefinition, redirectUrlOverride);
|
|
153
|
+
if (!redirectUrl) {
|
|
154
|
+
if (result.data?.inlineMessage) {
|
|
155
|
+
setMessage(result.data.inlineMessage);
|
|
156
|
+
}
|
|
157
|
+
else if (formDefinition.postSubmitAction.type === 'thank_you') {
|
|
158
|
+
setMessage(formDefinition.postSubmitAction.value);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
setMessage('Form submitted successfully');
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
83
164
|
}
|
|
84
|
-
|
|
85
|
-
|
|
165
|
+
try {
|
|
166
|
+
if (shouldHoldRedirectLock(redirectUrl)) {
|
|
167
|
+
stayPending = true;
|
|
168
|
+
pendingTimerRef.current = setTimeout(releasePending, HUBSPOT_REDIRECT_PENDING_MS);
|
|
169
|
+
}
|
|
170
|
+
navigateAfterSubmit(redirectUrl, router);
|
|
86
171
|
}
|
|
87
|
-
|
|
88
|
-
|
|
172
|
+
catch {
|
|
173
|
+
stayPending = false;
|
|
174
|
+
showSubmitError();
|
|
175
|
+
onError?.(visitorError);
|
|
176
|
+
releasePending();
|
|
89
177
|
}
|
|
90
178
|
})
|
|
91
179
|
.catch(() => {
|
|
92
|
-
|
|
180
|
+
showSubmitError();
|
|
181
|
+
onError?.(visitorError);
|
|
182
|
+
})
|
|
183
|
+
.finally(() => {
|
|
184
|
+
if (stayPending && submittingRef.current) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
releasePending();
|
|
93
188
|
});
|
|
94
|
-
}, [
|
|
95
|
-
|
|
189
|
+
}, [
|
|
190
|
+
formData,
|
|
191
|
+
formDefinition,
|
|
192
|
+
ipAddress,
|
|
193
|
+
onError,
|
|
194
|
+
onSuccess,
|
|
195
|
+
portalId,
|
|
196
|
+
redirectUrlOverride,
|
|
197
|
+
releasePending,
|
|
198
|
+
router,
|
|
199
|
+
visitorError,
|
|
200
|
+
visitorTooFast,
|
|
201
|
+
]);
|
|
202
|
+
return {
|
|
203
|
+
handleSubmit,
|
|
204
|
+
handleInputChange,
|
|
205
|
+
message,
|
|
206
|
+
formData,
|
|
207
|
+
setFormData,
|
|
208
|
+
isSubmitting,
|
|
209
|
+
submitError,
|
|
210
|
+
};
|
|
96
211
|
}
|
|
97
212
|
//# 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":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpF,MAAM,CAAC,MAAM,iCAAiC,GAAG,iDAAiD,CAAC;AACnG,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAElD;;;GAGG;AACH,SAAS,2BAA2B,CAClC,MAAmE,EACnE,cAAqC,EACrC,mBAA4B;IAE5B,MAAM,QAAQ,GAAG,mBAAmB,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;IACjC,CAAC;IACD,IAAI,cAAc,CAAC,gBAAgB,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5D,OAAO,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAgCD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACU;IACxB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,YAAY,EAAE,IAAI,EAAE,IAAI,iCAAiC,CAAC;IAC/E,MAAM,cAAc,GAClB,cAAc,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,IAAI,EAAE,IAAI,+BAA+B,CAAC;IACpF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAuC,EAAE,CAAC,CAAC;IACnF,MAAM,gBAAgB,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IAC/D,IAAI,gBAAgB,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3C,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,eAAe,GAAG,MAAM,CAA4C,SAAS,CAAC,CAAC;IACrF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEpE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,eAAe,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1C,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;QAC9B,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,EAAE;YAClC,IAAI,WAAW,IAAI,KAAK,IAAK,KAA6B,CAAC,SAAS,EAAE,CAAC;gBACrE,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACnD,IAAI,eAAe,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1C,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,MAAM,iBAAiB,GAAG,CACxB,CAAgF,EAChF,EAAE;QACF,IAAI,gBAAgB,CAAC,OAAO,KAAK,SAAS,IAAI,gBAAgB,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC7E,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;QACvC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;QAExE,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,OAAO,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC;YACvD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;YAEjE,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC9B,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;oBACnB,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;wBAC3C,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,OAAO;wBACL,GAAG,IAAI;wBACP,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE;qBAC9C,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;oBACnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;oBAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrE,MAAM,QAAQ,GAAG,OAAO;wBACtB,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,KAAK,CAAC;wBAC1B,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;oBAC5C,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;gBACtE,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACrB,GAAG,IAAI;gBACP,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE;aACtC,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,CAAkB,EAAE,EAAE;QACrB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,cAAc,CAAC,IAAI,CAAC,CAAC;QAErB,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChE,GAAG,KAAK;YACR,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;SACxE,CAAC,CAAC,CAAC;QAEJ,0EAA0E;QAC1E,mCAAmC;QACnC,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,MAAM,eAAe,GAAG,CAAC,cAAuB,EAAE,EAAE;YAClD,MAAM,IAAI,GAAG,cAAc,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC;YACpD,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7D,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;QAEzC,iBAAiB,CACf,QAAQ,EACR,cAAc,CAAC,EAAE,EACjB,iBAAiB,EACjB;YACE,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC;YAClC,SAAS;YACT,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;YAC7B,QAAQ,EAAE,QAAQ,CAAC,KAAK;SACzB,EACD,aAAa,EACb,IAAI,CAAC,GAAG,EAAE,CACX;aACE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,+BAA+B,CAAC;gBACnE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACtD,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,eAAe,CAAC,cAAc,CAAC,CAAC;gBAChC,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,cAAc,CAAC,IAAI,CAAC,CAAC;YAErB,IAAI,CAAC;gBACH,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;YAED,MAAM,WAAW,GAAG,2BAA2B,CAC7C,MAAM,EACN,cAAc,EACd,mBAAmB,CACpB,CAAC;YACF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;oBAC/B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACxC,CAAC;qBAAM,IAAI,cAAc,CAAC,gBAAgB,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAChE,UAAU,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,6BAA6B,CAAC,CAAC;gBAC5C,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;oBACxC,WAAW,GAAG,IAAI,CAAC;oBACnB,eAAe,CAAC,OAAO,GAAG,UAAU,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;gBACpF,CAAC;gBACD,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,GAAG,KAAK,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;gBACxB,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,eAAe,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,WAAW,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBACzC,OAAO;YACT,CAAC;YACD,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC,EACD;QACE,QAAQ;QACR,cAAc;QACd,SAAS;QACT,OAAO;QACP,SAAS;QACT,QAAQ;QACR,mBAAmB;QACnB,cAAc;QACd,MAAM;QACN,YAAY;QACZ,cAAc;KACf,CACF,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,iBAAiB;QACjB,OAAO;QACP,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"submitForm.d.ts","sourceRoot":"","sources":["../../../src/forms/server/submitForm.ts"],"names":[],"mappings":"AAGA,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,CAgClC"}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
'use server';
|
|
2
|
+
import { HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast } from '../submitGuard';
|
|
3
|
+
import { evaluateHubspotSubmitResponse, HUBSPOT_SUBMIT_FAILURE_MESSAGE, } from './evaluateSubmitResponse';
|
|
2
4
|
export async function submitHubspotForm(portalId, formId, fields, context, formStartTime, formEndTime) {
|
|
3
5
|
if (!portalId) {
|
|
4
6
|
return { failure: 'no portal ID' };
|
|
5
7
|
}
|
|
6
|
-
if (formStartTime
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (formStartTime > formEndTime) {
|
|
10
|
-
return { success: true };
|
|
11
|
-
}
|
|
12
|
-
if (formEndTime - formStartTime < 3000) {
|
|
13
|
-
return { success: true };
|
|
8
|
+
if (isHubspotSubmitTooFast(formStartTime, formEndTime)) {
|
|
9
|
+
console.info('[hubspot] skipped form submit: anti-bot timing guard');
|
|
10
|
+
return { failure: HUBSPOT_SUBMIT_TOO_FAST_MESSAGE };
|
|
14
11
|
}
|
|
15
12
|
try {
|
|
16
13
|
const response = await fetch(`https://api.hsforms.com/submissions/v3/integration/submit/${portalId}/${formId}`, {
|
|
@@ -20,11 +17,17 @@ export async function submitHubspotForm(portalId, formId, fields, context, formS
|
|
|
20
17
|
});
|
|
21
18
|
// Preserve full redirectUri (including external hosts such as Vimeo / meetings).
|
|
22
19
|
// Client navigates with window.location for cross-origin, router.push for same-origin.
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
let body;
|
|
21
|
+
try {
|
|
22
|
+
body = await response.json();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { failure: HUBSPOT_SUBMIT_FAILURE_MESSAGE };
|
|
26
|
+
}
|
|
27
|
+
return evaluateHubspotSubmitResponse(response, body);
|
|
25
28
|
}
|
|
26
29
|
catch {
|
|
27
|
-
return { failure:
|
|
30
|
+
return { failure: HUBSPOT_SUBMIT_FAILURE_MESSAGE };
|
|
28
31
|
}
|
|
29
32
|
}
|
|
30
33
|
//# 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;AAEb,OAAO,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAMzF,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,sBAAsB,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;IACtD,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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const HUBSPOT_MIN_SUBMIT_MS = 3000;
|
|
2
|
+
/** Visitor-facing copy when the anti-bot timer rejects a submit without posting. */
|
|
3
|
+
export declare const HUBSPOT_SUBMIT_TOO_FAST_MESSAGE = "Please wait a moment and try again.";
|
|
4
|
+
/**
|
|
5
|
+
* True when the client timer looks like a bot (never started, reversed, or under 3s).
|
|
6
|
+
* Does not POST to HubSpot; callers must not treat this as success.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isHubspotSubmitTooFast(formStartTime: number, formEndTime: number): boolean;
|
|
9
|
+
//# sourceMappingURL=submitGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submitGuard.d.ts","sourceRoot":"","sources":["../../src/forms/submitGuard.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,oFAAoF;AACpF,eAAO,MAAM,+BAA+B,wCAAwC,CAAC;AAErF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAK1F"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const HUBSPOT_MIN_SUBMIT_MS = 3000;
|
|
2
|
+
/** Visitor-facing copy when the anti-bot timer rejects a submit without posting. */
|
|
3
|
+
export const HUBSPOT_SUBMIT_TOO_FAST_MESSAGE = 'Please wait a moment and try again.';
|
|
4
|
+
/**
|
|
5
|
+
* True when the client timer looks like a bot (never started, reversed, or under 3s).
|
|
6
|
+
* Does not POST to HubSpot; callers must not treat this as success.
|
|
7
|
+
*/
|
|
8
|
+
export function isHubspotSubmitTooFast(formStartTime, formEndTime) {
|
|
9
|
+
if (formStartTime === 0 || formStartTime > formEndTime) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
return formEndTime - formStartTime < HUBSPOT_MIN_SUBMIT_MS;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=submitGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submitGuard.js","sourceRoot":"","sources":["../../src/forms/submitGuard.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,oFAAoF;AACpF,MAAM,CAAC,MAAM,+BAA+B,GAAG,qCAAqC,CAAC;AAErF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,aAAqB,EAAE,WAAmB;IAC/E,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,GAAG,WAAW,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,WAAW,GAAG,aAAa,GAAG,qBAAqB,CAAC;AAC7D,CAAC"}
|
package/dist/forms/types.d.ts
CHANGED
|
@@ -77,6 +77,16 @@ 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;
|
|
84
|
+
/**
|
|
85
|
+
* Visitor-facing copy when the anti-bot timer skips the POST.
|
|
86
|
+
* Optional JSON `data` key — not a Contentful field. Falls back to `submitErrorText`,
|
|
87
|
+
* then `Please wait a moment and try again.`
|
|
88
|
+
*/
|
|
89
|
+
submitTooFastText?: string;
|
|
80
90
|
widthPercentage?: number;
|
|
81
91
|
hiddenFields?: Record<string, string>;
|
|
82
92
|
initialValues?: Record<string, string>;
|
|
@@ -96,6 +106,7 @@ export interface HubspotFormClassNames {
|
|
|
96
106
|
radioLabel?: string;
|
|
97
107
|
submitButton?: string;
|
|
98
108
|
message?: string;
|
|
109
|
+
error?: string;
|
|
99
110
|
legalConsent?: string;
|
|
100
111
|
richText?: string;
|
|
101
112
|
}
|
|
@@ -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/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export { applyMarketingParamsToHiddenFields, captureMarketingParams, getMarketin
|
|
|
4
4
|
export { navigateAfterSubmit } from './forms/client/navigateAfterSubmit';
|
|
5
5
|
export type { UseHubspotSubmitOptions } from './forms/client/useHubspotSubmit';
|
|
6
6
|
export { useHubspotSubmit } from './forms/client/useHubspotSubmit';
|
|
7
|
+
export { HUBSPOT_MIN_SUBMIT_MS, HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast, } from './forms/submitGuard';
|
|
7
8
|
export type { HubspotFieldResponse, HubspotFormClassNames, HubspotFormContext, HubspotFormDefinition, HubspotFormExternalData, HubspotFormSubmissionResponse, } from './forms/types';
|
|
8
9
|
export { createHubSpotBootstrapScript } from './tracking/createHubSpotBootstrapScript';
|
|
9
10
|
export type { HubSpotAnalyticsAdapterConfig } from './tracking/HubSpotAnalyticsAdapter';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export { buildDefaultValues, HubspotDynamicForm } from './forms/client/HubspotDy
|
|
|
2
2
|
export { applyMarketingParamsToHiddenFields, captureMarketingParams, getMarketingParams, KNOWN_MARKETING_PARAM_KEYS, MARKETING_PARAMS_STORAGE_KEY, } from './forms/client/marketingParams';
|
|
3
3
|
export { navigateAfterSubmit } from './forms/client/navigateAfterSubmit';
|
|
4
4
|
export { useHubspotSubmit } from './forms/client/useHubspotSubmit';
|
|
5
|
+
export { HUBSPOT_MIN_SUBMIT_MS, HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast, } from './forms/submitGuard';
|
|
5
6
|
export { createHubSpotBootstrapScript } from './tracking/createHubSpotBootstrapScript';
|
|
6
7
|
export { HubSpotAnalyticsAdapter } from './tracking/HubSpotAnalyticsAdapter';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export { HUBSPOT_FORMS_CACHE_TAG_PREFIX, hubspotFormTag } from './forms/server/h
|
|
|
4
4
|
export { mapApiResponseToFormDefinition } from './forms/server/mapApiResponse';
|
|
5
5
|
export type { SubmitHubspotFormResult } from './forms/server/submitForm';
|
|
6
6
|
export { submitHubspotForm } from './forms/server/submitForm';
|
|
7
|
+
export { HUBSPOT_MIN_SUBMIT_MS, HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast, } from './forms/submitGuard';
|
|
7
8
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,qBAAqB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -3,4 +3,5 @@ export { getHubspotFormDefinition } from './forms/server/getFormDefinition';
|
|
|
3
3
|
export { HUBSPOT_FORMS_CACHE_TAG_PREFIX, hubspotFormTag } from './forms/server/hubspotFormTag';
|
|
4
4
|
export { mapApiResponseToFormDefinition } from './forms/server/mapApiResponse';
|
|
5
5
|
export { submitHubspotForm } from './forms/server/submitForm';
|
|
6
|
+
export { HUBSPOT_MIN_SUBMIT_MS, HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast, } from './forms/submitGuard';
|
|
6
7
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,qBAAqB,CAAC"}
|
package/docs/llms.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
| Import | Contents |
|
|
6
6
|
|--------|----------|
|
|
7
|
-
| `@se-studio/hubspot` | `HubSpotAnalyticsAdapter`, `createHubSpotBootstrapScript`, `HubspotDynamicForm`, `buildDefaultValues`, `captureMarketingParams`, `getMarketingParams`, `applyMarketingParamsToHiddenFields`, `useHubspotSubmit`, `navigateAfterSubmit`, types |
|
|
8
|
-
| `@se-studio/hubspot/server` | `getHubspotFormDefinition`, `submitHubspotForm`, `hubspotFormTag` |
|
|
7
|
+
| `@se-studio/hubspot` | `HubSpotAnalyticsAdapter`, `createHubSpotBootstrapScript`, `HubspotDynamicForm`, `buildDefaultValues`, `captureMarketingParams`, `getMarketingParams`, `applyMarketingParamsToHiddenFields`, `useHubspotSubmit`, `navigateAfterSubmit`, `HUBSPOT_MIN_SUBMIT_MS`, `HUBSPOT_SUBMIT_TOO_FAST_MESSAGE`, `isHubspotSubmitTooFast`, types |
|
|
8
|
+
| `@se-studio/hubspot/server` | `getHubspotFormDefinition`, `submitHubspotForm`, `hubspotFormTag`, `HUBSPOT_MIN_SUBMIT_MS`, `HUBSPOT_SUBMIT_TOO_FAST_MESSAGE`, `isHubspotSubmitTooFast` |
|
|
9
9
|
| `@se-studio/hubspot/external` | `createHubspotFormExternalRenderer` |
|
|
10
10
|
|
|
11
11
|
## CMS external component
|
|
@@ -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` / `data.submitTooFastText` (optional JSON keys, not Contentful fields). Renderer options supply site-level defaults; `data` wins. Blank/whitespace values are treated as unset. Too-fast copy: `submitTooFastText` → `submitErrorText` → `Please wait a moment and try again.`
|
|
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 (never-started timer, reversed clocks, or under 3 seconds from form render): do **not** POST to HubSpot and do **not** return `{ success: true }`. Return `{ failure }` with `HUBSPOT_SUBMIT_TOO_FAST_MESSAGE` (default `Please wait a moment and try again.`). The visitor-facing string follows the same override chain as other form copy (`submitTooFastText` / `submitErrorText` / renderer options). Log a skip, call `onError`, keep field values, and re-enable submit. A result with no `data` is not treated as HubSpot acceptance.
|
|
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` / `submitTooFastText` 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, tooFastMessage })
|
|
31
49
|
// or
|
|
32
|
-
<HubspotDynamicForm redirectUrlOverride={url} onSuccess={fn}
|
|
50
|
+
<HubspotDynamicForm submittingButtonText={…} submitErrorText={…} submitTooFastText={…} 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.
|