@hhgtech/hhg-components
Version:
Hello Health Group common components
999 lines (956 loc) • 62.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var core = require('@mantine/core');
var index$2 = require('./index-ae1a5588.js');
require('@mantine/dates');
var index$6 = require('./index-1ee4ebb8.js');
require('./index-ad7155cf.js');
var index$b = require('./index-db44e8cb.js');
require('./useMantineLocale-e946ce4a.js');
var index$1 = require('./index-25f2e7a5.js');
var index$7 = require('./index-86fd931c.js');
require('./index.styles-6dd86c20.js');
require('./translationsContext-d63b6d32.js');
var hooks = require('@mantine/hooks');
var utils$1 = require('./utils-7ba0038a.js');
require('./other-eb0ff2f6.js');
require('./index-9012f1d1.js');
var utils = require('./utils-8a20288d.js');
var form = require('@mantine/form');
var styled = require('@emotion/styled');
var tslib_es6 = require('./tslib.es6-92cccef3.js');
var index = require('./index-c2c283f8.js');
var yup = require('yup');
var index$3 = require('./index-7cc3b1ef.js');
var index$4 = require('./index-54e83ab7.js');
var Visible = require('./Visible-c5d786e6.js');
var index$5 = require('./index-b0c1d50a.js');
var ReactDOM = require('react-dom');
var miscTheme = require('./miscTheme.js');
var useScreenSize = require('./useScreenSize-30f50b76.js');
var logoIcon = require('./logoIcon-40dae106.js');
var index$8 = require('./index-e4e2220d.js');
var throttle = require('lodash/throttle');
var index$9 = require('./index-b2657c76.js');
var index$a = require('./index-b9594844.js');
var dateFns = require('date-fns');
var flattenChildren = require('react-keyed-flatten-children');
require('@hhgtech/icons/other');
require('@mantine/carousel');
require('./Locale-59ccf941.js');
require('classnames');
require('./useUniqueId-6e2f8c19.js');
require('./constantsSite.js');
require('@hhgtech/icons/core');
require('date-fns/locale');
require('./constantsDomainLocales.js');
require('./constantsRiskScreener.js');
require('./constantsIsProduction.js');
require('@mantine/notifications');
require('dayjs');
require('./WhatsApp-931de57c.js');
require('./Spinner-af067a8f.js');
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var React__default = /*#__PURE__*/_interopDefault(React);
var styled__default = /*#__PURE__*/_interopDefault(styled);
var yup__namespace = /*#__PURE__*/_interopNamespace(yup);
var throttle__default = /*#__PURE__*/_interopDefault(throttle);
var flattenChildren__default = /*#__PURE__*/_interopDefault(flattenChildren);
// define shared context
const OnboardingContext = React.createContext({
currentStep: 0,
setCurrentStep: () => false,
setMaxStep: () => false,
nextStep: () => false,
prevStep: () => false,
isMarryBaby: false,
siteType: 'helloSites',
sharedData: {},
setSharedData: () => false,
});
const [FormProvider, useFormContext, useForm] = form.createFormContext();
const StyledDynamicForm = styled__default["default"](core.Box) `
.phone-input {
width: 100%;
margin-bottom: 32px;
${utils$1.MediaQueries.mbDown} {
margin-bottom: 16px;
}
.PhoneInput {
margin-bottom: 16px;
}
.PhoneInputCountry {
border-radius: 4px 0 0 4px;
}
.PhoneInputInput {
border-radius: 0 4px 4px 0;
}
}
`;
const DynamicForm = (_a) => {
var { inputOrder = ['phone'], withSimilac = false, customTerms = '', formContext } = _a, rest = tslib_es6.__rest(_a, ["inputOrder", "withSimilac", "customTerms", "formContext"]);
const { t } = index.useTranslations();
const form = formContext || useFormContext();
const Phone = (_a) => {
var { label, name = 'phone' } = _a, phoneProps = tslib_es6.__rest(_a, ["label", "name"]);
return (React__default["default"].createElement(core.Input.Wrapper, { className: withSimilac ? 'input-control' : 'phone-input', withAsterisk: true, label: label || withSimilac ? (React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('onboarding.similac.input.phone'))) : undefined },
React__default["default"].createElement(index$2.Phone, Object.assign({ defaultCountry: utils.MAPPED_LOCALE[process.env.UNIFY_LOCALE] || 'VN' }, form.getInputProps(name), phoneProps)),
React__default["default"].createElement(core.Input.Error, { size: "md" }, form.errors.phone)));
};
const FullName = (_a) => {
var { label, name = 'name' } = _a, rest = tslib_es6.__rest(_a, ["label", "name"]);
return (React__default["default"].createElement(index$2.Input, Object.assign({ label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('onboarding.formEmail.yourName')), withAsterisk: true }, form.getInputProps(name), rest)));
};
const Email = (_a) => {
var { label, name = 'email' } = _a, rest = tslib_es6.__rest(_a, ["label", "name"]);
return (React__default["default"].createElement(index$2.Input, Object.assign({ label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('onboarding.formEmail.yourEmail')), withAsterisk: true }, form.getInputProps(name), rest)));
};
const Dob = (_a) => {
var { label, name = 'dob' } = _a, rest = tslib_es6.__rest(_a, ["label", "name"]);
return (React__default["default"].createElement(index$3.DatePicker, Object.assign({ label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('onboarding.formEmail.yourBirthday')), placeholder: "DD/MM/YYYY" }, form.getInputProps(name), rest)));
};
const Gender = (_a) => {
var { label, name = 'gender' } = _a, radioProps = tslib_es6.__rest(_a, ["label", "name"]);
return (React__default["default"].createElement(index$2.Radio.Group, Object.assign({ className: "radio-group", label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('tools.selectGender')) }, form.getInputProps(name), radioProps),
React__default["default"].createElement(index$2.Radio, { value: "0", label: t('onboarding.formEmail.genderMale') }),
React__default["default"].createElement(index$2.Radio, { value: "1", label: t('onboarding.formEmail.genderFemale') })));
};
const Otp = ({ name = 'otp' }) => (React__default["default"].createElement("div", { className: "otp-input" },
React__default["default"].createElement(index$2.OTP, Object.assign({ enterKeyHint: undefined, nonce: undefined }, form.getInputProps(name))),
React__default["default"].createElement(core.Input.Error, null, form.errors.otp)));
const Password = ({ label, name = 'password' }) => (React__default["default"].createElement(index$2.Input.Password, Object.assign({ label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('onboarding.updatePassword.password')), withAsterisk: true, rightSection: React__default["default"].createElement(Visible.Visible, null) }, form.getInputProps(name))));
const Term = ({ name = 'term', className = '' }) => customTerms ? (React__default["default"].createElement("div", { style: { marginBottom: 16 }, className: className },
React__default["default"].createElement(index$2.Checkbox, Object.assign({ label: React__default["default"].createElement(index$1.Text, { size: "p4", as: "span", sx: {
a: {
color: '#2d87f3',
fontWeight: 'bold',
letterSpacing: 0,
},
} }, customTerms) }, form.getInputProps(name, { type: 'checkbox' }), { error: null })),
React__default["default"].createElement(core.Input.Error, { size: "md" }, form.getInputProps('term', { type: 'checkbox' }).error))) : null;
const Address = (_a) => {
var { label, className = '', name = 'address' } = _a, rest = tslib_es6.__rest(_a, ["label", "className", "name"]);
return (React__default["default"].createElement(index$4.AddressInput, Object.assign({ className: `${className} input-control`, label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('onboarding.similac.input.address')) }, form.getInputProps(name), rest)));
};
const ConfirmPassword = ({ label, name = 'confirmPassword', }) => (React__default["default"].createElement(index$2.Input.Password, Object.assign({ label: React__default["default"].createElement(index$1.Text, { size: "s4", weight: "semiBold", as: "span" }, label || t('onboarding.updatePassword.confirmPassword')), withAsterisk: true, rightSection: React__default["default"].createElement(Visible.Visible, null) }, form.getInputProps(name))));
const elements = {
phone: Phone,
full_name: FullName,
email: Email,
dob: Dob,
gender: Gender,
otp: Otp,
password: Password,
confirm_password: ConfirmPassword,
term: Term,
address: Address,
};
const content = inputOrder.map((part) => {
var _a;
const curProps = typeof part === 'string' ? { inputType: part } : part;
return (_a = elements[curProps.inputType]) === null || _a === void 0 ? void 0 : _a.call(elements, curProps);
});
return React__default["default"].createElement(StyledDynamicForm, Object.assign({}, rest), content);
};
const frisoOnboardingSchema = (t) => yup__namespace.object().shape({
phone: yup__namespace.string().required(t('onboarding.updatePhone.error')).default(''),
name: yup__namespace.string().required(t('onboarding.errorMessage.requiredName')),
email: yup__namespace
.string()
.required(t('onboarding.errorMessage.requiredEmail'))
.email(t('onboarding.errorMessage.invalidEmail'))
.default(''),
address: yup__namespace.mixed().required(t('onboarding.similac.address.error')),
term: yup__namespace.bool().oneOf([true], t('validation.error.requiredField')),
});
const FrisoOnboardingForm = (_a, ref) => {
var { inputOrder, onSubmit: _onSubmit, validateSchema, defaultValues, isActive, customTerms, customFormTexts } = _a, rest = tslib_es6.__rest(_a, ["inputOrder", "onSubmit", "validateSchema", "defaultValues", "isActive", "customTerms", "customFormTexts"]);
const { nextStep, setSharedData, sharedData } = React.useContext(OnboardingContext);
const { t } = index.useTranslations();
const form$1 = useForm({
initialValues: {
term: false,
phone: (sharedData === null || sharedData === void 0 ? void 0 : sharedData.phone) || (defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues.phone) || '',
email: (sharedData === null || sharedData === void 0 ? void 0 : sharedData.email) || (defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues.email) || '',
name: (sharedData === null || sharedData === void 0 ? void 0 : sharedData.name) || (defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues.name) || '',
},
validate: validateSchema || form.yupResolver(frisoOnboardingSchema(t)),
});
const onSubmit = (values) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
try {
yield (_onSubmit === null || _onSubmit === void 0 ? void 0 : _onSubmit(values));
setSharedData((d) => (Object.assign(Object.assign({}, d), { phone: values.phone, email: values.email, name: values.name })));
nextStep();
}
catch (err) {
console.error(err);
}
});
const onError = (fieldErrors) => {
console.log(fieldErrors);
};
const handleSubmitForm = () => { var _a; return (_a = form$1.onSubmit(onSubmit, onError)) === null || _a === void 0 ? void 0 : _a(); };
React.useImperativeHandle(ref, () => ({
submitForm: handleSubmitForm,
}));
return (React__default["default"].createElement(core.Box, Object.assign({ "data-active": isActive }, rest),
React__default["default"].createElement(core.Box, { sx: (theme) => ({
display: 'flex',
flexDirection: 'column',
gap: '16px',
[theme.fn.largerThan('md')]: {
gap: '24px',
},
}) },
React__default["default"].createElement(core.Box, { sx: { textAlign: 'center' } },
React__default["default"].createElement(index$5.Heading, { tag: "h4", as: "h2" }, customFormTexts === null || customFormTexts === void 0 ? void 0 : customFormTexts.heading),
React__default["default"].createElement(index$1.Text, { size: "p3" }, customFormTexts === null || customFormTexts === void 0 ? void 0 : customFormTexts.description)),
React__default["default"].createElement(FormProvider, { form: form$1 },
React__default["default"].createElement("form", { className: "friso-form", style: {
width: '100%',
}, onSubmit: form$1.onSubmit(onSubmit, onError) },
React__default["default"].createElement(core.Box, { sx: {
'.friso-form': {
display: 'flex',
flexWrap: 'wrap',
gap: '8px',
'.input-control': {
width: '100%',
marginBottom: 0,
},
'.phone-input': {
marginBottom: '0 !important',
'.PhoneInput': {
marginBottom: '0 !important',
},
},
},
} },
React__default["default"].createElement(DynamicForm, { inputOrder: inputOrder, customTerms: customTerms, className: "friso-form" })))))));
};
var FrisoOnboardingForm$1 = React.forwardRef(FrisoOnboardingForm);
const StyledOnboardingModal = styled__default["default"].div `
position: fixed;
inset: 0;
z-index: 1000;
background: white;
overflow-y: auto;
`;
const StyledContainer = styled__default["default"].div `
height: 100%;
${utils$1.MediaQueries.lgPcUp} {
display: table;
width: 100%;
height: calc(100% - 25px);
}
`;
const StyledContent = styled__default["default"].div `
padding: 16px;
${utils$1.MediaQueries.mbUp} {
padding: 48px 24px 24px;
}
&[data-similac='true'][data-has-banner='true'] {
${utils$1.MediaQueries.mbDown} {
background: white;
border-top-left-radius: 1rem;
border-top-right-radius: 1rem;
margin-top: -1rem;
}
}
`;
const StyledBannerCol = styled__default["default"].div `
width: 640px;
padding: 16px 16px 0 16px;
display: none;
${utils$1.MediaQueries.mbUp} {
width: 640px;
display: table-cell;
}
`;
const StyledBannerInner = styled__default["default"].div `
background-color: ${miscTheme.theme.colors.primary50};
border-radius: 12px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
&[data-is-marry-baby='true'] {
background-color: ${miscTheme.theme.mbColors.tonePink};
}
`;
const StyledIntro = styled__default["default"].div `
margin-top: 40px;
padding: 24px 40px;
`;
const StyledBannerImgWrapper = styled__default["default"].div `
width: 100%;
display: block;
img {
width: 100%;
height: auto;
}
&.similac {
min-width: 1px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
${utils$1.MediaQueries.mbUp} {
position: sticky;
top: 0;
height: 100vh;
}
}
`;
const OnboardingModal = (_a) => {
var { children, withSimilac, banner, withPortal } = _a, rest = tslib_es6.__rest(_a, ["children", "withSimilac", "banner", "withPortal"]);
const { isMobile } = useScreenSize.useScreenSize();
const { isMarryBaby } = React.useContext(OnboardingContext);
const { t } = index.useTranslations();
if (withPortal && typeof window === 'undefined')
return null;
const MainContent = (React__default["default"].createElement(StyledOnboardingModal, Object.assign({}, rest),
React__default["default"].createElement(StyledContainer, null,
React__default["default"].createElement(core.Grid, { sx: {
[utils$1.MediaQueries.mbDown]: {
margin: 0,
},
'.mantine-Grid-col': {
[utils$1.MediaQueries.mbDown]: {
padding: 0,
},
},
} },
React__default["default"].createElement(core.Grid.Col, { span: (typeof banner === 'object' || withSimilac) && !isMobile ? 6 : 12, order: withSimilac ? 2 : 1, orderMd: withSimilac ? 1 : 2, sx: {
zIndex: withSimilac ? 99 : undefined,
} },
React__default["default"].createElement(StyledContent, { "data-similac": withSimilac, "data-has-banner": typeof banner === 'object' }, children)),
banner && typeof banner === 'object' && !withSimilac && (React__default["default"].createElement(core.Grid.Col, { span: !isMobile ? 6 : 12, order: 1, orderMd: 2 },
React__default["default"].createElement(StyledBannerCol, null,
React__default["default"].createElement(StyledBannerInner, { "data-is-marry-baby": isMarryBaby },
React__default["default"].createElement(StyledIntro, null,
banner.heading && (React__default["default"].createElement(core.Title, { order: 1, mb: 24 }, banner.heading)),
banner.description && (React__default["default"].createElement(index$1.Text, { size: "p1", color: miscTheme.theme.colors.gray800 }, t('onboarding.welcomeScreen.content')))),
React__default["default"].createElement(StyledBannerImgWrapper, null, banner.imgSrc ? (React__default["default"].createElement("img", { src: banner.imgSrc, loading: "lazy" })) : banner.imgComponent ? (banner.imgComponent) : null))))),
banner &&
typeof banner === 'object' &&
withSimilac &&
(banner.imgSrc || banner.imgComponent) && (React__default["default"].createElement(core.Grid.Col, { span: 'auto', order: 1, orderMd: 2 },
React__default["default"].createElement(StyledBannerImgWrapper, { className: "similac" }, banner.imgSrc ? (React__default["default"].createElement("img", { src: banner.imgSrc, loading: "lazy" })) : banner.imgComponent ? (banner.imgComponent) : null)))))));
if (withPortal) {
return ReactDOM.createPortal(MainContent, utils$1.getPopupWrapperDom());
}
return MainContent;
};
const StyledFormInner$1 = styled__default["default"].div `
margin-top: 70px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
&.similac {
margin-top: 16px;
}
`;
const StyledOnboarding$1 = styled__default["default"](core.Container) `
&.hhg-comp-onboarding-container.hhg-comp-onboarding-container {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
width: 100%;
max-width: 520px;
}
.header {
margin-bottom: 32px;
text-align: center;
${utils$1.MediaQueries.mbDown} {
margin-bottom: 16px;
}
}
.input-control {
width: 100%;
}
.radio-group,
.input-control {
margin-bottom: 16px;
}
.form {
width: 100%;
}
/* .form-error {
margin-top: 32px;
font-size: 14px;
}
.field-error {
margin-top: 10px;
font-size: 14px;
} */
.form-button {
width: 100%;
}
`;
const StyledThumb$1 = styled__default["default"].img `
margin-bottom: 38px;
`;
const Onboarding$1 = (_a) => {
var _b;
var { heading, description, children, className, imgSrc, hiddenLogo = false } = _a, rest = tslib_es6.__rest(_a, ["heading", "description", "children", "className", "imgSrc", "hiddenLogo"]);
const { isMarryBaby, siteType } = React.useContext(OnboardingContext);
return (React__default["default"].createElement(StyledOnboarding$1, Object.assign({}, rest, { className: `hhg-comp-onboarding-container ${className}`, size: "sm" }),
!hiddenLogo && (React__default["default"].createElement(logoIcon.LogoIcon, { type: isMarryBaby
? siteType
: (((_b = index$6.LOCALE_SPECS[process.env.UNIFY_LOCALE]) === null || _b === void 0 ? void 0 : _b.LOGO_TYPE) ||
'hellobacsi') })),
React__default["default"].createElement(StyledFormInner$1, { className: hiddenLogo ? 'similac' : '' },
imgSrc && React__default["default"].createElement(StyledThumb$1, { src: imgSrc, loading: "lazy" }),
(heading || description) && (React__default["default"].createElement("div", { className: "header" },
heading && React__default["default"].createElement(core.Title, { order: 3 }, heading),
description && (React__default["default"].createElement(index$1.Text, { size: "p3", mt: 8, color: miscTheme.theme.colors.gray600 }, description)))),
children)));
};
const StyledOnboardingForm$2 = styled__default["default"](Onboarding$1) `
.phone-input {
width: 100%;
margin-bottom: 32px;
${utils$1.MediaQueries.mbDown} {
margin-bottom: 16px;
}
.PhoneInput {
margin-bottom: 16px;
}
.PhoneInputCountry {
border-radius: 4px 0 0 4px;
}
.PhoneInputInput {
border-radius: 0 4px 4px 0;
}
}
&:not([data-active='true']) {
display: none !important;
}
`;
const onboardingSchema = (t) => yup__namespace.object().shape({
phone: yup__namespace.string().required(t('onboarding.updatePhone.error')).default(''),
});
const DefaultOnboardingForm = ({ onClose, onSubmit: _onSubmit, canSkip = true, customFormTexts, isActive, submitProps, submitLabel, skipProps, isWhatsApp, }) => {
const { t } = index.useTranslations();
const { sharedData, setSharedData, nextStep } = React.useContext(OnboardingContext);
const form$1 = useForm({
initialValues: {
phone: (sharedData === null || sharedData === void 0 ? void 0 : sharedData.phone) || '',
},
validate: form.yupResolver(onboardingSchema(t)),
});
const onSubmit = (values) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
try {
setSharedData((p) => (Object.assign(Object.assign({}, p), { phone: values.phone })));
const error = yield (_onSubmit === null || _onSubmit === void 0 ? void 0 : _onSubmit(values.phone));
!error && nextStep();
}
catch (err) {
console.error(err);
}
});
const onError = (fieldErrors) => {
console.log(fieldErrors);
};
return (React__default["default"].createElement(StyledOnboardingForm$2, { heading: (customFormTexts === null || customFormTexts === void 0 ? void 0 : customFormTexts.heading) || t('onboarding.updatePhone.heading'), description: (customFormTexts === null || customFormTexts === void 0 ? void 0 : customFormTexts.description) ||
(isWhatsApp
? t('onboarding.updateWhatsapp.description')
: t('onboarding.updatePhone.description')), "data-active": isActive },
React__default["default"].createElement(FormProvider, { form: form$1 },
React__default["default"].createElement("form", { onSubmit: form$1.onSubmit(onSubmit, onError) },
React__default["default"].createElement(DynamicForm, { inputOrder: ['phone'] }),
React__default["default"].createElement(index$7.Button, Object.assign({ variant: "primary", fullWidth: true, size: "lg" }, (isWhatsApp && {
leftIcon: React__default["default"].createElement(index$8.Icon.WhatsApp, { size: 18, useCurrentColor: true }),
}), submitProps, { type: "submit", "data-event-category": isWhatsApp ? 'OTP' : 'Sign Up', "data-event-action": isWhatsApp
? 'Whatsapp - Fill phone and continue Click'
: 'Update Phone Number', "data-event-label": typeof window !== 'undefined' ? window.location.href : '', className: "pointer-event-child-none" }), submitLabel ||
(isWhatsApp
? t('onboarding.updateWhatsapp.submitLabel')
: t('onboarding.button.continue'))),
canSkip && (React__default["default"].createElement(index$7.Button, Object.assign({ variant: "ghost", fullWidth: true, size: "lg" }, (isWhatsApp && {
dataEventCategory: 'OTP',
dataEventAction: 'Whatsapp - Skip fill phone Click',
dataEventLabel: typeof window !== 'undefined' ? window.location.href : '',
}), skipProps, { onClick: onClose, type: "button" }), t('onboarding.button.skip')))))));
};
const StyledOtpForm = styled__default["default"](Onboarding$1) `
.otp-input {
margin-bottom: 36px;
${utils$1.MediaQueries.mbDown} {
margin-bottom: 20px;
}
.otpContainer {
margin-bottom: 16px;
}
}
.resend {
display: flex;
gap: 6px;
margin-bottom: 32px;
${utils$1.MediaQueries.mbDown} {
margin-bottom: 16px;
}
a {
text-decoration: underline;
cursor: pointer;
}
}
.phone-description {
margin-left: 2px;
margin-top: 2px;
}
.otp-description-edit-icon {
cursor: pointer;
vertical-align: bottom;
/* height: 100%; */
margin-bottom: 3px;
margin-left: 3px;
}
`;
// export const StyledOtpForm = styled(Container)`
// &.hhg-comp-onboarding-container.hhg-comp-onboarding-container {
// display: flex;
// flex-direction: column;
// align-items: center;
// height: 100%;
// width: 100%;
// text-align: center;
// max-width: 520px;
// }
// .header {
// margin-top: 70px;
// display: flex;
// flex-direction: column;
// align-items: center;
// justify-content: center;
// gap: 8px;
// margin-bottom: 32px;
// ${MediaQueries.mbDown} {
// margin-bottom: 16px;
// }
// }
// .otpContainer {
// margin-bottom: 36px;
// ${MediaQueries.mbDown} {
// margin-bottom: 20px;
// }
// }
// .resend {
// display: flex;
// gap: 6px;
// margin-bottom: 32px;
// ${MediaQueries.mbDown} {
// margin-bottom: 16px;
// }
// a {
// text-decoration: underline;
// cursor: pointer;
// }
// }
// `
const otpSchema = (t) => yup__namespace.object().shape({
otp: yup__namespace
.string()
.required(t('onboarding.otpForm.error'))
.length(6, t('onboarding.otpForm.error'))
.default(''),
});
const EmailOtpForm = ({ onSubmit: _onSubmit, email: emailProp, onResendCode, otpError, onClose, loading,
// onBack,
canSkip: canSkipInit, }) => {
const { sharedData: { email: emailContext, retryEmailCount }, setSharedData, prevStep, siteType, isMarryBaby, nextStep, } = React.useContext(OnboardingContext);
const email = emailProp || emailContext || '';
const [seconds, setSeconds] = React.useState(30);
const interval = hooks.useInterval(() => setSeconds((s) => s - 1), 1000);
const [canSkip, handlers] = hooks.useCounter(0, { min: 0, max: 3 });
const preventClickRef = React.useRef(true);
const { t } = index.useTranslations();
React.useEffect(() => {
interval.start();
return interval.stop;
}, []);
React.useEffect(() => {
if (seconds === 0) {
interval.stop();
preventClickRef.current = false;
}
}, [seconds]);
const form$1 = useForm({
initialValues: {
otp: '',
},
validate: form.yupResolver(otpSchema(t)),
});
React.useEffect(() => {
if (otpError)
form$1.setFieldError('otp', otpError);
}, [otpError]);
const onSubmit = (values) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
try {
handlers.increment();
const error = yield (_onSubmit === null || _onSubmit === void 0 ? void 0 : _onSubmit(values.otp));
!error && nextStep();
}
catch (err) {
console.error(err);
}
});
const onError = (fieldErrors) => {
console.log(fieldErrors);
};
const throttleResendCode = React.useMemo(() => {
return throttle__default["default"](() => {
if (preventClickRef.current)
return;
handlers.increment();
setSeconds(30);
onResendCode === null || onResendCode === void 0 ? void 0 : onResendCode(email);
interval.start();
preventClickRef.current = true;
}, 1000, { trailing: false });
}, [email, onResendCode, interval]);
const onBack = () => {
if (retryEmailCount >= 2)
return;
setSharedData((d) => (Object.assign(Object.assign({}, d), { retryEmailCount: d.retryEmailCount + 1 })));
prevStep();
};
const outOfEdit = retryEmailCount >= 2;
return (React__default["default"].createElement(StyledOtpForm, { heading: t('onboarding.otpForm.heading'), description: React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement("span", { dangerouslySetInnerHTML: {
__html: t('onboarding.otpForm.descriptionEmail', {
email: `<b style="color:${miscTheme.theme.colors.gray800}">${utils.hiddenEmailChar(email)}</b>`,
}),
} }),
!outOfEdit && (React__default["default"].createElement("svg", { onClick: onBack, width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", className: "otp-description-edit-icon" },
React__default["default"].createElement("path", { d: "M12.7812 1.33337C12.2987 1.33337 11.8162 1.51712 11.4479 1.88546L10.6667 2.66671L13.3333 5.33337L14.1146 4.55212C14.8506 3.81612 14.8506 2.62212 14.1146 1.88546C13.7463 1.51712 13.2638 1.33337 12.7812 1.33337ZM9.66667 3.66671L2 11.3334V14H4.66667L12.3333 6.33337L9.66667 3.66671Z", fill: "#ADB3BC" })))) },
React__default["default"].createElement(FormProvider, { form: form$1 },
React__default["default"].createElement("form", { onSubmit: form$1.onSubmit(onSubmit, onError) },
React__default["default"].createElement(DynamicForm, { inputOrder: ['otp'] }),
React__default["default"].createElement("div", { className: "resend" },
React__default["default"].createElement(index$9.Text, { size: "p4", color: miscTheme.theme.colors.gray400 }, t('onboarding.otpForm.notReceiveOTP')),
React__default["default"].createElement(index$9.Text, { as: "a", size: "p4", color: isMarryBaby ? miscTheme.theme.mbColors.pink : miscTheme.theme.colors.primaryBase, onClick: throttleResendCode }, seconds === 0
? t('onboarding.otpForm.resendCode')
: t('onboarding.otpForm.resendCodeWithSeconds', { seconds }))),
React__default["default"].createElement(index$a.Button, { theme: siteType, color: "primary", isBlock: true, size: "lg", type: "submit", isLoading: loading, disabled: loading, "data-event-category": "Sign Up", "data-event-action": "Confirm Phone Number", "data-event-label": typeof window !== 'undefined' ? window.location.href : '', className: "pointer-event-child-none" }, t('onboarding.button.continue')),
canSkipInit && canSkip >= 3 && (React__default["default"].createElement(index$a.Button, { theme: siteType, color: "ghost", isBlock: true, size: "lg", onClick: onClose, type: "button" }, t('onboarding.button.skip')))))));
};
const PhoneOtpForm = ({ onSubmit: _onSubmit, phone: phoneProp, onResendCode, otpError, onClose, loading,
// onBack,
canSkip: canSkipInit, isWhatsApp, }) => {
const { sharedData: { phone: phoneContext, retryPhoneCount }, setSharedData, prevStep, siteType, isMarryBaby, nextStep, } = React.useContext(OnboardingContext);
const phone = phoneProp || phoneContext || '';
const [seconds, setSeconds] = React.useState(30);
const interval = hooks.useInterval(() => setSeconds((s) => s - 1), 1000);
const [canSkip, handlers] = hooks.useCounter(0, { min: 0, max: 3 });
const preventClickRef = React.useRef(true);
const { t } = index.useTranslations();
React.useEffect(() => {
interval.start();
return interval.stop;
}, []);
React.useEffect(() => {
if (seconds === 0) {
interval.stop();
preventClickRef.current = false;
}
}, [seconds]);
const form$1 = useForm({
initialValues: {
otp: '',
},
validate: form.yupResolver(otpSchema(t)),
});
React.useEffect(() => {
if (otpError)
form$1.setFieldError('otp', otpError);
}, [otpError]);
const onSubmit = (values) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
try {
handlers.increment();
const error = yield (_onSubmit === null || _onSubmit === void 0 ? void 0 : _onSubmit(values.otp));
!error && nextStep();
}
catch (err) {
console.error(err);
}
});
const onError = (fieldErrors) => {
console.log(fieldErrors);
};
const throttleResendCode = React.useMemo(() => {
return throttle__default["default"](() => {
if (preventClickRef.current)
return;
handlers.increment();
setSeconds(30);
onResendCode === null || onResendCode === void 0 ? void 0 : onResendCode(phone);
interval.start();
preventClickRef.current = true;
}, 1000, { trailing: false });
}, [phone, onResendCode, interval]);
const onBack = () => {
if (retryPhoneCount >= 2)
return;
setSharedData((d) => (Object.assign(Object.assign({}, d), { retryPhoneCount: d.retryPhoneCount + 1 })));
prevStep();
};
const outOfEdit = retryPhoneCount >= 2;
const phoneEleStr = `<b style="color:${miscTheme.theme.colors.gray800}">${phone
.slice(0, -3)
.replace(/./g, 'x')
.concat(phone.slice(-3))}</b>`;
return (React__default["default"].createElement(StyledOtpForm, { heading: isWhatsApp ? (React__default["default"].createElement(core.Flex, { align: 'center', justify: 'center', gap: core.rem(8) },
React__default["default"].createElement("img", { style: { width: core.rem(24) }, loading: "lazy", src: index$b.CommonGAssets.getAssetPath('whatsapp.svg'), alt: "whatsapp" }),
React__default["default"].createElement("span", null, t('onboarding.otpWhatsapps.heading')))) : (t('onboarding.otpForm.heading')), description: React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement("span", { dangerouslySetInnerHTML: {
__html: t(isWhatsApp
? 'onboarding.otpWhatsapps.description'
: 'onboarding.otpForm.description', {
phone: phoneEleStr,
}),
} }),
!outOfEdit && (React__default["default"].createElement("svg", { onClick: onBack, width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", className: "otp-description-edit-icon" },
React__default["default"].createElement("path", { d: "M12.7812 1.33337C12.2987 1.33337 11.8162 1.51712 11.4479 1.88546L10.6667 2.66671L13.3333 5.33337L14.1146 4.55212C14.8506 3.81612 14.8506 2.62212 14.1146 1.88546C13.7463 1.51712 13.2638 1.33337 12.7812 1.33337ZM9.66667 3.66671L2 11.3334V14H4.66667L12.3333 6.33337L9.66667 3.66671Z", fill: "#ADB3BC" })))) },
React__default["default"].createElement(FormProvider, { form: form$1 },
React__default["default"].createElement("form", { onSubmit: form$1.onSubmit(onSubmit, onError) },
React__default["default"].createElement(DynamicForm, { inputOrder: ['otp'] }),
React__default["default"].createElement("div", { className: "resend" },
React__default["default"].createElement(index$1.Text, { size: "p4", color: miscTheme.theme.colors.gray400 }, t('onboarding.otpForm.notReceiveOTP')),
React__default["default"].createElement(index$1.Text, { as: "a", size: "p4", color: isMarryBaby ? miscTheme.theme.mbColors.pink : miscTheme.theme.colors.primaryBase, onClick: throttleResendCode }, seconds === 0
? t('onboarding.otpForm.resendCode')
: t('onboarding.otpForm.resendCodeWithSeconds', { seconds }))),
React__default["default"].createElement(index$a.Button, { theme: siteType, color: "primary", isBlock: true, size: "lg", type: "submit", isLoading: loading, disabled: loading, "data-event-category": isWhatsApp ? 'OTP' : 'Sign Up', "data-event-action": isWhatsApp
? 'Whatsapp - OTP verified Click'
: 'Confirm Phone Number', "data-event-label": typeof window !== 'undefined' ? window.location.href : '', className: "pointer-event-child-none" }, t('onboarding.button.continue')),
canSkipInit && canSkip >= 3 && (React__default["default"].createElement(index$a.Button, { theme: siteType, color: "ghost", isBlock: true, size: "lg", onClick: onClose, type: "button" }, t('onboarding.button.skip')))))));
};
const onboardingEmailSchema = (t) => yup__namespace.object().shape({
email: yup__namespace
.string()
.required(t('onboarding.errorMessage.requiredEmail'))
.email(t('onboarding.errorMessage.invalidEmail'))
.default(''),
name: yup__namespace.string().required(t('onboarding.errorMessage.requiredName')),
});
const StyledFormInner = styled__default["default"].div `
margin-top: 70px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
&.similac {
margin-top: 16px;
}
`;
const StyledOnboarding = styled__default["default"](core.Container) `
&.hhg-comp-onboarding-container.hhg-comp-onboarding-container {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
width: 100%;
max-width: 520px;
}
.header {
margin-bottom: 32px;
text-align: center;
${utils$1.MediaQueries.mbDown} {
margin-bottom: 16px;
}
}
.input-control {
width: 100%;
}
.radio-group,
.input-control {
margin-bottom: 16px;
}
.form {
width: 100%;
}
/* .form-error {
margin-top: 32px;
font-size: 14px;
}
.field-error {
margin-top: 10px;
font-size: 14px;
} */
.form-button {
width: 100%;
}
`;
const StyledThumb = styled__default["default"].img `
margin-bottom: 38px;
`;
const OnboardingUI = (_a) => {
var _b;
var { heading, description, children, className, imgSrc, hiddenLogo = false } = _a, rest = tslib_es6.__rest(_a, ["heading", "description", "children", "className", "imgSrc", "hiddenLogo"]);
const { isMarryBaby, siteType } = React.useContext(OnboardingContext);
return (React__default["default"].createElement(StyledOnboarding, Object.assign({}, rest, { className: `hhg-comp-onboarding-container ${className}`, size: "sm" }),
!hiddenLogo && (React__default["default"].createElement(logoIcon.LogoIcon, { type: isMarryBaby
? siteType
: (((_b = index$6.LOCALE_SPECS[process.env.UNIFY_LOCALE]) === null || _b === void 0 ? void 0 : _b.LOGO_TYPE) ||
'hellobacsi') })),
React__default["default"].createElement(StyledFormInner, { className: hiddenLogo ? 'similac' : '' },
imgSrc && React__default["default"].createElement(StyledThumb, { src: imgSrc, loading: "lazy" }),
React__default["default"].createElement("div", { className: "header" },
React__default["default"].createElement(core.Title, { order: 3 }, heading),
React__default["default"].createElement(index$1.Text, { size: "p3", mt: 8, color: miscTheme.theme.colors.gray600 }, description)),
children)));
};
const PersonalInfoForm = ({ onClose, onSubmit, canSkip, loading, errorMessage, initialData, }) => {
const { t, locale } = index.useTranslations();
const { siteType, isMarryBaby, setSharedData, nextStep } = React.useContext(OnboardingContext);
const form$1 = useForm({
validate: form.yupResolver(onboardingEmailSchema(t)),
});
const onError = (fieldErrors) => {
console.log({ fieldErrors });
};
React.useEffect(() => {
form$1.setValues(Object.assign(Object.assign({ gender: '0' }, initialData), ((initialData === null || initialData === void 0 ? void 0 : initialData.birthday) && {
birthday: new Date(initialData.birthday),
})));
}, [initialData]);
React.useEffect(() => {
if (errorMessage)
form$1.setFieldError('email', errorMessage);
}, [errorMessage]);
return (React__default["default"].createElement(OnboardingUI, { heading: t('onboarding.formEmail.heading'), description: t('onboarding.formEmail.description', {
site: isMarryBaby
? 'Marry Baby'
: index$6.LOCALE_SPECS[locale].SITE_NAME_FORMATTED,
}) },
React__default["default"].createElement(FormProvider, { form: form$1 },
React__default["default"].createElement("form", { className: "form", onSubmit: form$1.onSubmit((values) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
setSharedData((d) => (Object.assign(Object.assign({}, d), values)));
const error = yield (onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(Object.assign(Object.assign({}, values), { birthday: values.birthday && dateFns.format(values.birthday, 'yyyy-MM-dd') })));
!error && nextStep();
}), onError) },
React__default["default"].createElement(DynamicForm, { inputOrder: ['full_name', 'email', 'dob', 'gender'] }),
React__default["default"].createElement(index$a.Button, { color: "primary", isBlock: true, size: "lg", type: "submit", theme: siteType, isLoading: loading, disabled: loading }, t('onboarding.button.continue')),
canSkip && (React__default["default"].createElement(index$a.Button, { theme: siteType, color: "ghost", isBlock: true, size: "lg", onClick: onClose, type: "button" }, t('onboarding.button.skip')))))));
};
const OnboardingProvider = ({ children, siteType, setSharedData: _setSharedData, }) => {
const [currentStep, setCurrentStep] = React.useState(0);
const [maxStep, setMaxStep] = React.useState(0);
const [sharedData, setSharedData] = React.useState({});
const nextStep = () => currentStep + 1 <= maxStep && setCurrentStep(currentStep + 1);
const prevStep = () => currentStep - 1 >= 0 && setCurrentStep(currentStep - 1);
React.useEffect(() => {
_setSharedData === null || _setSharedData === void 0 ? void 0 : _setSharedData(sharedData);
}, [sharedData, _setSharedData]);
return (React__default["default"].createElement(OnboardingContext.Provider, { value: {
currentStep,
setCurrentStep,
setMaxStep,
nextStep,
prevStep,
siteType,
isMarryBaby: siteType === 'marryBaby',
sharedData,
setSharedData,
} }, children));
};
const ResultScreen = (_a) => {
var { onClose } = _a, rest = tslib_es6.__rest(_a, ["onClose"]);
const { t } = index.useTranslations();
const { siteType } = React.useContext(OnboardingContext);
return (React__default["default"].createElement(OnboardingUI, Object.assign({}, rest),
React__default["default"].createElement(index$a.Button, { theme: siteType, size: "lg", onClick: onClose, className: "form-button" }, t('onboarding.button.continue'))));
};
const StyledOnboardingForm$1 = styled__default["default"](Onboarding$1) `
.phone-input {
width: 100%;
margin-bottom: 32px;
${utils$1.MediaQueries.mbDown} {
margin-bottom: 16px;
}
.PhoneInput {
margin-bottom: 16px;
}
.PhoneInputCountry {
border-radius: 4px 0 0 4px;
}
.PhoneInputInput {
border-radius: 0 4px 4px 0;
}
}
&:not([data-active='true']) {
display: none !important;
}
`;
const similacOnboardingSchema = (t, optionalTerm) => yup__namespace.object().shape({
phone: yup__namespace.string().required(t('onboarding.updatePhone.error')).default(''),
name: yup__namespace.string().required(t('onboarding.errorMessage.requiredName')),
email: yup__namespace
.string()
.required(t('onboarding.errorMessage.requiredEmail'))
.email(t('onboarding.errorMessage.invalidEmail'))
.default(''),
address: yup__namespace.mixed().required(t('onboarding.similac.address.error')),
term: optionalTerm
? yup__namespace.bool()
: yup__namespace.bool().oneOf([true], t('validation.error.requiredField')),
});
const SimilacOnboardingForm = (_a) => {
var { onClose, onSubmit: _onSubmit, canSkip = true, customFormTexts, customTerms, defaultValues, isActive } = _a, rest = tslib_es6.__rest(_a, ["onClose", "onSubmit", "canSkip", "customFormTexts", "customTerms", "defaultValues", "isActive"]);
const { t } = index.useTranslations();
const { nextStep, setSharedData, sharedData } = React.useContext(OnboardingContext);
const { isMobile } = useScreenSize.useScreenSize();
const form$1 = useForm({
initialValues: {
term: false,
phone: (sharedData === null || sharedData === void 0 ? void 0 : sharedData.phone) || (defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues.phone) || '',
email: (sharedData === null || sharedData === void 0 ? void 0 : sharedData.email) || (defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues.email) || '',
name: (sharedData === null || sharedData === void 0 ? void 0 : sharedData.name) || (defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues.name) || '',
},
validate: form.yupResolver(similacOnboardingSchema(t, !customTerms)),
});
const onSubmit = (values) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
try {
yield (_onSubmit === null || _onSubmit === void 0 ? void 0 : _onSubmit(values));
setSharedData((d) => (Object.assign(Object.assign({}, d), { phone: values.phone, email: values.email, name: values.name })));
nextStep();
}
catch (err) {
console.error(err);
}
});
const onError = (fieldErrors) => {
console.log(fieldErrors);
};
const inputOrder = (defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues.email)
? ['full_name', 'phone', 'address', 'term']
: ['full_name', 'email', 'phone', 'address', 'term'];
return (React__default["default"].createElement(StyledOnboardingForm$1, Object.assign({ heading: (customFormTexts === null || customFormTexts === void 0 ? void 0 : customFormTexts.heading) || t('onboarding.updatePhone.heading'), description: (customFormTexts === null || customFormTexts === void 0 ? void 0 : customFormTexts.description) || t('onboarding.updatePhone.description'), hiddenLogo: isMobile, "data-active": isActive }, rest),
React__default["default"].createElement(FormProvider, { form: form$1 },
React__default["default"].createElement("form", { style: {
width: '100%',
}, onSubmit: form$1.onSubmit(onSubmit, onError) },
React__default["default"].createElement(DynamicForm, { inputOrder: inputOrder, withSimilac: true, customTerms: customTerms }),
React__default["default"].createElement(index$7.Button, { fullWidth: true, size: "lg", type: "submit", "data-event-category": "Sign Up", "data-event-action": "Update Phone Number", "data-event-label": typeof window !== 'undefined' ? window.location.href : '', className: "pointer-event-child-none" }, t('onboarding.button.continue')),