@se-studio/hubspot 0.0.0-next16-20260822103555
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 +509 -0
- package/README.md +146 -0
- package/dist/external/createHubspotFormExternalRenderer.d.ts +23 -0
- package/dist/external/createHubspotFormExternalRenderer.d.ts.map +1 -0
- package/dist/external/createHubspotFormExternalRenderer.js +26 -0
- package/dist/external/createHubspotFormExternalRenderer.js.map +1 -0
- package/dist/forms/client/HubspotDynamicForm.d.ts +27 -0
- package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -0
- package/dist/forms/client/HubspotDynamicForm.js +113 -0
- package/dist/forms/client/HubspotDynamicForm.js.map +1 -0
- package/dist/forms/client/dependentFields.d.ts +11 -0
- package/dist/forms/client/dependentFields.d.ts.map +1 -0
- package/dist/forms/client/dependentFields.js +39 -0
- package/dist/forms/client/dependentFields.js.map +1 -0
- package/dist/forms/client/getCookieValue.d.ts +2 -0
- package/dist/forms/client/getCookieValue.d.ts.map +1 -0
- package/dist/forms/client/getCookieValue.js +8 -0
- package/dist/forms/client/getCookieValue.js.map +1 -0
- package/dist/forms/client/marketingParams.d.ts +28 -0
- package/dist/forms/client/marketingParams.d.ts.map +1 -0
- package/dist/forms/client/marketingParams.js +164 -0
- package/dist/forms/client/marketingParams.js.map +1 -0
- package/dist/forms/client/navigateAfterSubmit.d.ts +8 -0
- package/dist/forms/client/navigateAfterSubmit.d.ts.map +1 -0
- package/dist/forms/client/navigateAfterSubmit.js +20 -0
- package/dist/forms/client/navigateAfterSubmit.js.map +1 -0
- package/dist/forms/client/renderHubspotField.d.ts +11 -0
- package/dist/forms/client/renderHubspotField.d.ts.map +1 -0
- package/dist/forms/client/renderHubspotField.js +61 -0
- package/dist/forms/client/renderHubspotField.js.map +1 -0
- package/dist/forms/client/useHubspotSubmit.d.ts +25 -0
- package/dist/forms/client/useHubspotSubmit.d.ts.map +1 -0
- package/dist/forms/client/useHubspotSubmit.js +97 -0
- package/dist/forms/client/useHubspotSubmit.js.map +1 -0
- package/dist/forms/server/getFormDefinition.d.ts +7 -0
- package/dist/forms/server/getFormDefinition.d.ts.map +1 -0
- package/dist/forms/server/getFormDefinition.js +24 -0
- package/dist/forms/server/getFormDefinition.js.map +1 -0
- package/dist/forms/server/hubspotFormTag.d.ts +3 -0
- package/dist/forms/server/hubspotFormTag.d.ts.map +1 -0
- package/dist/forms/server/hubspotFormTag.js +5 -0
- package/dist/forms/server/hubspotFormTag.js.map +1 -0
- package/dist/forms/server/mapApiResponse.d.ts +4 -0
- package/dist/forms/server/mapApiResponse.d.ts.map +1 -0
- package/dist/forms/server/mapApiResponse.js +105 -0
- package/dist/forms/server/mapApiResponse.js.map +1 -0
- package/dist/forms/server/submitForm.d.ts +8 -0
- package/dist/forms/server/submitForm.d.ts.map +1 -0
- package/dist/forms/server/submitForm.js +30 -0
- package/dist/forms/server/submitForm.js.map +1 -0
- package/dist/forms/types.d.ts +102 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/types.js +2 -0
- package/dist/forms/types.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +6 -0
- package/dist/server.js.map +1 -0
- package/dist/tracking/HubSpotAnalyticsAdapter.d.ts +23 -0
- package/dist/tracking/HubSpotAnalyticsAdapter.d.ts.map +1 -0
- package/dist/tracking/HubSpotAnalyticsAdapter.js +84 -0
- package/dist/tracking/HubSpotAnalyticsAdapter.js.map +1 -0
- package/dist/tracking/createHubSpotBootstrapScript.d.ts +9 -0
- package/dist/tracking/createHubSpotBootstrapScript.d.ts.map +1 -0
- package/dist/tracking/createHubSpotBootstrapScript.js +17 -0
- package/dist/tracking/createHubSpotBootstrapScript.js.map +1 -0
- package/docs/llms.md +46 -0
- package/package.json +76 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { HubspotFieldResponse, HubspotFormClassNames, HubspotFormDefinition } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Seed form values from definition defaults, then URL/session marketing params
|
|
4
|
+
* for empty hidden fields, then CMS hiddenFields / initialValues (highest priority).
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildDefaultValues(formDefinition: HubspotFormDefinition, hiddenFields?: Record<string, string>, initialValues?: Record<string, string>, options?: {
|
|
7
|
+
applyMarketingParams?: boolean;
|
|
8
|
+
}): Record<string, HubspotFieldResponse>;
|
|
9
|
+
export interface HubspotDynamicFormProps {
|
|
10
|
+
portalId: string;
|
|
11
|
+
formDefinition: HubspotFormDefinition;
|
|
12
|
+
submitButtonText?: string;
|
|
13
|
+
classNames?: HubspotFormClassNames;
|
|
14
|
+
hiddenFields?: Record<string, string>;
|
|
15
|
+
initialValues?: Record<string, string>;
|
|
16
|
+
ipAddress?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Side-effect after successful submit (does not suppress HubSpot thank-you / redirect).
|
|
19
|
+
*/
|
|
20
|
+
onSuccess?: (fields: Record<string, HubspotFieldResponse>) => void;
|
|
21
|
+
/**
|
|
22
|
+
* CMS redirect override (e.g. externalUrl / data.successRedirectUrl). Wins over HubSpot settings.
|
|
23
|
+
*/
|
|
24
|
+
redirectUrlOverride?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, redirectUrlOverride, }: HubspotDynamicFormProps): import("react").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=HubspotDynamicForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAyBnG;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,EACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CA8CtC;AAgBD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,mBAAmB,GACpB,EAAE,uBAAuB,+BAyGzB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { decode } from 'html-entities';
|
|
4
|
+
import { useCallback, useEffect, useMemo } from 'react';
|
|
5
|
+
import { collectVisibleFields } from './dependentFields';
|
|
6
|
+
import { applyMarketingParamsToHiddenFields, captureMarketingParams } from './marketingParams';
|
|
7
|
+
import { isSupportedFieldType, renderHubspotField } from './renderHubspotField';
|
|
8
|
+
import { useHubspotSubmit } from './useHubspotSubmit';
|
|
9
|
+
const DEFAULT_CLASS_NAMES = {
|
|
10
|
+
form: 'flex flex-col gap-4',
|
|
11
|
+
fieldGroup: 'flex flex-col gap-4',
|
|
12
|
+
field: 'flex flex-col gap-1',
|
|
13
|
+
label: 'font-medium',
|
|
14
|
+
description: 'text-sm opacity-80',
|
|
15
|
+
input: 'border px-3 py-2',
|
|
16
|
+
textarea: 'border px-3 py-2',
|
|
17
|
+
select: 'border px-3 py-2',
|
|
18
|
+
checkboxGroup: 'flex flex-col gap-2',
|
|
19
|
+
checkboxLabel: 'flex items-center gap-2',
|
|
20
|
+
radioGroup: 'flex flex-col gap-2',
|
|
21
|
+
radioLabel: 'flex items-center gap-2',
|
|
22
|
+
submitButton: 'border px-4 py-2 font-medium',
|
|
23
|
+
message: 'text-sm',
|
|
24
|
+
legalConsent: 'text-sm flex flex-col gap-2',
|
|
25
|
+
richText: 'text-sm',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Seed form values from definition defaults, then URL/session marketing params
|
|
29
|
+
* for empty hidden fields, then CMS hiddenFields / initialValues (highest priority).
|
|
30
|
+
*/
|
|
31
|
+
export function buildDefaultValues(formDefinition, hiddenFields, initialValues, options) {
|
|
32
|
+
let defaults = {};
|
|
33
|
+
for (const group of formDefinition.fieldGroups) {
|
|
34
|
+
for (const field of group.fields) {
|
|
35
|
+
if (field.hidden && field.defaultValues?.length) {
|
|
36
|
+
defaults[field.name] = {
|
|
37
|
+
name: field.name,
|
|
38
|
+
objectTypeId: field.objectTypeId,
|
|
39
|
+
value: field.defaultValues.length > 1 ? field.defaultValues : (field.defaultValues[0] ?? ''),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
else if (field.hidden && field.defaultValue) {
|
|
43
|
+
defaults[field.name] = {
|
|
44
|
+
name: field.name,
|
|
45
|
+
objectTypeId: field.objectTypeId,
|
|
46
|
+
value: field.defaultValue,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// URL / session → empty hidden fields (client-only when applyMarketingParams is true)
|
|
52
|
+
if (options?.applyMarketingParams !== false) {
|
|
53
|
+
captureMarketingParams();
|
|
54
|
+
defaults = applyMarketingParamsToHiddenFields(formDefinition, defaults);
|
|
55
|
+
}
|
|
56
|
+
// CMS static values win over marketing params
|
|
57
|
+
for (const [name, value] of Object.entries(hiddenFields ?? {})) {
|
|
58
|
+
defaults[name] = {
|
|
59
|
+
name,
|
|
60
|
+
objectTypeId: defaults[name]?.objectTypeId ?? '0-1',
|
|
61
|
+
value,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
for (const [name, value] of Object.entries(initialValues ?? {})) {
|
|
65
|
+
defaults[name] = {
|
|
66
|
+
name,
|
|
67
|
+
objectTypeId: defaults[name]?.objectTypeId ?? '0-1',
|
|
68
|
+
value,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return defaults;
|
|
72
|
+
}
|
|
73
|
+
function renderRichText(content, className) {
|
|
74
|
+
if (!content?.includes('<')) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const cleanContent = content.replace(/<p[^>]+>/g, '<p>');
|
|
78
|
+
return (_jsx("div", { className: className,
|
|
79
|
+
// biome-ignore lint/security/noDangerouslySetInnerHtml: HubSpot form rich text from API
|
|
80
|
+
dangerouslySetInnerHTML: { __html: cleanContent } }));
|
|
81
|
+
}
|
|
82
|
+
export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText, classNames: classNamesProp, hiddenFields, initialValues, ipAddress, onSuccess, redirectUrlOverride, }) {
|
|
83
|
+
const classNames = useMemo(() => ({ ...DEFAULT_CLASS_NAMES, ...classNamesProp }), [classNamesProp]);
|
|
84
|
+
const { handleSubmit, handleInputChange, message, formData, setFormData } = useHubspotSubmit({
|
|
85
|
+
portalId,
|
|
86
|
+
formDefinition,
|
|
87
|
+
ipAddress,
|
|
88
|
+
onSuccess,
|
|
89
|
+
redirectUrlOverride,
|
|
90
|
+
});
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
|
|
93
|
+
}, [formDefinition, hiddenFields, initialValues, setFormData]);
|
|
94
|
+
const { visibleFields, dependentFieldsMap } = collectVisibleFields(formDefinition.fieldGroups, formData);
|
|
95
|
+
const renderField = useCallback((fieldName, field) => {
|
|
96
|
+
if (field.hidden || !visibleFields.has(fieldName)) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const actualField = dependentFieldsMap[fieldName] ?? field;
|
|
100
|
+
if (!isSupportedFieldType(actualField.fieldType)) {
|
|
101
|
+
return (_jsxs("p", { className: classNames.message, children: ["Unsupported field type: ", actualField.fieldType] }, fieldName));
|
|
102
|
+
}
|
|
103
|
+
return renderHubspotField({
|
|
104
|
+
field: actualField,
|
|
105
|
+
formData,
|
|
106
|
+
handleInputChange,
|
|
107
|
+
classNames,
|
|
108
|
+
});
|
|
109
|
+
}, [classNames, dependentFieldsMap, formData, handleInputChange, visibleFields]);
|
|
110
|
+
const buttonText = submitButtonText ?? formDefinition.submitButtonText;
|
|
111
|
+
return (_jsxs("form", { onSubmit: handleSubmit, className: classNames.form, "data-hsforms-manual": "true", "data-hs-do-not-collect": "true", children: [formDefinition.recaptchaEnabled && (_jsx("p", { className: classNames.message, children: "This form requires CAPTCHA in HubSpot. Configure bot protection for your deployment." })), formDefinition.fieldGroups.map((group) => (_jsxs("div", { className: classNames.fieldGroup, children: [renderRichText(group.richText, classNames.richText), group.fields.map((field) => renderField(field.name, field))] }, `${group.groupType}-${group.richText ?? group.fields.map((f) => f.name).join('-')}`))), formDefinition.legalConsentOptions && (_jsxs("div", { className: classNames.legalConsent, children: [formDefinition.legalConsentOptions.privacyText && (_jsx("p", { children: decode(formDefinition.legalConsentOptions.privacyText) })), formDefinition.legalConsentOptions.consentToProcessCheckboxLabel && (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: true, name: "consentToProcess" }), _jsx("span", { children: decode(formDefinition.legalConsentOptions.consentToProcessCheckboxLabel) })] })), formDefinition.legalConsentOptions.communicationsCheckboxes?.map((checkbox) => (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: checkbox.required, name: `communication-${checkbox.subscriptionTypeId ?? checkbox.label}` }), _jsx("span", { children: decode(checkbox.label) })] }, checkbox.label)))] })), _jsx("button", { type: "submit", className: classNames.submitButton, children: decode(buttonText) }), message && _jsx("p", { className: classNames.message, children: message })] }));
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=HubspotDynamicForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HubspotDependentCondition, HubspotFormField } from '../types';
|
|
2
|
+
export declare function checkDependentCondition(condition: HubspotDependentCondition, fieldValue: string | string[] | undefined): boolean;
|
|
3
|
+
export declare function collectVisibleFields(fieldGroups: {
|
|
4
|
+
fields: HubspotFormField[];
|
|
5
|
+
}[], formData: Record<string, {
|
|
6
|
+
value: string | string[];
|
|
7
|
+
}>): {
|
|
8
|
+
visibleFields: Set<string>;
|
|
9
|
+
dependentFieldsMap: Record<string, HubspotFormField>;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=dependentFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependentFields.d.ts","sourceRoot":"","sources":["../../../src/forms/client/dependentFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5E,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,yBAAyB,EACpC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GACxC,OAAO,CAmBT;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE;IAAE,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAAE,EAAE,EAC7C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,CAAC,GACrD;IACD,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACtD,CAqBA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export function checkDependentCondition(condition, fieldValue) {
|
|
2
|
+
if (!condition.values.length || fieldValue === undefined) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
switch (condition.operator) {
|
|
6
|
+
case 'set_any':
|
|
7
|
+
if (Array.isArray(fieldValue)) {
|
|
8
|
+
return fieldValue.some((v) => condition.values.includes(v));
|
|
9
|
+
}
|
|
10
|
+
return condition.values.includes(fieldValue);
|
|
11
|
+
case 'set_not_any':
|
|
12
|
+
if (Array.isArray(fieldValue)) {
|
|
13
|
+
return !fieldValue.some((v) => condition.values.includes(v));
|
|
14
|
+
}
|
|
15
|
+
return Boolean(fieldValue) && !condition.values.includes(fieldValue);
|
|
16
|
+
default:
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function collectVisibleFields(fieldGroups, formData) {
|
|
21
|
+
const visibleFields = new Set();
|
|
22
|
+
const dependentFieldsMap = {};
|
|
23
|
+
for (const group of fieldGroups) {
|
|
24
|
+
for (const field of group.fields) {
|
|
25
|
+
if (!field.hidden) {
|
|
26
|
+
visibleFields.add(field.name);
|
|
27
|
+
}
|
|
28
|
+
for (const dependent of field.dependentFields ?? []) {
|
|
29
|
+
dependentFieldsMap[dependent.dependentField.name] = dependent.dependentField;
|
|
30
|
+
const fieldValue = formData[field.name]?.value;
|
|
31
|
+
if (checkDependentCondition(dependent.dependentCondition, fieldValue)) {
|
|
32
|
+
visibleFields.add(dependent.dependentField.name);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { visibleFields, dependentFieldsMap };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=dependentFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependentFields.js","sourceRoot":"","sources":["../../../src/forms/client/dependentFields.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CACrC,SAAoC,EACpC,UAAyC;IAEzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC3B,KAAK,SAAS;YACZ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/C,KAAK,aAAa;YAChB,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvE;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAA6C,EAC7C,QAAsD;IAKtD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,kBAAkB,GAAqC,EAAE,CAAC;IAEhE,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;YAED,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;gBACpD,kBAAkB,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC;gBAC7E,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;gBAC/C,IAAI,uBAAuB,CAAC,SAAS,CAAC,kBAAkB,EAAE,UAAU,CAAC,EAAE,CAAC;oBACtE,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCookieValue.d.ts","sourceRoot":"","sources":["../../../src/forms/client/getCookieValue.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM/D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function getCookieValue(name) {
|
|
2
|
+
if (typeof document === 'undefined') {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
const match = document.cookie.match(new RegExp(`(?:^|; )${name}=([^;]*)`));
|
|
6
|
+
return match?.[1] ? decodeURIComponent(match[1]) : undefined;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=getCookieValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCookieValue.js","sourceRoot":"","sources":["../../../src/forms/client/getCookieValue.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC;IAC3E,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { HubspotFieldResponse, HubspotFormDefinition } from '../types';
|
|
2
|
+
/** sessionStorage key for first-touch marketing params (cross-page form attribution). */
|
|
3
|
+
export declare const MARKETING_PARAMS_STORAGE_KEY = "se_studio_marketing_params";
|
|
4
|
+
/**
|
|
5
|
+
* Standard marketing query keys to capture even when no matching form field exists yet.
|
|
6
|
+
* OM1 contact/demo/webinar forms use the five `utm_*` contact properties.
|
|
7
|
+
*/
|
|
8
|
+
export declare const KNOWN_MARKETING_PARAM_KEYS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "gclid", "fbclid", "msclkid"];
|
|
9
|
+
/**
|
|
10
|
+
* Read current URL marketing params and merge first-touch into sessionStorage
|
|
11
|
+
* (existing session keys are not overwritten).
|
|
12
|
+
*
|
|
13
|
+
* Safe to call on every page load so multi-page journeys retain UTMs when the
|
|
14
|
+
* form page has no query string.
|
|
15
|
+
*/
|
|
16
|
+
export declare function captureMarketingParams(): Record<string, string>;
|
|
17
|
+
/**
|
|
18
|
+
* Marketing params for form fill: first-touch session, then current URL
|
|
19
|
+
* (URL wins for keys present on this page — last-touch on the form URL).
|
|
20
|
+
*/
|
|
21
|
+
export declare function getMarketingParams(): Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Fill empty hidden form fields from marketing params (URL + session).
|
|
24
|
+
* Does not overwrite existing non-empty values (definition defaults or prior fills).
|
|
25
|
+
* Preserves each field's `objectTypeId` from the form definition.
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyMarketingParamsToHiddenFields(formDefinition: HubspotFormDefinition, defaults: Record<string, HubspotFieldResponse>, marketingParams?: Record<string, string>): Record<string, HubspotFieldResponse>;
|
|
28
|
+
//# sourceMappingURL=marketingParams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketingParams.d.ts","sourceRoot":"","sources":["../../../src/forms/client/marketingParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAoB,MAAM,UAAU,CAAC;AAE9F,yFAAyF;AACzF,eAAO,MAAM,4BAA4B,+BAA+B,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,0BAA0B,gHAS7B,CAAC;AAwDX;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8B/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO3D;AA8BD;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,cAAc,EAAE,qBAAqB,EACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC9C,eAAe,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAwB,GAC7D,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAoBtC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/** sessionStorage key for first-touch marketing params (cross-page form attribution). */
|
|
2
|
+
export const MARKETING_PARAMS_STORAGE_KEY = 'se_studio_marketing_params';
|
|
3
|
+
/**
|
|
4
|
+
* Standard marketing query keys to capture even when no matching form field exists yet.
|
|
5
|
+
* OM1 contact/demo/webinar forms use the five `utm_*` contact properties.
|
|
6
|
+
*/
|
|
7
|
+
export const KNOWN_MARKETING_PARAM_KEYS = [
|
|
8
|
+
'utm_source',
|
|
9
|
+
'utm_medium',
|
|
10
|
+
'utm_campaign',
|
|
11
|
+
'utm_term',
|
|
12
|
+
'utm_content',
|
|
13
|
+
'gclid',
|
|
14
|
+
'fbclid',
|
|
15
|
+
'msclkid',
|
|
16
|
+
];
|
|
17
|
+
function isBrowser() {
|
|
18
|
+
return typeof window !== 'undefined' && typeof window.sessionStorage !== 'undefined';
|
|
19
|
+
}
|
|
20
|
+
function readSessionParams() {
|
|
21
|
+
if (!isBrowser()) {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const raw = window.sessionStorage.getItem(MARKETING_PARAMS_STORAGE_KEY);
|
|
26
|
+
if (!raw) {
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
const parsed = JSON.parse(raw);
|
|
30
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
const result = {};
|
|
34
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
35
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
36
|
+
result[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function writeSessionParams(params) {
|
|
46
|
+
if (!isBrowser()) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
window.sessionStorage.setItem(MARKETING_PARAMS_STORAGE_KEY, JSON.stringify(params));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Ignore quota / private mode failures
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function readUrlParams() {
|
|
57
|
+
if (!isBrowser()) {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
const result = {};
|
|
61
|
+
const search = new URLSearchParams(window.location.search);
|
|
62
|
+
for (const [key, value] of search.entries()) {
|
|
63
|
+
if (value) {
|
|
64
|
+
result[key] = value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Read current URL marketing params and merge first-touch into sessionStorage
|
|
71
|
+
* (existing session keys are not overwritten).
|
|
72
|
+
*
|
|
73
|
+
* Safe to call on every page load so multi-page journeys retain UTMs when the
|
|
74
|
+
* form page has no query string.
|
|
75
|
+
*/
|
|
76
|
+
export function captureMarketingParams() {
|
|
77
|
+
if (!isBrowser()) {
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
const stored = readSessionParams();
|
|
81
|
+
const fromUrl = readUrlParams();
|
|
82
|
+
let changed = false;
|
|
83
|
+
for (const key of KNOWN_MARKETING_PARAM_KEYS) {
|
|
84
|
+
const value = fromUrl[key];
|
|
85
|
+
if (value && !stored[key]) {
|
|
86
|
+
stored[key] = value;
|
|
87
|
+
changed = true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Also first-touch any other query keys (matches HubSpot native “param name = field name”)
|
|
91
|
+
for (const [key, value] of Object.entries(fromUrl)) {
|
|
92
|
+
if (value && !stored[key]) {
|
|
93
|
+
stored[key] = value;
|
|
94
|
+
changed = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (changed) {
|
|
98
|
+
writeSessionParams(stored);
|
|
99
|
+
}
|
|
100
|
+
return stored;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Marketing params for form fill: first-touch session, then current URL
|
|
104
|
+
* (URL wins for keys present on this page — last-touch on the form URL).
|
|
105
|
+
*/
|
|
106
|
+
export function getMarketingParams() {
|
|
107
|
+
if (!isBrowser()) {
|
|
108
|
+
return {};
|
|
109
|
+
}
|
|
110
|
+
const stored = captureMarketingParams();
|
|
111
|
+
const fromUrl = readUrlParams();
|
|
112
|
+
return { ...stored, ...fromUrl };
|
|
113
|
+
}
|
|
114
|
+
function hasNonEmptyValue(field) {
|
|
115
|
+
if (!field) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
const { value } = field;
|
|
119
|
+
if (Array.isArray(value)) {
|
|
120
|
+
return value.some((entry) => String(entry).length > 0);
|
|
121
|
+
}
|
|
122
|
+
return String(value).length > 0;
|
|
123
|
+
}
|
|
124
|
+
function collectHiddenFields(formDefinition) {
|
|
125
|
+
const hidden = [];
|
|
126
|
+
for (const group of formDefinition.fieldGroups) {
|
|
127
|
+
for (const field of group.fields) {
|
|
128
|
+
if (field.hidden) {
|
|
129
|
+
hidden.push(field);
|
|
130
|
+
}
|
|
131
|
+
for (const dep of field.dependentFields ?? []) {
|
|
132
|
+
if (dep.dependentField.hidden) {
|
|
133
|
+
hidden.push(dep.dependentField);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return hidden;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Fill empty hidden form fields from marketing params (URL + session).
|
|
142
|
+
* Does not overwrite existing non-empty values (definition defaults or prior fills).
|
|
143
|
+
* Preserves each field's `objectTypeId` from the form definition.
|
|
144
|
+
*/
|
|
145
|
+
export function applyMarketingParamsToHiddenFields(formDefinition, defaults, marketingParams = getMarketingParams()) {
|
|
146
|
+
const result = { ...defaults };
|
|
147
|
+
const hiddenFields = collectHiddenFields(formDefinition);
|
|
148
|
+
for (const field of hiddenFields) {
|
|
149
|
+
const paramValue = marketingParams[field.name];
|
|
150
|
+
if (!paramValue) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (hasNonEmptyValue(result[field.name])) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
result[field.name] = {
|
|
157
|
+
name: field.name,
|
|
158
|
+
objectTypeId: field.objectTypeId,
|
|
159
|
+
value: paramValue,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=marketingParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketingParams.js","sourceRoot":"","sources":["../../../src/forms/client/marketingParams.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigate after a successful HubSpot form submit.
|
|
3
|
+
* External absolute URLs use a full page navigation; same-origin paths use the Next.js router.
|
|
4
|
+
*/
|
|
5
|
+
export declare function navigateAfterSubmit(url: string, router: {
|
|
6
|
+
push: (href: string) => void;
|
|
7
|
+
}, location?: Pick<Location, 'origin' | 'assign'>): void;
|
|
8
|
+
//# sourceMappingURL=navigateAfterSubmit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigateAfterSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/navigateAfterSubmit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;IAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,EACxC,QAAQ,GAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAEe,GAC1D,IAAI,CAWN"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigate after a successful HubSpot form submit.
|
|
3
|
+
* External absolute URLs use a full page navigation; same-origin paths use the Next.js router.
|
|
4
|
+
*/
|
|
5
|
+
export function navigateAfterSubmit(url, router, location = typeof window !== 'undefined'
|
|
6
|
+
? window.location
|
|
7
|
+
: { origin: 'http://localhost', assign: () => undefined }) {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = new URL(url, location.origin);
|
|
10
|
+
if (parsed.origin !== location.origin) {
|
|
11
|
+
location.assign(parsed.href);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
router.push(`${parsed.pathname}${parsed.search}${parsed.hash}`);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
router.push(url);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=navigateAfterSubmit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigateAfterSubmit.js","sourceRoot":"","sources":["../../../src/forms/client/navigateAfterSubmit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,MAAwC,EACxC,WAAgD,OAAO,MAAM,KAAK,WAAW;IAC3E,CAAC,CAAC,MAAM,CAAC,QAAQ;IACjB,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;IAE3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HubspotFieldResponse, HubspotFormClassNames, HubspotFormField } from '../types';
|
|
2
|
+
export declare function isSupportedFieldType(fieldType: string): boolean;
|
|
3
|
+
interface RenderFieldContext {
|
|
4
|
+
field: HubspotFormField;
|
|
5
|
+
formData: Record<string, HubspotFieldResponse>;
|
|
6
|
+
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
7
|
+
classNames: HubspotFormClassNames;
|
|
8
|
+
}
|
|
9
|
+
export declare function renderHubspotField({ field, formData, handleInputChange, classNames, }: RenderFieldContext): React.ReactNode;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=renderHubspotField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderHubspotField.d.ts","sourceRoot":"","sources":["../../../src/forms/client/renderHubspotField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAgB9F,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC/C,iBAAiB,EAAE,CACjB,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC,KAC7E,IAAI,CAAC;IACV,UAAU,EAAE,qBAAqB,CAAC;CACnC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,UAAU,GACX,EAAE,kBAAkB,GAAG,KAAK,CAAC,SAAS,CA0KtC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { decode } from 'html-entities';
|
|
3
|
+
const SUPPORTED_FIELD_TYPES = new Set([
|
|
4
|
+
'email',
|
|
5
|
+
'phone',
|
|
6
|
+
'mobile_phone',
|
|
7
|
+
'single_line_text',
|
|
8
|
+
'multi_line_text',
|
|
9
|
+
'number',
|
|
10
|
+
'dropdown',
|
|
11
|
+
'radio',
|
|
12
|
+
'multiple_checkboxes',
|
|
13
|
+
'single_checkbox',
|
|
14
|
+
'datepicker',
|
|
15
|
+
]);
|
|
16
|
+
export function isSupportedFieldType(fieldType) {
|
|
17
|
+
return SUPPORTED_FIELD_TYPES.has(fieldType);
|
|
18
|
+
}
|
|
19
|
+
export function renderHubspotField({ field, formData, handleInputChange, classNames, }) {
|
|
20
|
+
const fieldName = field.name;
|
|
21
|
+
const value = formData[fieldName]?.value ?? '';
|
|
22
|
+
const commonProps = {
|
|
23
|
+
id: fieldName,
|
|
24
|
+
name: fieldName,
|
|
25
|
+
value: typeof value === 'string' ? value : '',
|
|
26
|
+
'data-object-type-id': field.objectTypeId,
|
|
27
|
+
onChange: handleInputChange,
|
|
28
|
+
required: field.required,
|
|
29
|
+
className: classNames.input,
|
|
30
|
+
};
|
|
31
|
+
const label = (_jsxs("label", { htmlFor: fieldName, className: classNames.label, children: [decode(field.label), field.required && _jsx("span", { "aria-hidden": "true", children: " *" })] }));
|
|
32
|
+
const description = field.description ? (_jsx("p", { className: classNames.description, children: decode(field.description) })) : null;
|
|
33
|
+
switch (field.fieldType) {
|
|
34
|
+
case 'radio':
|
|
35
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("div", { className: classNames.radioGroup, role: "radiogroup", "aria-labelledby": fieldName, children: field.options?.map((option) => (_jsxs("label", { className: classNames.radioLabel, children: [_jsx("input", { type: "radio", name: fieldName, value: option.value, checked: formData[fieldName]?.value === option.value, onChange: handleInputChange, "data-object-type-id": field.objectTypeId, required: field.required }), _jsx("span", { children: decode(option.label) })] }, option.value))) })] }, fieldName));
|
|
36
|
+
case 'multiple_checkboxes':
|
|
37
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("div", { className: classNames.checkboxGroup, children: field.options?.map((option) => {
|
|
38
|
+
const current = formData[fieldName]?.value;
|
|
39
|
+
const checked = Array.isArray(current) && current.includes(option.value);
|
|
40
|
+
return (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", name: fieldName, value: option.value, checked: checked, onChange: handleInputChange, "data-object-type-id": field.objectTypeId, "data-checkbox-mode": "multiple" }), _jsx("span", { children: decode(option.label) })] }, option.value));
|
|
41
|
+
}) })] }, fieldName));
|
|
42
|
+
case 'single_checkbox':
|
|
43
|
+
return (_jsxs("div", { className: classNames.field, children: [_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", name: fieldName, checked: formData[fieldName]?.value === 'true', onChange: handleInputChange, "data-object-type-id": field.objectTypeId, "data-checkbox-mode": "single", required: field.required }), _jsxs("span", { children: [decode(field.label), field.required && _jsx("span", { "aria-hidden": "true", children: " *" })] })] }), description] }, fieldName));
|
|
44
|
+
case 'multi_line_text':
|
|
45
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("textarea", { ...commonProps, rows: 4, className: classNames.textarea })] }, fieldName));
|
|
46
|
+
case 'dropdown':
|
|
47
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsxs("select", { ...commonProps, className: classNames.select, children: [_jsx("option", { value: "", children: decode(field.label) }), field.options?.map((option) => (_jsx("option", { value: option.value, children: decode(option.label) }, option.value)))] })] }, fieldName));
|
|
48
|
+
case 'email':
|
|
49
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("input", { ...commonProps, type: "email", autoComplete: "email" })] }, fieldName));
|
|
50
|
+
case 'phone':
|
|
51
|
+
case 'mobile_phone':
|
|
52
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("input", { ...commonProps, type: "tel", autoComplete: "tel" })] }, fieldName));
|
|
53
|
+
case 'number':
|
|
54
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("input", { ...commonProps, type: "number" })] }, fieldName));
|
|
55
|
+
case 'datepicker':
|
|
56
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("input", { ...commonProps, type: "date" })] }, fieldName));
|
|
57
|
+
default:
|
|
58
|
+
return (_jsxs("div", { className: classNames.field, children: [label, description, _jsx("input", { ...commonProps, type: "text" })] }, fieldName));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=renderHubspotField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderHubspotField.js","sourceRoot":"","sources":["../../../src/forms/client/renderHubspotField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HubspotFieldResponse, HubspotFormDefinition } from '../types';
|
|
2
|
+
export interface UseHubspotSubmitOptions {
|
|
3
|
+
portalId: string;
|
|
4
|
+
formDefinition: HubspotFormDefinition;
|
|
5
|
+
ipAddress?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Called after a successful submit (including bot-timing short-circuit success).
|
|
8
|
+
* Side-effect only — does not suppress HubSpot thank-you or redirect handling.
|
|
9
|
+
* CMS success UIs (extraCopy) should swap state here; redirect still wins when configured.
|
|
10
|
+
*/
|
|
11
|
+
onSuccess?: (fields: Record<string, HubspotFieldResponse>) => void;
|
|
12
|
+
/**
|
|
13
|
+
* CMS override (e.g. externalUrl / data.successRedirectUrl). Evaluated first on success,
|
|
14
|
+
* before HubSpot submit redirectUri or form postSubmitAction.
|
|
15
|
+
*/
|
|
16
|
+
redirectUrlOverride?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function useHubspotSubmit({ portalId, formDefinition, ipAddress, onSuccess, redirectUrlOverride, }: UseHubspotSubmitOptions): {
|
|
19
|
+
handleSubmit: (e: React.FormEvent) => void;
|
|
20
|
+
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
21
|
+
message: string | null;
|
|
22
|
+
formData: Record<string, HubspotFieldResponse>;
|
|
23
|
+
setFormData: import("react").Dispatch<import("react").SetStateAction<Record<string, HubspotFieldResponse>>>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=useHubspotSubmit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHubspotSubmit.d.ts","sourceRoot":"","sources":["../../../src/forms/client/useHubspotSubmit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAI5E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,SAAS,EACT,SAAS,EACT,mBAAmB,GACpB,EAAE,uBAAuB;sBAkDlB,KAAK,CAAC,SAAS;2BA3ChB,KAAK,CAAC,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;;;;EAmGnF"}
|