Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/internal-typings/global.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ declare namespace Hbspt {
target?: string;
cssClass?: string;
formInstanceId?: string;
onFormReady?: (form: HTMLFormElement) => void;
}
}

Expand Down
7 changes: 6 additions & 1 deletion src/models/constructor-items/sub-blocks.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import {ClassNameProps, QuoteType} from '../../models';
import {ThemeSupporting} from '../../utils';
import {HubspotEventData, HubspotEventHandlers} from '../../utils/hubspot';
import {
HubspotEventData,
HubspotEventHandlers,
HubspotFormDefaultValues,
} from '../../utils/hubspot';
import {AnalyticsEventsBase} from '../common';

import {ContentBlockProps} from './blocks';
Expand Down Expand Up @@ -103,6 +107,7 @@ export interface HubspotFormProps extends HubspotEventHandlers, AnalyticsEventsB
onLoad?: (arg: HubspotEventData) => void;
hubspotEvents?: string[];
createDOMElement?: boolean;
defaultValues?: HubspotFormDefaultValues;
}

//cards
Expand Down
8 changes: 7 additions & 1 deletion src/sub-blocks/HubspotForm/HubspotFormContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {useMount} from '../../hooks';
import {HubspotFormProps} from '../../models';

import loadHubspotScript from './loadHubspotScript';
import {setHubspotDefaultValues} from './setHubspotDefaultValues';

type HubspotFormContainerPropsKeys =
| 'className'
Expand All @@ -12,7 +13,8 @@ type HubspotFormContainerPropsKeys =
| 'portalId'
| 'region'
| 'formClassName'
| 'createDOMElement';
| 'createDOMElement'
| 'defaultValues';

type HubspotFormContainerProps = Pick<HubspotFormProps, HubspotFormContainerPropsKeys>;

Expand All @@ -27,6 +29,7 @@ const HubspotFormContainer = React.forwardRef<HTMLDivElement, HubspotFormContain
region,
formClassName,
createDOMElement,
defaultValues,
} = props;

const containerRef = React.useRef<HTMLDivElement>(null);
Expand Down Expand Up @@ -56,6 +59,9 @@ const HubspotFormContainer = React.forwardRef<HTMLDivElement, HubspotFormContain
target: `#${containerId}`,
cssClass: formClassName,
formInstanceId,
onFormReady: defaultValues
? (form) => setHubspotDefaultValues(form, defaultValues)
: undefined,
});
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/sub-blocks/HubspotForm/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const HubspotForm = React.forwardRef<HTMLDivElement, HubspotFormProps>((props, r
onLoad,
createDOMElement,
onSubmitError,
defaultValues,
} = props;

const themeValue = useTheme();
Expand Down Expand Up @@ -72,6 +73,7 @@ const HubspotForm = React.forwardRef<HTMLDivElement, HubspotFormProps>((props, r
portalId={portalId}
formInstanceId={formInstanceId}
region={region}
defaultValues={defaultValues}
ref={ref}
/>
);
Expand Down
62 changes: 62 additions & 0 deletions src/sub-blocks/HubspotForm/setHubspotDefaultValues.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import {HubspotFormDefaultValues} from '../../utils/hubspot';

/* eslint-disable no-not-accumulator-reassign/no-not-accumulator-reassign */
/* eslint-disable no-param-reassign */

type HubspotInputValue = HubspotFormDefaultValues[string];

const setInputValue = (inputs: HTMLInputElement[], value: HubspotInputValue) => {
const input = inputs[0];
const type = input.type;

switch (type) {
case 'checkbox':
input.checked = Boolean(value);
return;
case 'radio':
inputs.forEach((radio) => {
if (radio.value === String(value)) {
input.checked = true;
}
});
return;
default:
input.value = String(value);
}
};

const setSelectValue = (select: HTMLSelectElement, value: HubspotInputValue) => {
const options = Array.from(select.querySelectorAll('option'));

options.forEach((option) => {
if (option.value === String(value)) {
option.selected = true;
}
});
};

const setValue = (elements: Element[], value: HubspotInputValue) => {
const element = elements[0];

switch (element.tagName.toLowerCase()) {
case 'input':
setInputValue(elements as HTMLInputElement[], value);
return;
case 'textarea':
(element as HTMLTextAreaElement).value = String(value);
return;
case 'select':
setSelectValue(element as HTMLSelectElement, value);
return;
}
};

export const setHubspotDefaultValues = (
form: HTMLFormElement,
defaultValues: HubspotFormDefaultValues,
) => {
Object.entries(defaultValues).forEach(([name, value]) => {
const inputs = Array.from(form.querySelectorAll(`[name="${name}"]`));
setValue(inputs, value);
});
};
2 changes: 2 additions & 0 deletions src/utils/hubspot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export interface HubspotEventData {
data?: unknown;
}

export type HubspotFormDefaultValues = Record<string, string | number | boolean>;

export function isHubspotEventData(maybeData: unknown): maybeData is HubspotEventData {
return (
typeof maybeData === 'object' &&
Expand Down