@se-studio/hubspot 17.5.7 → 17.5.9
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 +16 -0
- package/README.md +1 -1
- package/dist/forms/client/HubspotDynamicForm.d.ts +10 -1
- package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -1
- package/dist/forms/client/HubspotDynamicForm.js +6 -5
- package/dist/forms/client/HubspotDynamicForm.js.map +1 -1
- package/dist/forms/client/useHubspotSubmit.d.ts +12 -2
- package/dist/forms/client/useHubspotSubmit.d.ts.map +1 -1
- package/dist/forms/client/useHubspotSubmit.js +5 -2
- package/dist/forms/client/useHubspotSubmit.js.map +1 -1
- package/docs/llms.md +2 -2
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @se-studio/hubspot
|
|
2
2
|
|
|
3
|
+
## 17.5.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Gate `form_view` on viewport intersection (default threshold 0.5) instead of mount. Opt-in `formAnalytics` sites get a correct impression metric; `form_start` / `form_submit` / `form_error` are unchanged. HubSpot wrappers attach the analytics `rootRef` to the form. Use `viewTrigger: 'mount'` to restore the previous behaviour.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @se-studio/core-ui@1.35.10
|
|
10
|
+
|
|
11
|
+
## 17.5.8
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies
|
|
16
|
+
- @se-studio/core-data-types@2.0.1
|
|
17
|
+
- @se-studio/core-ui@1.35.9
|
|
18
|
+
|
|
3
19
|
## 17.5.7
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -161,7 +161,7 @@ These forms are **not** HubSpot’s native embed script — the package rebuilds
|
|
|
161
161
|
|
|
162
162
|
**`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.
|
|
163
163
|
|
|
164
|
-
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`.
|
|
164
|
+
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. `form_view` fires once when the form first enters the viewport (threshold 0.5). Import helpers from `@se-studio/core-ui/form-analytics`. Pass `cmsEntryId` for `cms_entry_id`.
|
|
165
165
|
|
|
166
166
|
```tsx
|
|
167
167
|
<HubspotDynamicForm
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { FormViewTrigger } from '@se-studio/core-ui/form-analytics';
|
|
1
2
|
import type { HubspotFieldResponse, HubspotFormClassNames, HubspotFormDefinition } from '../types';
|
|
2
3
|
/**
|
|
3
4
|
* Seed form values from definition defaults, then URL/session marketing params
|
|
@@ -47,6 +48,14 @@ export interface HubspotDynamicFormProps {
|
|
|
47
48
|
* Opt in to form analytics. Default false (no events on upgrade).
|
|
48
49
|
*/
|
|
49
50
|
formAnalytics?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* When to fire `form_view` (only if `formAnalytics` is true). Default `viewport`.
|
|
53
|
+
*/
|
|
54
|
+
viewTrigger?: FormViewTrigger;
|
|
55
|
+
/**
|
|
56
|
+
* IntersectionObserver threshold for viewport `form_view`. Default 0.5.
|
|
57
|
+
*/
|
|
58
|
+
viewThreshold?: number;
|
|
50
59
|
}
|
|
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;
|
|
60
|
+
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, submitTooFastText, cmsEntryId, step, formAnalytics, viewTrigger, viewThreshold, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
52
61
|
//# sourceMappingURL=HubspotDynamicForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGzE,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;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;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,EACb,WAAW,EACX,aAAa,GACd,EAAE,uBAAuB,+BAuJzB"}
|
|
@@ -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
|
|
4
|
+
import { useCallback, useEffect, useMemo } 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, cmsEntryId, step, formAnalytics, }) {
|
|
83
|
+
export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, onError, redirectUrlOverride, submittingButtonText, submitErrorText, submitTooFastText, cmsEntryId, step, formAnalytics, viewTrigger, viewThreshold, }) {
|
|
84
84
|
const classNames = useMemo(() => ({ ...DEFAULT_CLASS_NAMES, ...classNamesProp }), [classNamesProp]);
|
|
85
|
-
const { handleSubmit, handleInputChange, handleInvalid, message, formData, setFormData, isSubmitting, submitError, } = useHubspotSubmit({
|
|
85
|
+
const { handleSubmit, handleInputChange, handleInvalid, message, formData, setFormData, isSubmitting, submitError, rootRef: formRef, } = useHubspotSubmit({
|
|
86
86
|
portalId,
|
|
87
87
|
formDefinition,
|
|
88
88
|
ipAddress,
|
|
@@ -94,6 +94,8 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
94
94
|
cmsEntryId,
|
|
95
95
|
step,
|
|
96
96
|
formAnalytics,
|
|
97
|
+
viewTrigger,
|
|
98
|
+
viewThreshold,
|
|
97
99
|
});
|
|
98
100
|
useEffect(() => {
|
|
99
101
|
setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
|
|
@@ -116,7 +118,6 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
116
118
|
}, [classNames, dependentFieldsMap, formData, handleInputChange, visibleFields]);
|
|
117
119
|
const buttonText = submitButtonText ?? formDefinition.submitButtonText;
|
|
118
120
|
const pendingButtonText = submittingButtonText?.trim() || 'Submitting…';
|
|
119
|
-
const formRef = useRef(null);
|
|
120
121
|
useEffect(() => {
|
|
121
122
|
const form = formRef.current;
|
|
122
123
|
if (!form) {
|
|
@@ -129,7 +130,7 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
|
|
|
129
130
|
return () => {
|
|
130
131
|
form.removeEventListener('invalid', onInvalidCapture, true);
|
|
131
132
|
};
|
|
132
|
-
}, [handleInvalid]);
|
|
133
|
+
}, [handleInvalid, formRef]);
|
|
133
134
|
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 })] }));
|
|
134
135
|
}
|
|
135
136
|
//# sourceMappingURL=HubspotDynamicForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type FormAnalyticsErrorInfo, type FormAnalyticsIdentity } from '@se-studio/core-ui/form-analytics';
|
|
1
|
+
import { type FormAnalyticsErrorInfo, type FormAnalyticsIdentity, type FormViewTrigger } from '@se-studio/core-ui/form-analytics';
|
|
2
|
+
import { type RefObject } from 'react';
|
|
2
3
|
import type { HubspotFieldResponse, HubspotFormDefinition } from '../types';
|
|
3
4
|
export declare function hubspotFormAnalyticsIdentity(formDefinition: HubspotFormDefinition, extras?: Pick<FormAnalyticsIdentity, 'cms_entry_id' | 'step' | 'form_type'>): FormAnalyticsIdentity;
|
|
4
5
|
export declare function classifyHubspotFormAnalyticsError(kind: 'too_fast' | 'api' | 'network' | 'redirect' | 'validation'): FormAnalyticsErrorInfo;
|
|
@@ -44,8 +45,16 @@ export interface UseHubspotSubmitOptions {
|
|
|
44
45
|
* Default false so existing sites see no new events on upgrade.
|
|
45
46
|
*/
|
|
46
47
|
formAnalytics?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* When to fire `form_view` (only if `formAnalytics` is true). Default `viewport`.
|
|
50
|
+
*/
|
|
51
|
+
viewTrigger?: FormViewTrigger;
|
|
52
|
+
/**
|
|
53
|
+
* IntersectionObserver threshold for viewport `form_view`. Default 0.5.
|
|
54
|
+
*/
|
|
55
|
+
viewThreshold?: number;
|
|
47
56
|
}
|
|
48
|
-
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, cmsEntryId, step, formAnalytics, }: UseHubspotSubmitOptions): {
|
|
57
|
+
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, cmsEntryId, step, formAnalytics, viewTrigger, viewThreshold, }: UseHubspotSubmitOptions): {
|
|
49
58
|
handleSubmit: (e: React.FormEvent) => void;
|
|
50
59
|
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
51
60
|
handleInvalid: () => void;
|
|
@@ -54,5 +63,6 @@ export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress,
|
|
|
54
63
|
setFormData: import("react").Dispatch<import("react").SetStateAction<Record<string, HubspotFieldResponse>>>;
|
|
55
64
|
isSubmitting: boolean;
|
|
56
65
|
submitError: string | null;
|
|
66
|
+
rootRef: RefObject<HTMLFormElement | null>;
|
|
57
67
|
};
|
|
58
68
|
//# sourceMappingURL=useHubspotSubmit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHubspotSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EAErB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,KAAK,SAAS,EAA4C,MAAM,OAAO,CAAC;AAGjF,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;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;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,EACrB,WAAW,EACX,aAAa,GACd,EAAE,uBAAuB;sBA8FlB,KAAK,CAAC,SAAS;2BA5ChB,KAAK,CAAC,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;;;;;;;aAwL5D,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC;EAExD"}
|
|
@@ -52,14 +52,16 @@ function resolveRedirectAfterSuccess(result, formDefinition, redirectUrlOverride
|
|
|
52
52
|
}
|
|
53
53
|
return undefined;
|
|
54
54
|
}
|
|
55
|
-
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, cmsEntryId, step, formAnalytics = false, }) {
|
|
55
|
+
export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, onError, redirectUrlOverride, errorMessage, tooFastMessage, cmsEntryId, step, formAnalytics = false, viewTrigger, viewThreshold, }) {
|
|
56
56
|
const router = useRouter();
|
|
57
|
-
const { markStart, markSubmit, markError } = useFormAnalytics({
|
|
57
|
+
const { markStart, markSubmit, markError, rootRef } = useFormAnalytics({
|
|
58
58
|
enabled: formAnalytics,
|
|
59
59
|
identity: hubspotFormAnalyticsIdentity(formDefinition, {
|
|
60
60
|
cms_entry_id: cmsEntryId,
|
|
61
61
|
step,
|
|
62
62
|
}),
|
|
63
|
+
viewTrigger,
|
|
64
|
+
viewThreshold,
|
|
63
65
|
});
|
|
64
66
|
const visitorError = errorMessage?.trim() || HUBSPOT_FORM_SUBMIT_ERROR_MESSAGE;
|
|
65
67
|
const visitorTooFast = tooFastMessage?.trim() || errorMessage?.trim() || HUBSPOT_SUBMIT_TOO_FAST_MESSAGE;
|
|
@@ -253,6 +255,7 @@ export function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSucces
|
|
|
253
255
|
setFormData,
|
|
254
256
|
isSubmitting,
|
|
255
257
|
submitError,
|
|
258
|
+
rootRef: rootRef,
|
|
256
259
|
};
|
|
257
260
|
}
|
|
258
261
|
//# 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,EACL,qBAAqB,
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"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"}
|
package/docs/llms.md
CHANGED
|
@@ -27,7 +27,7 @@ Policy (`docs/PHILOSOPHY.md` R7.6). Implementation gaps are tracked as se-core #
|
|
|
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
|
|
30
|
+
Standard analytics names for the form lifecycle: `form_view` (viewport, threshold 0.5), `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
|
|
|
@@ -43,7 +43,7 @@ Priority: `redirectUrlOverride` → submit `redirectUri` → form `postSubmitAct
|
|
|
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
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
|
+
- `useHubspotSubmit` emits `form_view`, `form_start`, `form_submit`, `form_error` through `useAnalytics` only when `formAnalytics={true}` (default off). `form_view` is viewport-gated (threshold 0.5); the hook returns `rootRef` and `HubspotDynamicForm` attaches it to `<form>`. Pass `cmsEntryId` for `cms_entry_id`. Custom forms: `useFormAnalytics` from `@se-studio/core-ui/form-analytics` and attach `rootRef`.
|
|
47
47
|
- Preserve full `redirectUri` from HubSpot (do not strip host)
|
|
48
48
|
|
|
49
49
|
```tsx
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/hubspot",
|
|
3
|
-
"version": "17.5.
|
|
3
|
+
"version": "17.5.9",
|
|
4
4
|
"description": "HubSpot tracking and API-driven form rendering for Next.js marketing sites",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"react"
|
|
41
41
|
],
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@se-studio/core-data-types": "2.0.
|
|
44
|
-
"@se-studio/core-ui": "1.35.
|
|
43
|
+
"@se-studio/core-data-types": "2.0.1",
|
|
44
|
+
"@se-studio/core-ui": "1.35.10",
|
|
45
45
|
"next": ">=15.5.0 <17",
|
|
46
46
|
"react": "^19.0.0",
|
|
47
47
|
"react-dom": "^19.0.0"
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@biomejs/biome": "^2.5.15",
|
|
56
|
-
"@se-studio/core-data-types": "2.0.
|
|
57
|
-
"@se-studio/core-ui": "1.35.
|
|
56
|
+
"@se-studio/core-data-types": "2.0.1",
|
|
57
|
+
"@se-studio/core-ui": "1.35.10",
|
|
58
58
|
"@types/node": "^24.13.3",
|
|
59
59
|
"@types/react": "^19.3.0",
|
|
60
60
|
"@types/react-dom": "^19.3.0",
|