@hhgtech/hhg-components
Version:
Hello Health Group common components
501 lines (485 loc) • 41.3 kB
JavaScript
'use strict';
var tslib_es6 = require('./tslib.es6-af09a0ba.js');
var React = require('react');
var reactHookForm = require('react-hook-form');
var useHealthToolCache = require('./useHealthToolCache-cac8180d.js');
var constants = require('./constants-817a109a.js');
var core = require('@mantine/core');
var index$2 = require('./index-3424862e.js');
require('@mantine/dates');
require('./index-ec32050c.js');
require('./index-0a047edc.js');
require('./index-9301f298.js');
require('./index-4d838fd2.js');
var index$1 = require('./index-d4ad3f79.js');
require('./index-515469d0.js');
var index$5 = require('./index-04864074.js');
require('./index.styles-5f6a7ac0.js');
var index = require('./index-2b476eb9.js');
require('@mantine/hooks');
require('./utils-5e3a8440.js');
require('./index-a985d53b.js');
var index$3 = require('./index-4aa0b39e.js');
var ChevronDown = require('./ChevronDown-df80ec34.js');
var context = require('./context-c8d07963.js');
var index$4 = require('./index-84429a30.js');
require('@hhgtech/icons/other');
var Locale = require('./Locale-eb0da538.js');
var constantsDomainLocales = require('./constantsDomainLocales.js');
var embeddedHeathToolCards_helpers = require('./embeddedHeathToolCards_helpers.js');
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefault(React);
const Question1Label = (_a) => {
var { LabelWrapper } = _a, props = tslib_es6.__rest(_a, ["LabelWrapper"]);
const { t } = index.useTranslations();
const labelProps = !LabelWrapper ? Object.assign({ size: 'p2' }, props) : {};
const Component = LabelWrapper || index$1.Text;
return (React__default["default"].createElement(Component, Object.assign({}, labelProps), t('bmi.question.weightLossSupport')));
};
const Question2Label = (_a) => {
var { LabelWrapper } = _a, props = tslib_es6.__rest(_a, ["LabelWrapper"]);
const { t } = index.useTranslations();
const labelProps = !LabelWrapper ? Object.assign({ size: 'p2' }, props) : {};
const Component = LabelWrapper || index$1.Text;
return (React__default["default"].createElement(Component, Object.assign({}, labelProps), t('bmi.question.glp1Awareness')));
};
const Question2Description = (_a) => {
var { LabelWrapper } = _a, props = tslib_es6.__rest(_a, ["LabelWrapper"]);
const { t } = index.useTranslations();
const labelProps = !LabelWrapper ? Object.assign({ size: 'p2' }, props) : {};
const Component = LabelWrapper || index$1.Text;
return (React__default["default"].createElement(Component, Object.assign({}, labelProps), t('bmi.question.glp1Awareness.desc')));
};
const BmiFormContext = React.createContext({});
var useStyles$1 = core.createStyles(() => {
return {
label: {
marginTop: 2,
cursor: 'pointer',
userSelect: 'none',
},
};
});
const NewsletterCheckbox = (_a) => {
var { labelTextProps, checked: checkedProps, LabelWrapper, useCollapse = true } = _a, props = tslib_es6.__rest(_a, ["labelTextProps", "checked", "LabelWrapper", "useCollapse"]);
const { t } = index.useTranslations();
const [show, setShow] = React.useState(!useCollapse);
const [firstTime, setFirstTime] = React.useState(true);
const [checked, setChecked] = React.useState(checkedProps);
const labelProps = !LabelWrapper ? Object.assign({ size: 'p3' }, labelTextProps) : {};
const Component = LabelWrapper || index$1.Text;
const { classes } = useStyles$1(undefined, { name: 'NewsletterCheckbox' });
return (React__default["default"].createElement(core.Flex, { gap: 8, align: 'flex-start' },
React__default["default"].createElement(index$2.Checkbox, Object.assign({}, props, { label: undefined, size: "sm", checked: checked, onChange: (event) => {
if (firstTime) {
setFirstTime(false);
}
else {
setChecked(event.currentTarget.checked);
}
}, styles: {
labelWrapper: {
display: 'none',
},
} })),
React__default["default"].createElement(core.Box, null,
React__default["default"].createElement(Component, Object.assign({}, labelProps, { onClick: () => {
useCollapse && setShow((v) => !v);
}, className: classes.label, lineClamp: show ? undefined : 1 }), t('bmi.newsletter.label')))));
};
const FitnessToolUnitPicker = ({ displayValue, field, onChange, }) => {
const theme = core.useMantineTheme();
const borderColor = theme.colors.gray[1];
const options = field === 'height'
? [
{ label: 'cm', system: 'metric' },
{ label: 'ft', system: 'imperial' },
]
: [
{ label: 'kg', system: 'metric' },
{ label: 'lbs', system: 'imperial' },
];
return (React__default["default"].createElement(core.Menu, { position: "bottom-end", withinPortal: true, offset: 0, styles: {
dropdown: {
backgroundColor: theme.white,
border: `${core.rem(1)} solid ${borderColor}`,
borderRadius: 12,
boxShadow: '0px 0px 1px 0px #0000000A,0px 2px 8px 0px #0000000A,0px 10px 16px 0px #0000000A',
padding: core.rem(4),
minWidth: core.rem(90),
},
item: {
fontSize: theme.fontSizes.sm,
lineHeight: 1.4,
padding: `${core.rem(6)} ${core.rem(10)}`,
borderRadius: theme.radius.xs,
color: theme.colors.dark[9],
'&[data-hovered]': {
backgroundColor: 'transparent',
},
},
} },
React__default["default"].createElement(core.Menu.Target, null,
React__default["default"].createElement(core.UnstyledButton, { type: "button", sx: (theme) => ({
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end',
width: '100%',
paddingRight: theme.spacing.xs,
gap: 4,
}) },
React__default["default"].createElement(core.Text, { component: "span", size: "sm", sx: { lineHeight: 1 } }, displayValue),
React__default["default"].createElement(ChevronDown.ChevronDown, { style: { width: 18, height: 18 } }))),
React__default["default"].createElement(core.Menu.Dropdown, null, options.map((opt) => {
const isSelected = displayValue === opt.label;
return (React__default["default"].createElement(core.Menu.Item, { key: opt.label, onClick: () => onChange(opt.system, field), sx: {
backgroundColor: isSelected ? theme.colors.gray[1] : undefined,
'&[data-hovered]': {
backgroundColor: isSelected
? theme.colors.gray[1]
: 'transparent',
},
} }, opt.label));
}))));
};
const DefaultForm = (props) => {
var _a, _b, _c, _d, _e, _f, _g;
const { t, locale } = index.useTranslations();
const { classes: cardWrapperClasses = {} } = React.useContext(context.CardWrapperContext);
const { control, bmiGenerated, linkTool, submitProps, withAdditionalQuestion, classes: formWrapperClasses = {}, enableUnitPicker, unitSystem, unitHeight, unitWeight, onUnitChange, } = React.useContext(BmiFormContext);
const radioStyle = {
body: {
alignItems: 'center',
},
};
return (React__default["default"].createElement(index$3.HealthToolFormWrapper, Object.assign({ formLayout: "default" }, props),
React__default["default"].createElement(HealthToolDefaultLayout$1, { isMobile: props.isMobile, gutter: 4 },
React__default["default"].createElement(core.Stack, { spacing: 4, px: 16 },
React__default["default"].createElement(reactHookForm.Controller, { name: "gender", control: control, rules: (_a = bmiGenerated.gender) === null || _a === void 0 ? void 0 : _a.rule, render: ({ field: { onChange }, fieldState: { error } }) => {
return (React__default["default"].createElement("div", null,
React__default["default"].createElement(HealthToolDefaultLayout$1.GenderControl, { LabelWrapper: HealthToolDefaultLayout$1.Label, error: undefined, onChange: onChange, gap: 4 }),
(error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(HealthToolDefaultLayout$1.Error, { label: error.message }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "age", control: control, rules: (_b = bmiGenerated.age) === null || _b === void 0 ? void 0 : _b.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement("div", null,
React__default["default"].createElement(HealthToolDefaultLayout$1.InputNumber, { label: React__default["default"].createElement(HealthToolDefaultLayout$1.Label, null, t('bmi.ageInput')), placeholder: t('tools.inputPlaceholder', {
content: '25',
}), name: name, value: value, onChange: onChange, min: 0, rightSection: t('bmi.ageInput.desc'), classNames: {
rightSection: formWrapperClasses.inputRightSection,
} }),
(error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(HealthToolDefaultLayout$1.Error, { label: error.message }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "height", control: control, rules: (_c = bmiGenerated.height) === null || _c === void 0 ? void 0 : _c.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement("div", null,
React__default["default"].createElement(HealthToolDefaultLayout$1.InputNumber, { label: React__default["default"].createElement(HealthToolDefaultLayout$1.Label, null, t('bmi.heightInput')), placeholder: t('tools.inputPlaceholder', {
content: unitSystem === 'imperial' ? 6 : 170,
}), name: name, value: value, onChange: onChange, min: 0, precision: 1, inputMode: "decimal", rightSection: enableUnitPicker ? (React__default["default"].createElement(FitnessToolUnitPicker, { displayValue: unitHeight, field: "height", onChange: onUnitChange })) : (t('bmi.heightInput.desc')), rightSectionWidth: 70, classNames: {
rightSection: formWrapperClasses.inputRightSection,
}, styles: !enableUnitPicker
? () => ({
rightSection: {
paddingRight: 0,
},
})
: undefined }),
(error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(HealthToolDefaultLayout$1.Error, { label: error.message }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "weight", control: control, rules: (_d = bmiGenerated.weight) === null || _d === void 0 ? void 0 : _d.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement("div", null,
React__default["default"].createElement(HealthToolDefaultLayout$1.InputNumber, { label: React__default["default"].createElement(HealthToolDefaultLayout$1.Label, null, t('bmi.weightInput')), placeholder: t('tools.inputPlaceholder', {
content: unitSystem === 'imperial' ? 130 : 60,
}), name: name, value: value, onChange: onChange, precision: 1, inputMode: "decimal", min: 0, rightSection: enableUnitPicker ? (React__default["default"].createElement(FitnessToolUnitPicker, { displayValue: unitWeight, field: "weight", onChange: onUnitChange })) : (t('bmi.weightInput.desc')), rightSectionWidth: 70, classNames: {
rightSection: formWrapperClasses.inputRightSection,
}, styles: !enableUnitPicker
? () => ({
rightSection: {
paddingRight: 0,
},
})
: undefined }),
(error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(HealthToolDefaultLayout$1.Error, { label: error.message }))));
} })),
withAdditionalQuestion ? (React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement(core.Stack, { spacing: 4, px: 16 },
React__default["default"].createElement(reactHookForm.Controller, { name: "question1", control: control, rules: (_e = bmiGenerated.question1) === null || _e === void 0 ? void 0 : _e.rule, render: ({ field: { value, onChange, name }, fieldState: { error }, }) => {
return (React__default["default"].createElement("div", null,
React__default["default"].createElement(index$2.Radio.Group, { name: name, value: value, onChange: onChange, sx: { flex: 1 }, label: React__default["default"].createElement(Question1Label, { LabelWrapper: HealthToolDefaultLayout$1.Label }), size: "lg" },
React__default["default"].createElement(core.Flex, { gap: "lg" },
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "1", label: React__default["default"].createElement(HealthToolDefaultLayout$1.OptionLabel, null, t('switchBtn.yes')), styles: radioStyle }),
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "0", label: React__default["default"].createElement(HealthToolDefaultLayout$1.OptionLabel, null, t('switchBtn.no')), styles: radioStyle }))),
(error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(HealthToolDefaultLayout$1.Error, { label: error.message }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "question2", control: control, rules: (_f = bmiGenerated.question2) === null || _f === void 0 ? void 0 : _f.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement("div", null,
React__default["default"].createElement(index$2.Radio.Group, { name: name, value: value, onChange: onChange, sx: { flex: 1 }, label: React__default["default"].createElement(Question2Label, { LabelWrapper: HealthToolDefaultLayout$1.Label }), size: "lg", description: locale !== Locale.LOCALE.Malaysia && (React__default["default"].createElement(Question2Description, { LabelWrapper: HealthToolDefaultLayout$1.SubLabel })) },
React__default["default"].createElement(core.Flex, { gap: "lg" },
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "1", label: React__default["default"].createElement(HealthToolDefaultLayout$1.OptionLabel, null, t('switchBtn.yes')), styles: radioStyle }),
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "0", label: React__default["default"].createElement(HealthToolDefaultLayout$1.OptionLabel, null, t('switchBtn.no')), styles: radioStyle }))),
(error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(HealthToolDefaultLayout$1.Error, { label: error.message }))));
} })),
React__default["default"].createElement(core.Box, { className: core.clsx(formWrapperClasses.newsletterBlock, cardWrapperClasses.newsletterBlock) },
React__default["default"].createElement(core.Stack, { spacing: 8, px: 16, py: 12 },
React__default["default"].createElement(reactHookForm.Controller, { name: "newsletter", control: control, rules: (_g = bmiGenerated.newsletter) === null || _g === void 0 ? void 0 : _g.rule, render: (_a) => {
var _b = _a.field, { value, onChange, name } = _b, field = tslib_es6.__rest(_b, ["value", "onChange", "name"]);
return (React__default["default"].createElement(NewsletterCheckbox, Object.assign({ size: "sm", onChange: (e) => onChange(e.currentTarget.checked), name: name, checked: !!value }, field)));
} }),
React__default["default"].createElement(index$3.HealthToolFormWrapper.Submit, Object.assign({ className: "bmi-btn bmi--btn-submit", dataEventCategory: "Health Tool", dataEventAction: "BMI", dataEventLabel: `https://${constantsDomainLocales.domainLocales[locale]}/${linkTool}`, type: "submit", fullWidth: true }, submitProps), t('bmi.submit')))))) : (React__default["default"].createElement(core.Box, { px: 16, sx: { paddingBottom: 8 } },
React__default["default"].createElement(index$3.HealthToolFormWrapper.Submit, Object.assign({ className: "bmi-btn bmi--btn-submit", dataEventCategory: "Health Tool", dataEventAction: "BMI", dataEventLabel: `https://${constantsDomainLocales.domainLocales[locale]}/${linkTool}`, type: "submit", fullWidth: true }, submitProps), t('bmi.submit')))))));
};
var useStyles = core.createStyles((theme) => {
return {
newsletterBlock: {
backgroundColor: theme.colors.neutral[0],
borderBottomLeftRadius: 'inherit',
borderBottomRightRadius: 'inherit',
'.bmi-btn': {
marginTop: 0,
},
},
inputRightSection: {
fontSize: core.rem(13),
lineHeight: core.rem(24),
color: theme.colors.gray[4],
justifyContent: 'flex-end',
paddingRight: 8,
whiteSpace: 'nowrap',
},
};
});
const InlineForm = (props) => {
var _a, _b, _c, _d, _e, _f, _g, _h;
const { t, locale } = index.useTranslations();
const { control, bmiGenerated, isTouched, linkTool, submitProps, withAdditionalQuestion, enableUnitPicker, unitSystem, unitHeight, unitWeight, onUnitChange, } = React.useContext(BmiFormContext);
const { classes: wrapperClasses = {}, variant: cardWrapperVariant } = React.useContext(context.CardWrapperContext);
const { classes: formWrapperClasses = {} } = React.useContext(BmiFormContext);
return (React__default["default"].createElement(index$3.HealthToolFormWrapper, Object.assign({ formLayout: "inline" }, props),
React__default["default"].createElement(reactHookForm.Controller, { name: "gender", control: control, rules: (_a = bmiGenerated.gender) === null || _a === void 0 ? void 0 : _a.rule, render: ({ field: { onChange }, fieldState: { error } }) => {
return (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, null,
React__default["default"].createElement(index$3.HealthToolFormWrapper.BorderInlineControl, { label: t('tools.selectGender'), width: 'none', errorMess: isTouched && (error === null || error === void 0 ? void 0 : error.message) },
React__default["default"].createElement(index$4.GenderOptionControl, { type: "radio", hideLabel: true, error: isTouched ? React__default["default"].createElement(React__default["default"].Fragment, null) : '', onChange: onChange }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "age", control: control, rules: (_b = bmiGenerated.age) === null || _b === void 0 ? void 0 : _b.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, null,
React__default["default"].createElement(index$3.HealthToolFormWrapper.BorderInlineControl, { label: t('bmi.ageInput'), errorMess: isTouched && (error === null || error === void 0 ? void 0 : error.message) },
React__default["default"].createElement(index$2.Input.Number, { placeholder: t('tools.inputPlaceholder', {
content: '25',
}), name: name, value: value, onChange: onChange, error: isTouched && (error === null || error === void 0 ? void 0 : error.message) ? React__default["default"].createElement(React__default["default"].Fragment, null) : '', min: 0, rightSection: React__default["default"].createElement(index$3.HealthToolFormWrapper.Unit, null, t('tools.yearsOld')), styles: () => ({
rightSection: {
width: 'auto',
},
}) }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "height", control: control, rules: (_c = bmiGenerated.height) === null || _c === void 0 ? void 0 : _c.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, null,
React__default["default"].createElement(index$3.HealthToolFormWrapper.BorderInlineControl, { label: t('bmi.heightInput'), errorMess: isTouched && (error === null || error === void 0 ? void 0 : error.message) },
React__default["default"].createElement(index$2.Input.Number, { placeholder: t('tools.inputPlaceholder', {
content: unitSystem === 'imperial' ? 6 : 170,
}), name: name, value: value, onChange: onChange, min: 0, precision: 1, inputMode: "decimal", error: isTouched && (error === null || error === void 0 ? void 0 : error.message) ? React__default["default"].createElement(React__default["default"].Fragment, null) : '', rightSection: enableUnitPicker ? (React__default["default"].createElement(FitnessToolUnitPicker, { displayValue: unitHeight, field: "height", onChange: onUnitChange })) : (React__default["default"].createElement(index$3.HealthToolFormWrapper.Unit, { styles: { root: { paddingRight: 0 } } }, t('bmi.heightInput.desc'))), rightSectionWidth: 70, styles: !enableUnitPicker
? () => ({
rightSection: {
paddingRight: 0,
},
})
: undefined }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "weight", control: control, rules: (_d = bmiGenerated.weight) === null || _d === void 0 ? void 0 : _d.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, null,
React__default["default"].createElement(index$3.HealthToolFormWrapper.BorderInlineControl, { label: t('bmi.weightInput'), errorMess: isTouched && (error === null || error === void 0 ? void 0 : error.message) },
React__default["default"].createElement(index$2.Input.Number, { placeholder: t('tools.inputPlaceholder', {
content: unitSystem === 'imperial' ? 130 : 60,
}), name: name, value: value, onChange: onChange, error: isTouched && (error === null || error === void 0 ? void 0 : error.message) ? React__default["default"].createElement(React__default["default"].Fragment, null) : '', precision: 1, inputMode: "decimal", min: 0, rightSection: enableUnitPicker ? (React__default["default"].createElement(FitnessToolUnitPicker, { displayValue: unitWeight, field: "weight", onChange: onUnitChange })) : (React__default["default"].createElement(index$3.HealthToolFormWrapper.Unit, { styles: { root: { paddingRight: 0 } } }, t('bmi.weightInput.desc'))), rightSectionWidth: 70, styles: !enableUnitPicker
? () => ({
rightSection: {
paddingRight: 0,
},
})
: undefined }))));
} }),
withAdditionalQuestion ? (React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement(reactHookForm.Controller, { name: "question1", control: control, rules: (_e = bmiGenerated.question1) === null || _e === void 0 ? void 0 : _e.rule, render: ({ field: { value, onChange, name }, fieldState: { error }, }) => {
return (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, null,
React__default["default"].createElement(index$2.Radio.Group, { name: name, value: value, onChange: onChange, sx: { flex: 1 }, label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", span: true }, t('bmi.question.weightLossSupport')), size: "lg" },
React__default["default"].createElement(core.Flex, { gap: "lg", sx: { paddingTop: core.rem(8) } },
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "1", label: t('switchBtn.yes') }),
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "0", label: t('switchBtn.no') }))),
isTouched && (error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(index$2.ErrorLabel, { label: error.message, textProps: {
size: 'p4',
}, sx: { marginTop: 6 } }))));
} }),
React__default["default"].createElement(reactHookForm.Controller, { name: "question2", control: control, rules: (_f = bmiGenerated.question2) === null || _f === void 0 ? void 0 : _f.rule, render: ({ field: { name, value, onChange }, fieldState: { error }, }) => {
return (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, null,
React__default["default"].createElement(index$2.Radio.Group, { name: name, value: value, onChange: onChange, sx: { flex: 1 }, label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", span: true }, t('bmi.question.glp1Awareness')), size: "lg", description: locale !== Locale.LOCALE.Malaysia && (React__default["default"].createElement(index$1.Text, { style: { fontSize: '10px' }, span: true }, t('bmi.question.glp1Awareness.desc'))) },
React__default["default"].createElement(core.Flex, { gap: "lg", sx: { paddingTop: core.rem(8) } },
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "1", label: t('switchBtn.yes') }),
React__default["default"].createElement(index$2.Radio, { size: "sm", value: "0", label: t('switchBtn.no') }))),
isTouched && (error === null || error === void 0 ? void 0 : error.message) && (React__default["default"].createElement(index$2.ErrorLabel, { label: error.message, textProps: {
size: 'p4',
}, sx: { marginTop: 6 } }))));
} }),
cardWrapperVariant === 'gray' || cardWrapperVariant === 'violet' ? (React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement(reactHookForm.Controller, { name: "newsletter", control: control, rules: (_g = bmiGenerated.newsletter) === null || _g === void 0 ? void 0 : _g.rule, render: (_a) => {
var _b = _a.field, { value, onChange, name } = _b, field = tslib_es6.__rest(_b, ["value", "onChange", "name"]);
return (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, null,
React__default["default"].createElement(index$2.Checkbox, Object.assign({ size: "sm", label: React__default["default"].createElement(index$1.Text, { size: "p3" }, t('bmi.newsletter.label')), onChange: (e) => onChange(e.currentTarget.checked), name: name, checked: !!value }, field))));
} }),
React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, { className: core.clsx(wrapperClasses.submitWrapper) },
React__default["default"].createElement(index$3.HealthToolFormWrapper.Submit, Object.assign({ className: core.clsx('bmi-btn bmi--btn-submit', wrapperClasses.submitBtn), dataEventCategory: "Health Tool", dataEventAction: "BMI", dataEventLabel: `https://${constantsDomainLocales.domainLocales[locale]}/${linkTool}`, type: "submit" }, submitProps), t('bmi.submit'))))) : (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, { py: 16, className: core.clsx(formWrapperClasses.newsletterBlock, wrapperClasses.newsletterBlock) },
React__default["default"].createElement(core.Stack, { spacing: 16 },
React__default["default"].createElement(reactHookForm.Controller, { name: "newsletter", control: control, rules: (_h = bmiGenerated.newsletter) === null || _h === void 0 ? void 0 : _h.rule, render: (_a) => {
var _b = _a.field, { value, onChange, name } = _b, field = tslib_es6.__rest(_b, ["value", "onChange", "name"]);
return (React__default["default"].createElement(NewsletterCheckbox, Object.assign({ size: "sm", labelTextProps: { size: 'p4' }, onChange: (e) => onChange(e.currentTarget.checked), name: name, checked: !!value, useCollapse: false }, field)));
} }),
React__default["default"].createElement(core.Box, { className: core.clsx(wrapperClasses.submitWrapper) },
React__default["default"].createElement(index$3.HealthToolFormWrapper.Submit, Object.assign({ className: core.clsx('bmi-btn bmi--btn-submit', wrapperClasses.submitBtn), dataEventCategory: "Health Tool", dataEventAction: "BMI", dataEventLabel: `https://${constantsDomainLocales.domainLocales[locale]}/${linkTool}`, type: "submit" }, submitProps), t('bmi.submit')))))))) : (React__default["default"].createElement(index$3.HealthToolFormWrapper.FormRow, { className: core.clsx(wrapperClasses.submitWrapper) },
React__default["default"].createElement(index$3.HealthToolFormWrapper.Submit, Object.assign({ className: "bmi-btn bmi--btn-submit", dataEventCategory: "Health Tool", dataEventAction: "BMI", dataEventLabel: `https://${constantsDomainLocales.domainLocales[locale]}/${linkTool}`, type: "submit" }, submitProps), t('bmi.submit'))))));
};
const BmiForm = (_a) => {
var { value: valueProps, onChange: onChangeProps, onSubmit: onSubmitProps, bmiGenerated, bmiUnit, defaultUnitSystem, enableUnitPicker = true, formLayout = 'default', submitProps, withAdditionalQuestion, isMobile } = _a, rest = tslib_es6.__rest(_a, ["value", "onChange", "onSubmit", "bmiGenerated", "bmiUnit", "defaultUnitSystem", "enableUnitPicker", "formLayout", "submitProps", "withAdditionalQuestion", "isMobile"]);
const { classes } = useStyles(undefined, { name: 'BmiForm' });
const { locale } = index.useTranslations();
const [isTouched, setIsTouched] = React.useState(false);
const initialUnitSystem = React.useMemo(() => defaultUnitSystem || 'metric', [defaultUnitSystem]);
const [unitSystem, setUnitSystem] = React.useState(initialUnitSystem);
const { control, handleSubmit, setValue, watch } = reactHookForm.useForm({
defaultValues: {
question1: undefined,
question2: undefined,
newsletter: true,
},
});
const data = watch();
const { getHealthToolLink } = useHealthToolCache.useHealthToolsCache(locale);
const linkTool = React.useMemo(() => getHealthToolLink(constants.HEALTH_TOOL_TYPE.OVULATION), [getHealthToolLink]);
const unitHeight = unitSystem === 'imperial' ? 'ft' : 'cm';
const unitWeight = unitSystem === 'imperial' ? 'lbs' : 'kg';
const convertHeightToCm = (value) => unitSystem === 'imperial' ? value * 30.48 : value;
const convertWeightToKg = (value) => unitSystem === 'imperial' ? value * 0.45359237 : value;
const onValid = (data) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
const rawHeight = typeof data.height === 'number' ? data.height : Number(data.height);
const rawWeight = typeof data.weight === 'number' ? data.weight : Number(data.weight);
const submitValue = enableUnitPicker
? Object.assign(Object.assign({}, data), { bmi: embeddedHeathToolCards_helpers.getBmi({
height: convertHeightToCm(rawHeight),
weight: convertWeightToKg(rawWeight),
}), unit: unitSystem }) : (() => {
const height = bmiUnit.heightConvert(rawHeight);
const weight = bmiUnit.weightConvert(rawWeight);
return Object.assign(Object.assign({}, data), { height,
weight, bmi: embeddedHeathToolCards_helpers.getBmi({ height, weight }) });
})();
onInValid();
onSubmitProps && onSubmitProps(submitValue);
});
const onInValid = () => {
setIsTouched(true);
};
React.useEffect(() => {
Object.keys(valueProps || {}).forEach((k) => {
const key = k;
setValue(key, valueProps === null || valueProps === void 0 ? void 0 : valueProps[key], {
shouldTouch: false,
shouldDirty: false,
shouldValidate: false,
});
});
}, [valueProps]);
React.useEffect(() => {
onChangeProps && onChangeProps(data);
}, [data]);
React.useEffect(() => {
setUnitSystem(initialUnitSystem);
}, [initialUnitSystem]);
const onUnitChange = (next, _changedField) => {
if (!enableUnitPicker)
return;
if (next === unitSystem)
return;
setUnitSystem(next);
// Clear both inputs when unit changes to avoid mixing unit systems.
// `Input.Number` in this repo supports `value` as `number | ''`,
// so we clear with '' to make the UI reset properly.
setValue('height', '', { shouldDirty: true, shouldValidate: false });
setValue('weight', '', { shouldDirty: true, shouldValidate: false });
};
const commonProps = Object.assign({ onSubmit: handleSubmit(onValid, onInValid) }, rest);
return (React__default["default"].createElement(index$5.TemplateProvider, { variant: index$5.CustomStylesType.LEADGEN },
React__default["default"].createElement(BmiFormContext.Provider, { value: {
control,
bmiGenerated,
isTouched,
linkTool,
submitProps,
withAdditionalQuestion,
classes,
enableUnitPicker,
unitSystem,
unitHeight,
unitWeight,
onUnitChange,
} }, formLayout === 'inline' ? (React__default["default"].createElement(InlineForm, Object.assign({}, commonProps))) : (React__default["default"].createElement(DefaultForm, Object.assign({}, commonProps, { isMobile: isMobile }))))));
};
const HealthToolDefaultLayoutContext = React.createContext({});
const Row = (_a) => {
var { children } = _a, props = tslib_es6.__rest(_a, ["children"]);
const { gutter } = React.useContext(HealthToolDefaultLayoutContext);
return (React__default["default"].createElement(core.Grid, Object.assign({ gutter: gutter }, props), children));
};
const Col = (_a) => {
var { children } = _a, props = tslib_es6.__rest(_a, ["children"]);
return (React__default["default"].createElement(core.Grid.Col, Object.assign({ span: 12 }, props), children));
};
const Label = (_a) => {
var { children } = _a, props = tslib_es6.__rest(_a, ["children"]);
const { labelSize } = React.useContext(HealthToolDefaultLayoutContext);
return (React__default["default"].createElement(index$1.Text, Object.assign({ size: labelSize, weight: "semiBold" }, props, { span: true }), children));
};
const OptionLabel = (_a) => {
var { children } = _a, props = tslib_es6.__rest(_a, ["children"]);
const { optionLabelSize } = React.useContext(HealthToolDefaultLayoutContext);
return (React__default["default"].createElement(index$1.Text, Object.assign({ size: optionLabelSize, weight: "regular" }, props, { span: true }), children));
};
const SubLabel = (_a) => {
var { children } = _a, props = tslib_es6.__rest(_a, ["children"]);
const { subLabelSize } = React.useContext(HealthToolDefaultLayoutContext);
return (React__default["default"].createElement(index$1.Text, Object.assign({ size: subLabelSize }, props), children));
};
const InputNumber = (_a) => {
var { error } = _a, props = tslib_es6.__rest(_a, ["error"]);
const { inputSize } = React.useContext(HealthToolDefaultLayoutContext);
return (React__default["default"].createElement("div", null,
React__default["default"].createElement(index$2.Input.Number, Object.assign({ size: inputSize }, props)),
error && React__default["default"].createElement(Error, { label: error })));
};
const GenderControl = (props) => {
const { inputSize } = React.useContext(HealthToolDefaultLayoutContext);
return React__default["default"].createElement(index$4.GenderOptionControl, Object.assign({ size: inputSize }, props));
};
const Error = (props) => {
const { errorLabelSize } = React.useContext(HealthToolDefaultLayoutContext);
return (React__default["default"].createElement(index$2.ErrorLabel, Object.assign({ textProps: { size: errorLabelSize }, sx: { marginTop: 5 } }, props)));
};
const HealthToolDefaultLayout = (_a) => {
var _b, _c, _d, _e, _f, _g;
var { children, isMobile } = _a, props = tslib_es6.__rest(_a, ["children", "isMobile"]);
const merged = Object.assign({ isMobile, labelSize: (_b = props.labelSize) !== null && _b !== void 0 ? _b : (isMobile ? 'p2' : 's4'), subLabelSize: (_c = props.subLabelSize) !== null && _c !== void 0 ? _c : 'subText', optionLabelSize: (_d = props.optionLabelSize) !== null && _d !== void 0 ? _d : (isMobile ? 'p2' : 's4'), inputSize: (_e = props.inputSize) !== null && _e !== void 0 ? _e : (isMobile ? 'sm' : 'md'), gutter: (_f = props.gutter) !== null && _f !== void 0 ? _f : (isMobile ? 4 : 12), errorLabelSize: (_g = props.errorLabelSize) !== null && _g !== void 0 ? _g : 'p3' }, props);
return (React__default["default"].createElement(HealthToolDefaultLayoutContext.Provider, { value: merged }, children));
};
var HealthToolDefaultLayout$1 = Object.assign(HealthToolDefaultLayout, {
Row,
Col,
SubLabel,
Label,
OptionLabel,
Input: index$2.Input,
InputNumber,
GenderControl,
Error,
});
exports.BmiForm = BmiForm;
exports.FitnessToolUnitPicker = FitnessToolUnitPicker;
exports.HealthToolDefaultLayout = HealthToolDefaultLayout$1;
exports.NewsletterCheckbox = NewsletterCheckbox;
exports.Question1Label = Question1Label;
exports.Question2Description = Question2Description;
exports.Question2Label = Question2Label;