@se-studio/hubspot 17.3.1 → 17.4.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 +11 -0
- package/README.md +5 -2
- package/dist/external/createHubspotFormExternalRenderer.d.ts +5 -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 +11 -1
- package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -1
- package/dist/forms/client/HubspotDynamicForm.js +21 -4
- package/dist/forms/client/HubspotDynamicForm.js.map +1 -1
- package/dist/forms/client/useHubspotSubmit.d.ts +17 -1
- package/dist/forms/client/useHubspotSubmit.d.ts.map +1 -1
- package/dist/forms/client/useHubspotSubmit.js +47 -1
- package/dist/forms/client/useHubspotSubmit.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/docs/llms.md +7 -6
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @se-studio/hubspot
|
|
2
2
|
|
|
3
|
+
## 17.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e746884: Add generic non-PII form analytics (`form_view`, `form_start`, `form_submit`, `form_error`) via `useAnalytics`. HubSpot forms do **not** emit these on upgrade; opt in with `formAnalytics={true}` on `HubspotDynamicForm` / `useHubspotSubmit` / `createHubspotFormExternalRenderer`. Import from `@se-studio/core-ui/form-analytics` only (not the root barrel). Payloads are allowlisted and never include field values or raw error text.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [e746884]
|
|
12
|
+
- @se-studio/core-ui@1.35.0
|
|
13
|
+
|
|
3
14
|
## 17.3.1
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -148,7 +148,9 @@ These forms are **not** HubSpot’s native embed script — the package rebuilds
|
|
|
148
148
|
|
|
149
149
|
**`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.
|
|
150
150
|
|
|
151
|
-
**`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
|
|
151
|
+
**`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.
|
|
152
|
+
|
|
153
|
+
Core can emit `form_view`, `form_start`, `form_submit`, and `form_error` (category/code only) through `useAnalytics` when you pass `formAnalytics={true}`. Default is off, so a package bump does not add events. Import helpers from `@se-studio/core-ui/form-analytics`. Pass `cmsEntryId` for `cms_entry_id`.
|
|
152
154
|
|
|
153
155
|
```tsx
|
|
154
156
|
<HubspotDynamicForm
|
|
@@ -159,7 +161,8 @@ These forms are **not** HubSpot’s native embed script — the package rebuilds
|
|
|
159
161
|
submitErrorText="Please try again later." // optional
|
|
160
162
|
submitTooFastText="Please wait a moment and try again." // optional
|
|
161
163
|
onSuccess={() => setShowExtraCopy(true)} // optional; redirect still runs if set
|
|
162
|
-
onError={() =>
|
|
164
|
+
onError={() => setShowRetryHint(true)} // optional UI
|
|
165
|
+
formAnalytics // opt in to form_view / form_start / form_submit / form_error
|
|
163
166
|
/>
|
|
164
167
|
```
|
|
165
168
|
|
|
@@ -19,6 +19,11 @@ export interface HubspotFormExternalRendererOptions<TExternal extends ITyped> {
|
|
|
19
19
|
submitErrorText?: string;
|
|
20
20
|
/** Default too-fast copy when CMS `data.submitTooFastText` is unset. */
|
|
21
21
|
submitTooFastText?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Opt in to `form_view` / `form_start` / `form_submit` / `form_error`.
|
|
24
|
+
* Default false.
|
|
25
|
+
*/
|
|
26
|
+
formAnalytics?: boolean;
|
|
22
27
|
}
|
|
23
28
|
/**
|
|
24
29
|
* 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;IACzB,wEAAwE;IACxE,iBAAiB,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;IAC3B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;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,CAoCtC"}
|
|
@@ -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, submitTooFastText: data.submitTooFastText?.trim() || options.submitTooFastText, 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, cmsEntryId: information.id, formAnalytics: options.formAnalytics })),
|
|
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;AA2B7E;;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,EACjC,UAAU,EAAE,WAAW,CAAC,EAAE,EAC1B,aAAa,EAAE,OAAO,CAAC,aAAa,GACpC,CACH;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -37,6 +37,16 @@ export interface HubspotDynamicFormProps {
|
|
|
37
37
|
* when this prop is unset.
|
|
38
38
|
*/
|
|
39
39
|
submitTooFastText?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Contentful entry id for form analytics (`cms_entry_id`). Optional — not a CMS field.
|
|
42
|
+
*/
|
|
43
|
+
cmsEntryId?: string;
|
|
44
|
+
/** Multi-step id for analytics. */
|
|
45
|
+
step?: string | number;
|
|
46
|
+
/**
|
|
47
|
+
* Opt in to form analytics. Default false (no events on upgrade).
|
|
48
|
+
*/
|
|
49
|
+
formAnalytics?: boolean;
|
|
40
50
|
}
|
|
41
|
-
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, submitTooFastText, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
51
|
+
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, submitTooFastText, cmsEntryId, step, formAnalytics, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
42
52
|
//# 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;AA0BnG;;;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;
|
|
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;AA0BnG;;;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;IAC3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;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,EACjB,UAAU,EACV,IAAI,EACJ,aAAa,GACd,EAAE,uBAAuB,+BAqJzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { decode } from 'html-entities';
|
|
4
|
-
import { useCallback, useEffect, useMemo } from 'react';
|
|
4
|
+
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
5
5
|
import { collectVisibleFields } from './dependentFields';
|
|
6
6
|
import { applyMarketingParamsToHiddenFields, captureMarketingParams } from './marketingParams';
|
|
7
7
|
import { CORE_FORM_NATIVE_ACTION, CORE_FORM_NATIVE_METHOD } from './nativeSubmitUrl';
|
|
@@ -80,9 +80,9 @@ function renderRichText(content, className) {
|
|
|
80
80
|
// biome-ignore lint/security/noDangerouslySetInnerHtml: HubSpot form rich text from API
|
|
81
81
|
dangerouslySetInnerHTML: { __html: cleanContent } }));
|
|
82
82
|
}
|
|
83
|
-
export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, submitTooFastText, }) {
|
|
83
|
+
export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, submitTooFastText, cmsEntryId, step, formAnalytics, }) {
|
|
84
84
|
const classNames = useMemo(() => ({ ...DEFAULT_CLASS_NAMES, ...classNamesProp }), [classNamesProp]);
|
|
85
|
-
const { handleSubmit, handleInputChange, message, formData, setFormData, isSubmitting, submitError, } = useHubspotSubmit({
|
|
85
|
+
const { handleSubmit, handleInputChange, handleInvalid, message, formData, setFormData, isSubmitting, submitError, } = useHubspotSubmit({
|
|
86
86
|
portalId,
|
|
87
87
|
formDefinition,
|
|
88
88
|
ipAddress,
|
|
@@ -91,6 +91,9 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
91
91
|
redirectUrlOverride,
|
|
92
92
|
errorMessage: submitErrorText?.trim() || undefined,
|
|
93
93
|
tooFastMessage: submitTooFastText?.trim() || undefined,
|
|
94
|
+
cmsEntryId,
|
|
95
|
+
step,
|
|
96
|
+
formAnalytics,
|
|
94
97
|
});
|
|
95
98
|
useEffect(() => {
|
|
96
99
|
setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
|
|
@@ -113,6 +116,20 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
113
116
|
}, [classNames, dependentFieldsMap, formData, handleInputChange, visibleFields]);
|
|
114
117
|
const buttonText = submitButtonText ?? formDefinition.submitButtonText;
|
|
115
118
|
const pendingButtonText = submittingButtonText?.trim() || 'Submitting…';
|
|
116
|
-
|
|
119
|
+
const formRef = useRef(null);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
const form = formRef.current;
|
|
122
|
+
if (!form) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const onInvalidCapture = () => {
|
|
126
|
+
handleInvalid();
|
|
127
|
+
};
|
|
128
|
+
form.addEventListener('invalid', onInvalidCapture, true);
|
|
129
|
+
return () => {
|
|
130
|
+
form.removeEventListener('invalid', onInvalidCapture, true);
|
|
131
|
+
};
|
|
132
|
+
}, [handleInvalid]);
|
|
133
|
+
return (_jsxs("form", { ref: formRef, method: CORE_FORM_NATIVE_METHOD, action: CORE_FORM_NATIVE_ACTION, 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 })] }));
|
|
117
134
|
}
|
|
118
135
|
//# sourceMappingURL=HubspotDynamicForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { type FormAnalyticsErrorInfo, type FormAnalyticsIdentity } from '@se-studio/core-ui/form-analytics';
|
|
1
2
|
import type { HubspotFieldResponse, HubspotFormDefinition } from '../types';
|
|
3
|
+
export declare function hubspotFormAnalyticsIdentity(formDefinition: HubspotFormDefinition, extras?: Pick<FormAnalyticsIdentity, 'cms_entry_id' | 'step' | 'form_type'>): FormAnalyticsIdentity;
|
|
4
|
+
export declare function classifyHubspotFormAnalyticsError(kind: 'too_fast' | 'api' | 'network' | 'redirect' | 'validation'): FormAnalyticsErrorInfo;
|
|
2
5
|
export declare const HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE = "Form submission failed. Please try again later.";
|
|
3
6
|
export declare const HUBSPOT_REDIRECT_PENDING_MS = 10000;
|
|
4
7
|
export interface UseHubspotSubmitOptions {
|
|
@@ -29,10 +32,23 @@ export interface UseHubspotSubmitOptions {
|
|
|
29
32
|
* When unset, `errorMessage` (CMS `submitErrorText`) is used if present.
|
|
30
33
|
*/
|
|
31
34
|
tooFastMessage?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Contentful entry id for analytics only (not a new CMS field).
|
|
37
|
+
* Emitted as `cms_entry_id` on form events.
|
|
38
|
+
*/
|
|
39
|
+
cmsEntryId?: string;
|
|
40
|
+
/** Multi-step index or id. Analytics only. */
|
|
41
|
+
step?: string | number;
|
|
42
|
+
/**
|
|
43
|
+
* Opt in to `form_view` / `form_start` / `form_submit` / `form_error`.
|
|
44
|
+
* Default false so existing sites see no new events on upgrade.
|
|
45
|
+
*/
|
|
46
|
+
formAnalytics?: boolean;
|
|
32
47
|
}
|
|
33
|
-
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, }: UseHubspotSubmitOptions): {
|
|
48
|
+
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, cmsEntryId, step, formAnalytics, }: UseHubspotSubmitOptions): {
|
|
34
49
|
handleSubmit: (e: React.FormEvent) => void;
|
|
35
50
|
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
51
|
+
handleInvalid: () => void;
|
|
36
52
|
message: string | null;
|
|
37
53
|
formData: Record<string, HubspotFieldResponse>;
|
|
38
54
|
setFormData: import("react").Dispatch<import("react").SetStateAction<Record<string, HubspotFieldResponse>>>;
|
|
@@ -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":"AAEA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAE3B,MAAM,mCAAmC,CAAC;AAK3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAI5E,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,qBAAqB,EACrC,MAAM,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC,GAC1E,qBAAqB,CAQvB;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAC/D,sBAAsB,CAcxB;AAED,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;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,IAAI,EACJ,aAAqB,GACtB,EAAE,uBAAuB;sBA4FlB,KAAK,CAAC,SAAS;2BA5ChB,KAAK,CAAC,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;;;;;;;EAyLnF"}
|
|
@@ -1,10 +1,35 @@
|
|
|
1
1
|
'use client';
|
|
2
|
+
import { FORM_ERROR_CATEGORIES, useFormAnalytics, } from '@se-studio/core-ui/form-analytics';
|
|
2
3
|
import { useRouter } from 'next/navigation';
|
|
3
4
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
5
|
import { submitHubspotForm } from '../server/submitForm';
|
|
5
6
|
import { HUBSPOT_SUBMIT_TOO_FAST_MESSAGE } from '../submitGuard';
|
|
6
7
|
import { getCookieValue } from './getCookieValue';
|
|
7
8
|
import { navigateAfterSubmit, shouldHoldRedirectLock } from './navigateAfterSubmit';
|
|
9
|
+
export function hubspotFormAnalyticsIdentity(formDefinition, extras) {
|
|
10
|
+
return {
|
|
11
|
+
form_id: formDefinition.id,
|
|
12
|
+
form_name: formDefinition.name,
|
|
13
|
+
form_type: extras?.form_type ?? 'hubspot',
|
|
14
|
+
cms_entry_id: extras?.cms_entry_id,
|
|
15
|
+
step: extras?.step,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function classifyHubspotFormAnalyticsError(kind) {
|
|
19
|
+
if (kind === 'too_fast') {
|
|
20
|
+
return { error_category: FORM_ERROR_CATEGORIES.too_fast, error_code: 'too_fast' };
|
|
21
|
+
}
|
|
22
|
+
if (kind === 'api') {
|
|
23
|
+
return { error_category: FORM_ERROR_CATEGORIES.api, error_code: 'hubspot_reject' };
|
|
24
|
+
}
|
|
25
|
+
if (kind === 'network') {
|
|
26
|
+
return { error_category: FORM_ERROR_CATEGORIES.network, error_code: 'network' };
|
|
27
|
+
}
|
|
28
|
+
if (kind === 'redirect') {
|
|
29
|
+
return { error_category: FORM_ERROR_CATEGORIES.redirect, error_code: 'redirect' };
|
|
30
|
+
}
|
|
31
|
+
return { error_category: FORM_ERROR_CATEGORIES.validation, error_code: 'constraint' };
|
|
32
|
+
}
|
|
8
33
|
export const HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE = 'Form submission failed. Please try again later.';
|
|
9
34
|
export const HUBSPOT_REDIRECT_PENDING_MS = 10_000;
|
|
10
35
|
/**
|
|
@@ -27,8 +52,15 @@ function resolveRedirectAfterSuccess(result, formDefinition, redirectUrlOverride
|
|
|
27
52
|
}
|
|
28
53
|
return undefined;
|
|
29
54
|
}
|
|
30
|
-
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, }) {
|
|
55
|
+
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, cmsEntryId, step, formAnalytics = false, }) {
|
|
31
56
|
const router = useRouter();
|
|
57
|
+
const { markStart, markSubmit, markError } = useFormAnalytics({
|
|
58
|
+
enabled: formAnalytics,
|
|
59
|
+
identity: hubspotFormAnalyticsIdentity(formDefinition, {
|
|
60
|
+
cms_entry_id: cmsEntryId,
|
|
61
|
+
step,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
32
64
|
const visitorError = errorMessage?.trim() || HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE;
|
|
33
65
|
const visitorTooFast = tooFastMessage?.trim() || errorMessage?.trim() || HUBSPOT_SUBMIT_TOO_FAST_MESSAGE;
|
|
34
66
|
const [formData, setFormData] = useState({});
|
|
@@ -64,6 +96,7 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
64
96
|
};
|
|
65
97
|
}, [releasePending]);
|
|
66
98
|
const handleInputChange = (e) => {
|
|
99
|
+
markStart();
|
|
67
100
|
if (formStartTimeRef.current === undefined || formStartTimeRef.current === 0) {
|
|
68
101
|
formStartTimeRef.current = Date.now();
|
|
69
102
|
}
|
|
@@ -104,6 +137,7 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
104
137
|
};
|
|
105
138
|
const handleSubmit = useCallback((e) => {
|
|
106
139
|
e.preventDefault();
|
|
140
|
+
markStart();
|
|
107
141
|
if (submittingRef.current) {
|
|
108
142
|
return;
|
|
109
143
|
}
|
|
@@ -134,15 +168,18 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
134
168
|
if (result.failure) {
|
|
135
169
|
const tooFast = result.failure === HUBSPOT_SUBMIT_TOO_FAST_MESSAGE;
|
|
136
170
|
showSubmitError(tooFast ? visitorTooFast : undefined);
|
|
171
|
+
markError(classifyHubspotFormAnalyticsError(tooFast ? 'too_fast' : 'api'));
|
|
137
172
|
onError?.(tooFast ? visitorTooFast : result.failure);
|
|
138
173
|
return;
|
|
139
174
|
}
|
|
140
175
|
if (result.data === undefined) {
|
|
141
176
|
showSubmitError(visitorTooFast);
|
|
177
|
+
markError(classifyHubspotFormAnalyticsError('too_fast'));
|
|
142
178
|
onError?.(visitorTooFast);
|
|
143
179
|
return;
|
|
144
180
|
}
|
|
145
181
|
setSubmitError(null);
|
|
182
|
+
markSubmit();
|
|
146
183
|
try {
|
|
147
184
|
onSuccess?.(formData);
|
|
148
185
|
}
|
|
@@ -172,12 +209,14 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
172
209
|
catch {
|
|
173
210
|
stayPending = false;
|
|
174
211
|
showSubmitError();
|
|
212
|
+
markError(classifyHubspotFormAnalyticsError('redirect'));
|
|
175
213
|
onError?.(visitorError);
|
|
176
214
|
releasePending();
|
|
177
215
|
}
|
|
178
216
|
})
|
|
179
217
|
.catch(() => {
|
|
180
218
|
showSubmitError();
|
|
219
|
+
markError(classifyHubspotFormAnalyticsError('network'));
|
|
181
220
|
onError?.(visitorError);
|
|
182
221
|
})
|
|
183
222
|
.finally(() => {
|
|
@@ -198,10 +237,17 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
198
237
|
router,
|
|
199
238
|
visitorError,
|
|
200
239
|
visitorTooFast,
|
|
240
|
+
markStart,
|
|
241
|
+
markSubmit,
|
|
242
|
+
markError,
|
|
201
243
|
]);
|
|
244
|
+
const handleInvalid = useCallback(() => {
|
|
245
|
+
markError(classifyHubspotFormAnalyticsError('validation'));
|
|
246
|
+
}, [markError]);
|
|
202
247
|
return {
|
|
203
248
|
handleSubmit,
|
|
204
249
|
handleInputChange,
|
|
250
|
+
handleInvalid,
|
|
205
251
|
message,
|
|
206
252
|
formData,
|
|
207
253
|
setFormData,
|
|
@@ -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;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;
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { buildDefaultValues, HubspotDynamicForm } from './forms/client/HubspotDy
|
|
|
3
3
|
export { applyMarketingParamsToHiddenFields, captureMarketingParams, getMarketingParams, KNOWN_MARKETING_PARAM_KEYS, MARKETING_PARAMS_STORAGE_KEY, } from './forms/client/marketingParams';
|
|
4
4
|
export { navigateAfterSubmit } from './forms/client/navigateAfterSubmit';
|
|
5
5
|
export type { UseHubspotSubmitOptions } from './forms/client/useHubspotSubmit';
|
|
6
|
-
export { useHubspotSubmit } from './forms/client/useHubspotSubmit';
|
|
6
|
+
export { classifyHubspotFormAnalyticsError, hubspotFormAnalyticsIdentity, useHubspotSubmit, } from './forms/client/useHubspotSubmit';
|
|
7
7
|
export { HUBSPOT_MIN_SUBMIT_MS, HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast, } from './forms/submitGuard';
|
|
8
8
|
export type { HubspotFieldResponse, HubspotFormClassNames, HubspotFormContext, HubspotFormDefinition, HubspotFormExternalData, HubspotFormSubmissionResponse, } from './forms/types';
|
|
9
9
|
export { createHubSpotBootstrapScript } from './tracking/createHubSpotBootstrapScript';
|
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,
|
|
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,EACL,iCAAiC,EACjC,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AACzC,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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { buildDefaultValues, HubspotDynamicForm } from './forms/client/HubspotDynamicForm';
|
|
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
|
-
export { useHubspotSubmit } from './forms/client/useHubspotSubmit';
|
|
4
|
+
export { classifyHubspotFormAnalyticsError, hubspotFormAnalyticsIdentity, useHubspotSubmit, } from './forms/client/useHubspotSubmit';
|
|
5
5
|
export { HUBSPOT_MIN_SUBMIT_MS, HUBSPOT_SUBMIT_TOO_FAST_MESSAGE, isHubspotSubmitTooFast, } from './forms/submitGuard';
|
|
6
6
|
export { createHubSpotBootstrapScript } from './tracking/createHubSpotBootstrapScript';
|
|
7
7
|
export { HubSpotAnalyticsAdapter } from './tracking/HubSpotAnalyticsAdapter';
|
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,
|
|
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,EACL,iCAAiC,EACjC,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AACzC,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/docs/llms.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
| Import | Contents |
|
|
6
6
|
|--------|----------|
|
|
7
|
-
| `@se-studio/hubspot` | `HubSpotAnalyticsAdapter`, `createHubSpotBootstrapScript`, `HubspotDynamicForm`, `buildDefaultValues`, `captureMarketingParams`, `getMarketingParams`, `applyMarketingParamsToHiddenFields`, `useHubspotSubmit`, `navigateAfterSubmit`, `HUBSPOT_MIN_SUBMIT_MS`, `HUBSPOT_SUBMIT_TOO_FAST_MESSAGE`, `isHubspotSubmitTooFast`, types |
|
|
7
|
+
| `@se-studio/hubspot` | `HubSpotAnalyticsAdapter`, `createHubSpotBootstrapScript`, `HubspotDynamicForm`, `buildDefaultValues`, `captureMarketingParams`, `getMarketingParams`, `applyMarketingParamsToHiddenFields`, `useHubspotSubmit`, `hubspotFormAnalyticsIdentity`, `classifyHubspotFormAnalyticsError`, `navigateAfterSubmit`, `HUBSPOT_MIN_SUBMIT_MS`, `HUBSPOT_SUBMIT_TOO_FAST_MESSAGE`, `isHubspotSubmitTooFast`, types |
|
|
8
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
|
|
|
@@ -22,12 +22,12 @@ Policy (`docs/PHILOSOPHY.md` R7.6). Implementation gaps are tracked as se-core #
|
|
|
22
22
|
|
|
23
23
|
- Render with our form components (`HubspotDynamicForm` / `createHubspotFormExternalRenderer`), not the HubSpot embed script. Submit server-side via `submitHubspotForm`.
|
|
24
24
|
- `HubspotDynamicForm` sets `method="post"` and `action="#"` so a native submit before hydration cannot put field values in the URL (and then into `page_view` / GTM). After hydration, `onSubmit` still `preventDefault`s and posts via the HubSpot API.
|
|
25
|
-
- Check HubSpot's HTTP/response status. On failure, show the user an error, fire `form_error
|
|
25
|
+
- Check HubSpot's HTTP/response status. On failure, show the user an error, fire `form_error` from `useHubspotSubmit` when form analytics is opted in (do not send raw `onError` text or field values), and do not treat the submit as success.
|
|
26
26
|
- Block double submits while a request is in flight.
|
|
27
27
|
- 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.
|
|
28
28
|
- Known site gaps (e.g. HSD still on embed) get filled toward this path.
|
|
29
29
|
|
|
30
|
-
Standard analytics names for the form lifecycle: `form_view`, `form_start`, `form_submit`, `form_error` —
|
|
30
|
+
Standard analytics names for the form lifecycle: `form_view`, `form_start`, `form_submit`, `form_error` — available via `@se-studio/core-ui/form-analytics` `useFormAnalytics`. HubSpot `useHubspotSubmit` / `HubspotDynamicForm` emit them only when `formAnalytics={true}` (default off). See `packages/core-ui/ANALYTICS.md`. Do not send field values or raw error messages.
|
|
31
31
|
|
|
32
32
|
## Post-submit
|
|
33
33
|
|
|
@@ -42,13 +42,14 @@ Priority: `redirectUrlOverride` → submit `redirectUri` → form `postSubmitAct
|
|
|
42
42
|
- `useHubspotSubmit` returns `isSubmitting` and `submitError`; the standard form disables submit while in flight
|
|
43
43
|
- 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
|
|
44
44
|
- `submittingButtonText` / `submitErrorText` / `submitTooFastText` override English defaults; pass from CMS `data` or renderer options
|
|
45
|
-
- Do not send field values or raw `onError` text to analytics
|
|
45
|
+
- Do not send field values or raw `onError` text to analytics (`form_error` uses `error_category` / `error_code` only)
|
|
46
|
+
- `useHubspotSubmit` emits `form_view`, `form_start`, `form_submit`, `form_error` through `useAnalytics` only when `formAnalytics={true}` (default off). Pass `cmsEntryId` for `cms_entry_id`. Custom forms: `useFormAnalytics` from `@se-studio/core-ui/form-analytics`.
|
|
46
47
|
- Preserve full `redirectUri` from HubSpot (do not strip host)
|
|
47
48
|
|
|
48
49
|
```tsx
|
|
49
|
-
useHubspotSubmit({ portalId, formDefinition, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage })
|
|
50
|
+
useHubspotSubmit({ portalId, formDefinition, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, formAnalytics: true })
|
|
50
51
|
// or
|
|
51
|
-
<HubspotDynamicForm submittingButtonText={…} submitErrorText={…} submitTooFastText={…} redirectUrlOverride={url} onSuccess={fn} onError={fn} />
|
|
52
|
+
<HubspotDynamicForm formAnalytics submittingButtonText={…} submitErrorText={…} submitTooFastText={…} redirectUrlOverride={url} onSuccess={fn} onError={fn} />
|
|
52
53
|
```
|
|
53
54
|
|
|
54
55
|
After HubSpot form editor changes, revalidate: `revalidateTag(hubspotFormTag(formId), { expire: 0 })` (definitions cached ~1h). Do not use `'max'` — that is stale-while-revalidate.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/hubspot",
|
|
3
|
-
"version": "17.
|
|
3
|
+
"version": "17.4.0",
|
|
4
4
|
"description": "HubSpot tracking and API-driven form rendering for Next.js marketing sites",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
],
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"@se-studio/core-data-types": "1.13.7",
|
|
44
|
-
"@se-studio/core-ui": "1.
|
|
44
|
+
"@se-studio/core-ui": "1.35.0",
|
|
45
45
|
"next": ">=15.5.0 <17",
|
|
46
46
|
"react": "^19.0.0",
|
|
47
47
|
"react-dom": "^19.0.0"
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@biomejs/biome": "^2.5.12",
|
|
56
56
|
"@se-studio/core-data-types": "1.13.7",
|
|
57
|
-
"@se-studio/core-ui": "1.
|
|
57
|
+
"@se-studio/core-ui": "1.35.0",
|
|
58
58
|
"@types/node": "^24.13.3",
|
|
59
59
|
"@types/react": "^19.2.18",
|
|
60
60
|
"@types/react-dom": "^19.2.5",
|