@se-studio/hubspot 17.1.0 → 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 +6 -0
- package/README.md +5 -2
- package/dist/external/createHubspotFormExternalRenderer.d.ts +2 -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 +9 -3
- package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -1
- package/dist/forms/client/HubspotDynamicForm.js +2 -1
- package/dist/forms/client/HubspotDynamicForm.js.map +1 -1
- package/dist/forms/client/useHubspotSubmit.d.ts +10 -5
- package/dist/forms/client/useHubspotSubmit.d.ts.map +1 -1
- package/dist/forms/client/useHubspotSubmit.js +24 -9
- package/dist/forms/client/useHubspotSubmit.js.map +1 -1
- package/dist/forms/server/submitForm.d.ts.map +1 -1
- package/dist/forms/server/submitForm.js +4 -8
- 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 +6 -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 +7 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
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
|
+
|
|
3
9
|
## 17.1.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -62,6 +62,7 @@ Add `"Hubspot form"` to your `externalComponent` enum. `data` JSON:
|
|
|
62
62
|
"submitButtonText": "Optional label",
|
|
63
63
|
"submittingButtonText": "Optional pending label",
|
|
64
64
|
"submitErrorText": "Optional error copy",
|
|
65
|
+
"submitTooFastText": "Optional wait-and-retry copy",
|
|
65
66
|
"hiddenFields": { "campaign": "value" }
|
|
66
67
|
}
|
|
67
68
|
```
|
|
@@ -79,9 +80,10 @@ export const HubspotFormRegistration = defineExternalComponent({
|
|
|
79
80
|
{children}
|
|
80
81
|
</Section>
|
|
81
82
|
),
|
|
82
|
-
// Optional site-level defaults; CMS `data.submittingButtonText` / `data.submitErrorText` win
|
|
83
|
+
// Optional site-level defaults; CMS `data.submittingButtonText` / `data.submitErrorText` / `data.submitTooFastText` win
|
|
83
84
|
submittingButtonText: 'Sending…',
|
|
84
85
|
submitErrorText: 'Please try again later.',
|
|
86
|
+
submitTooFastText: 'Please wait a moment and try again.',
|
|
85
87
|
}),
|
|
86
88
|
});
|
|
87
89
|
```
|
|
@@ -130,7 +132,7 @@ These forms are **not** HubSpot’s native embed script — the package rebuilds
|
|
|
130
132
|
|
|
131
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.
|
|
132
134
|
|
|
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.
|
|
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.
|
|
134
136
|
|
|
135
137
|
```tsx
|
|
136
138
|
<HubspotDynamicForm
|
|
@@ -139,6 +141,7 @@ These forms are **not** HubSpot’s native embed script — the package rebuilds
|
|
|
139
141
|
redirectUrlOverride={cmsExternalUrl} // optional CMS override
|
|
140
142
|
submittingButtonText="Sending…" // optional; default "Submitting…"
|
|
141
143
|
submitErrorText="Please try again later." // optional
|
|
144
|
+
submitTooFastText="Please wait a moment and try again." // optional
|
|
142
145
|
onSuccess={() => setShowExtraCopy(true)} // optional; redirect still runs if set
|
|
143
146
|
onError={() => reportFormError('hubspot_submit_failed')} // coarse category only
|
|
144
147
|
/>
|
|
@@ -17,6 +17,8 @@ export interface HubspotFormExternalRendererOptions<TExternal extends ITyped> {
|
|
|
17
17
|
submittingButtonText?: string;
|
|
18
18
|
/** Default visitor-facing error when CMS `data.submitErrorText` is unset. */
|
|
19
19
|
submitErrorText?: string;
|
|
20
|
+
/** Default too-fast copy when CMS `data.submitTooFastText` is unset. */
|
|
21
|
+
submitTooFastText?: string;
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
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;IACnC,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,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, submittingButtonText: data.submittingButtonText?.trim() || options.submittingButtonText, submitErrorText: data.submitErrorText?.trim() || options.submitErrorText, 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"}
|
|
@@ -19,8 +19,8 @@ export interface HubspotDynamicFormProps {
|
|
|
19
19
|
*/
|
|
20
20
|
onSuccess?: (fields: Record<string, HubspotFieldResponse>) => void;
|
|
21
21
|
/**
|
|
22
|
-
* Called when HubSpot rejects the submission
|
|
23
|
-
* The form keeps field values so the visitor can retry.
|
|
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
24
|
*/
|
|
25
25
|
onError?: (error: string) => void;
|
|
26
26
|
/**
|
|
@@ -31,6 +31,12 @@ export interface HubspotDynamicFormProps {
|
|
|
31
31
|
submittingButtonText?: string;
|
|
32
32
|
/** Visitor-facing submit error. Default: {@link HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE}. */
|
|
33
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;
|
|
34
40
|
}
|
|
35
|
-
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, }: 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;
|
|
36
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;;;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;
|
|
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,7 +79,7 @@ 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, onError, redirectUrlOverride, submittingButtonText, submitErrorText, }) {
|
|
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
84
|
const { handleSubmit, handleInputChange, message, formData, setFormData, isSubmitting, submitError, } = useHubspotSubmit({
|
|
85
85
|
portalId,
|
|
@@ -89,6 +89,7 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
89
89
|
onError,
|
|
90
90
|
redirectUrlOverride,
|
|
91
91
|
errorMessage: submitErrorText?.trim() || undefined,
|
|
92
|
+
tooFastMessage: submitTooFastText?.trim() || undefined,
|
|
92
93
|
});
|
|
93
94
|
useEffect(() => {
|
|
94
95
|
setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
|
|
@@ -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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"}
|
|
@@ -6,15 +6,15 @@ export interface UseHubspotSubmitOptions {
|
|
|
6
6
|
formDefinition: HubspotFormDefinition;
|
|
7
7
|
ipAddress?: string;
|
|
8
8
|
/**
|
|
9
|
-
* Called after
|
|
9
|
+
* Called after HubSpot accepts the submission.
|
|
10
10
|
* Side-effect only — does not suppress HubSpot thank-you or redirect handling.
|
|
11
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.
|
|
12
13
|
*/
|
|
13
14
|
onSuccess?: (fields: Record<string, HubspotFieldResponse>) => void;
|
|
14
15
|
/**
|
|
15
|
-
* Called when HubSpot rejects the submission
|
|
16
|
-
* Receives the package failure string
|
|
17
|
-
* Does not run for the bot-timing short-circuit (that still calls `onSuccess`).
|
|
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
18
|
*/
|
|
19
19
|
onError?: (error: string) => void;
|
|
20
20
|
/**
|
|
@@ -24,8 +24,13 @@ export interface UseHubspotSubmitOptions {
|
|
|
24
24
|
redirectUrlOverride?: string;
|
|
25
25
|
/** Visitor-facing error copy. Defaults to {@link HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE}. */
|
|
26
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;
|
|
27
32
|
}
|
|
28
|
-
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, }: UseHubspotSubmitOptions): {
|
|
33
|
+
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, }: UseHubspotSubmitOptions): {
|
|
29
34
|
handleSubmit: (e: React.FormEvent) => void;
|
|
30
35
|
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
31
36
|
message: string | null;
|
|
@@ -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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { useRouter } from 'next/navigation';
|
|
3
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
7
|
import { navigateAfterSubmit, shouldHoldRedirectLock } from './navigateAfterSubmit';
|
|
7
8
|
export const HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE = 'Form submission failed. Please try again later.';
|
|
@@ -26,11 +27,15 @@ function resolveRedirectAfterSuccess(result, formDefinition, redirectUrlOverride
|
|
|
26
27
|
}
|
|
27
28
|
return undefined;
|
|
28
29
|
}
|
|
29
|
-
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, }) {
|
|
30
|
+
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, }) {
|
|
30
31
|
const router = useRouter();
|
|
31
32
|
const visitorError = errorMessage?.trim() || HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE;
|
|
33
|
+
const visitorTooFast = tooFastMessage?.trim() || errorMessage?.trim() || HUBSPOT_SUBMIT_TOO_FAST_MESSAGE;
|
|
32
34
|
const [formData, setFormData] = useState({});
|
|
33
|
-
const formStartTimeRef = useRef(
|
|
35
|
+
const formStartTimeRef = useRef(undefined);
|
|
36
|
+
if (formStartTimeRef.current === undefined) {
|
|
37
|
+
formStartTimeRef.current = Date.now();
|
|
38
|
+
}
|
|
34
39
|
const submittingRef = useRef(false);
|
|
35
40
|
const pendingTimerRef = useRef(undefined);
|
|
36
41
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
@@ -59,7 +64,7 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
59
64
|
};
|
|
60
65
|
}, [releasePending]);
|
|
61
66
|
const handleInputChange = (e) => {
|
|
62
|
-
if (formStartTimeRef.current === 0) {
|
|
67
|
+
if (formStartTimeRef.current === undefined || formStartTimeRef.current === 0) {
|
|
63
68
|
formStartTimeRef.current = Date.now();
|
|
64
69
|
}
|
|
65
70
|
const { name, value, type } = e.target;
|
|
@@ -112,20 +117,29 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
112
117
|
// Stay pending through a real page change so the button cannot be clicked
|
|
113
118
|
// again while the next page loads.
|
|
114
119
|
let stayPending = false;
|
|
115
|
-
const showSubmitError = () => {
|
|
116
|
-
|
|
117
|
-
|
|
120
|
+
const showSubmitError = (displayMessage) => {
|
|
121
|
+
const text = displayMessage?.trim() || visitorError;
|
|
122
|
+
setMessage(text);
|
|
123
|
+
setSubmitError(text);
|
|
118
124
|
};
|
|
125
|
+
const formStartTime = formStartTimeRef.current ?? Date.now();
|
|
126
|
+
formStartTimeRef.current = formStartTime;
|
|
119
127
|
submitHubspotForm(portalId, formDefinition.id, transformedFields, {
|
|
120
128
|
hutk: getCookieValue('hubspotutk'),
|
|
121
129
|
ipAddress,
|
|
122
130
|
pageUri: window.location.href,
|
|
123
131
|
pageName: document.title,
|
|
124
|
-
},
|
|
132
|
+
}, formStartTime, Date.now())
|
|
125
133
|
.then((result) => {
|
|
126
134
|
if (result.failure) {
|
|
127
|
-
|
|
128
|
-
|
|
135
|
+
const tooFast = result.failure === HUBSPOT_SUBMIT_TOO_FAST_MESSAGE;
|
|
136
|
+
showSubmitError(tooFast ? visitorTooFast : undefined);
|
|
137
|
+
onError?.(tooFast ? visitorTooFast : result.failure);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (result.data === undefined) {
|
|
141
|
+
showSubmitError(visitorTooFast);
|
|
142
|
+
onError?.(visitorTooFast);
|
|
129
143
|
return;
|
|
130
144
|
}
|
|
131
145
|
setSubmitError(null);
|
|
@@ -183,6 +197,7 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
183
197
|
releasePending,
|
|
184
198
|
router,
|
|
185
199
|
visitorError,
|
|
200
|
+
visitorTooFast,
|
|
186
201
|
]);
|
|
187
202
|
return {
|
|
188
203
|
handleSubmit,
|
|
@@ -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,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,17 +1,13 @@
|
|
|
1
1
|
'use server';
|
|
2
|
+
import { HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast } from '../submitGuard';
|
|
2
3
|
import { evaluateHubspotSubmitResponse, HUBSPOT_SUBMIT_FAILURE_MESSAGE, } from './evaluateSubmitResponse';
|
|
3
4
|
export async function submitHubspotForm(portalId, formId, fields, context, formStartTime, formEndTime) {
|
|
4
5
|
if (!portalId) {
|
|
5
6
|
return { failure: 'no portal ID' };
|
|
6
7
|
}
|
|
7
|
-
if (formStartTime
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (formStartTime > formEndTime) {
|
|
11
|
-
return { success: true };
|
|
12
|
-
}
|
|
13
|
-
if (formEndTime - formStartTime < 3000) {
|
|
14
|
-
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 };
|
|
15
11
|
}
|
|
16
12
|
try {
|
|
17
13
|
const response = await fetch(`https://api.hsforms.com/submissions/v3/integration/submit/${portalId}/${formId}`, {
|
|
@@ -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
|
@@ -81,6 +81,12 @@ export interface HubspotFormExternalData {
|
|
|
81
81
|
submittingButtonText?: string;
|
|
82
82
|
/** Visitor-facing submit error. Optional JSON `data` key — not a Contentful field. */
|
|
83
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;
|
|
84
90
|
widthPercentage?: number;
|
|
85
91
|
hiddenFields?: Record<string, string>;
|
|
86
92
|
initialValues?: Record<string, string>;
|
|
@@ -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,7 +13,7 @@
|
|
|
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
|
+
- `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.`
|
|
17
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.
|
|
18
18
|
|
|
19
19
|
## Forms: brand, submit path, and failure behaviour
|
|
@@ -23,7 +23,7 @@ Policy (`docs/PHILOSOPHY.md` R7.6). Implementation gaps are tracked as se-core #
|
|
|
23
23
|
- Render with our form components (`HubspotDynamicForm` / `createHubspotFormExternalRenderer`), not the HubSpot embed script. Submit server-side via `submitHubspotForm`.
|
|
24
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
25
|
- Block double submits while a request is in flight.
|
|
26
|
-
- Anti-bot (
|
|
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
27
|
- Known site gaps (e.g. HSD still on embed) get filled toward this path.
|
|
28
28
|
|
|
29
29
|
Standard analytics names for the form lifecycle: `form_view`, `form_start`, `form_submit`, `form_error` — see `packages/core-ui/ANALYTICS.md`.
|
|
@@ -40,14 +40,14 @@ Priority: `redirectUrlOverride` → submit `redirectUri` → form `postSubmitAct
|
|
|
40
40
|
- `onError` is optional; HubSpot `!ok` / `status: "error"` / `errors[]` are failures (not thank-you)
|
|
41
41
|
- `useHubspotSubmit` returns `isSubmitting` and `submitError`; the standard form disables submit while in flight
|
|
42
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
|
|
43
|
+
- `submittingButtonText` / `submitErrorText` / `submitTooFastText` override English defaults; pass from CMS `data` or renderer options
|
|
44
44
|
- Do not send field values or raw `onError` text to analytics
|
|
45
45
|
- Preserve full `redirectUri` from HubSpot (do not strip host)
|
|
46
46
|
|
|
47
47
|
```tsx
|
|
48
|
-
useHubspotSubmit({ portalId, formDefinition, onSuccess, onError, redirectUrlOverride, errorMessage })
|
|
48
|
+
useHubspotSubmit({ portalId, formDefinition, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage })
|
|
49
49
|
// or
|
|
50
|
-
<HubspotDynamicForm submittingButtonText={…} submitErrorText={…} redirectUrlOverride={url} onSuccess={fn} onError={fn} />
|
|
50
|
+
<HubspotDynamicForm submittingButtonText={…} submitErrorText={…} submitTooFastText={…} redirectUrlOverride={url} onSuccess={fn} onError={fn} />
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
After HubSpot form editor changes, revalidate: `revalidateTag(hubspotFormTag(formId), { expire: 0 })` (definitions cached ~1h). Do not use `'max'` — that is stale-while-revalidate.
|