UNPKG

@hhgtech/hhg-components

Version:
428 lines (423 loc) • 22.5 kB
'use strict'; var tslib_es6 = require('./tslib.es6-92cccef3.js'); var zustand = require('zustand'); var index = require('./index-fa7abbff.js'); var index$1 = require('./index-1ee4ebb8.js'); var miscCookieHelper = require('./miscCookieHelper.js'); exports.SSOStepTypeType = void 0; (function (SSOStepTypeType) { SSOStepTypeType["FIRST"] = "first"; SSOStepTypeType["EMAIL"] = "email"; SSOStepTypeType["VERIFY_PHONE"] = "verify_phone"; SSOStepTypeType["PASSWORD"] = "password"; SSOStepTypeType["UPDATE_EMAIL"] = "update_email"; SSOStepTypeType["FORGOT_PASSWORD_PHONE"] = "forgot_password_phone"; SSOStepTypeType["FORGOT_PASSWORD_SETUP"] = "forgot_password_setup"; SSOStepTypeType["OTP"] = "otp"; SSOStepTypeType["SETUP_FULL"] = "setup_full"; })(exports.SSOStepTypeType || (exports.SSOStepTypeType = {})); // export const SSOStepsProvider = ({ // children, // defaultSteps, // }: { // children: ReactNode // defaultSteps?: SSOStepType[] // }) => { // const [steps, setSteps] = useState<SSOStepType[]>( // defaultSteps || [ // { // type: SSOStepTypeType.FIRST, // }, // ], // ) // const [currentStepIndex, setCurrentStepIndex] = useState(0) // const [shareData, setShareData] = useState<SSOShareDataType>({}) // return ( // <SSOStepsContext.Provider // value={{ // currentStepIndex, // steps, // setSteps, // addStep: (step: SSOStepType) => { // setSteps((s) => [...s, step]) // }, // goNext: () => { // setCurrentStepIndex((index) => index + 1) // }, // goBack: () => { // setCurrentStepIndex((index) => index - 1) // // remove step when go back // setSteps((steps) => steps.slice(0, steps.length - 1)) // }, // shareData, // setShareData, // }} // > // {children} // </SSOStepsContext.Provider> // ) // } const useSSOSteps = zustand.create((set) => ({ currentStepIndex: 0, steps: [ { type: exports.SSOStepTypeType.FIRST, }, ], setSteps: (s) => set((state) => ({ steps: typeof s === 'function' ? s(state.steps) : s })), addStep: (step) => { set((state) => ({ steps: [...state.steps, step], })); }, goNext: () => { set((state) => ({ currentStepIndex: state.currentStepIndex + 1 })); }, goBack: () => { set((state) => ({ currentStepIndex: state.currentStepIndex - 1, steps: state.steps.slice(0, state.steps.length - 1), })); }, })); const useSSOV2Store = zustand.create()((set, get) => ({ userInfo: undefined, abTestFlow: 'A', setABTestFlow(abTestFlow) { set({ abTestFlow }); }, setUserInfo: (userInfo) => set({ userInfo }), isOpen: false, setOpen: (isOpen) => set({ isOpen }), returnUrl: undefined, setReturnUrl: (returnUrl) => set({ returnUrl }), mounted: false, setMounted: (mounted) => set({ mounted }), source: undefined, setSource: (source) => set({ source }), setupSource: undefined, setSetupSource: (setupSource) => set({ setupSource }), setOnCloseProp: (onClose) => set({ onCloseProp: onClose }), triggerLogin: (params) => { var _a, _b; const { source, returnUrl } = params || {}; const alreadyHasToken = miscCookieHelper.getCookie(index$1.BEARER_TOKEN_COOKIE); if (alreadyHasToken) { redirect(params === null || params === void 0 ? void 0 : params.returnUrl, params === null || params === void 0 ? void 0 : params.source, params === null || params === void 0 ? void 0 : params.forceReloadOnClose); set({ isOpen: false, }); (_b = (_a = get()).onCloseProp) === null || _b === void 0 ? void 0 : _b.call(_a); } else { useSSOSteps.setState({ steps: [ { type: exports.SSOStepTypeType.FIRST, config: { legalTextType: ((returnUrl === null || returnUrl === void 0 ? void 0 : returnUrl.includes('joincommunity=1')) ? 'community' : params === null || params === void 0 ? void 0 : params.legalTextType) || 'default', }, }, ], currentStepIndex: 0, }); set({ isOpen: true, returnUrl, source, overrideClose: undefined, forceReloadOnClose: (returnUrl === null || returnUrl === void 0 ? void 0 : returnUrl.includes('joincommunity=1')) ? true : (params === null || params === void 0 ? void 0 : params.forceReloadOnClose) || false, flowData: undefined, userInfo: undefined, }); } }, triggerCareEmailPhoneVerify: (params) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () { var _a, _b, _c; const userInfo = yield index.getUserInfo(); if ((_a = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _a === void 0 ? void 0 : _a.first_time_login) { userInfo._data.first_time_login = 0; } set({ userInfo: userInfo === null || userInfo === void 0 ? void 0 : userInfo._data }); const forceUpdatePhoneEmail = (alreadyLoggedIn) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () { var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s; const userInfo = yield index.getUserInfo(); const hasPhone = !!((_d = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _d === void 0 ? void 0 : _d.phone) && !!((_e = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _e === void 0 ? void 0 : _e.phone_verified_at); const hasEmail = !!((_f = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _f === void 0 ? void 0 : _f.email) && !!((_g = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _g === void 0 ? void 0 : _g.email_verified_at) && !((_j = (_h = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _h === void 0 ? void 0 : _h.email) === null || _j === void 0 ? void 0 : _j.endsWith('@hhg.com')) && !((_l = (_k = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _k === void 0 ? void 0 : _k.email) === null || _l === void 0 ? void 0 : _l.endsWith('@facebook.com')); const hasName = !!((_m = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _m === void 0 ? void 0 : _m.name); const hasBirthday = !!((_o = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _o === void 0 ? void 0 : _o.birthday); const hasGender = typeof ((_p = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _p === void 0 ? void 0 : _p.gender) === 'number'; const provider = (_q = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _q === void 0 ? void 0 : _q.provider; const finishedSetup = hasName && hasBirthday && hasGender; if (!hasPhone || !hasEmail) { useSSOSteps.setState({ steps: [ { type: !hasPhone ? exports.SSOStepTypeType.VERIFY_PHONE : exports.SSOStepTypeType.UPDATE_EMAIL, config: !hasPhone && !hasEmail ? { provider, afterAction: 'update-email', } : { provider, afterAction: !(params === null || params === void 0 ? void 0 : params.skipForceSetup) ? 'setup' : 'done', }, }, ], currentStepIndex: 0, }); set((s) => (Object.assign({ source: params === null || params === void 0 ? void 0 : params.source, returnUrl: params === null || params === void 0 ? void 0 : params.returnUrl, isOpen: true, overrideClose: undefined, forceReloadOnClose: true }, (alreadyLoggedIn && !s.flowData ? { flowData: getSSOFlowFromUserProfile(userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) } : {})))); } else if (!(params === null || params === void 0 ? void 0 : params.skipForceSetup) && !finishedSetup) { useSSOSteps.setState({ steps: [ { type: exports.SSOStepTypeType.SETUP_FULL, config: { userInfo: userInfo._data, }, }, ], currentStepIndex: 0, }); set((s) => (Object.assign({ source: params === null || params === void 0 ? void 0 : params.source, returnUrl: params === null || params === void 0 ? void 0 : params.returnUrl, isOpen: true, overrideClose: undefined, forceReloadOnClose: true }, (alreadyLoggedIn && !s.flowData ? { flowData: getSSOFlowFromUserProfile(userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) } : {})))); } else { redirect(params === null || params === void 0 ? void 0 : params.returnUrl, params === null || params === void 0 ? void 0 : params.source, true); set({ isOpen: false, forceReloadOnClose: false, }); (_s = (_r = get()).onCloseProp) === null || _s === void 0 ? void 0 : _s.call(_r); } }); if (!((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _b === void 0 ? void 0 : _b.id)) { useSSOSteps.setState({ steps: [ { type: exports.SSOStepTypeType.FIRST, config: { legalTextType: (((_c = params === null || params === void 0 ? void 0 : params.returnUrl) === null || _c === void 0 ? void 0 : _c.includes('joincommunity=1')) ? 'community' : params === null || params === void 0 ? void 0 : params.legalTextType) || 'default', }, }, ], currentStepIndex: 0, }); set({ isOpen: true, overrideClose: forceUpdatePhoneEmail, source: params === null || params === void 0 ? void 0 : params.source, returnUrl: params === null || params === void 0 ? void 0 : params.returnUrl, forceReloadOnClose: true, flowData: undefined, }); return; } else { forceUpdatePhoneEmail(true); } }), triggerCommunityEmailVerify: (params) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () { var _t, _u, _v; const userInfo = yield index.getUserInfo(); if ((_t = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _t === void 0 ? void 0 : _t.first_time_login) { userInfo._data.first_time_login = 0; } set({ userInfo: userInfo === null || userInfo === void 0 ? void 0 : userInfo._data }); const forceUpdateEmail = (alreadyLoggedIn) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () { var _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7; const userInfo = yield index.getUserInfo(); const hasEmail = !!((_w = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _w === void 0 ? void 0 : _w.email) && !!((_x = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _x === void 0 ? void 0 : _x.email_verified_at) && !((_z = (_y = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _y === void 0 ? void 0 : _y.email) === null || _z === void 0 ? void 0 : _z.endsWith('@hhg.com')) && !((_1 = (_0 = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _0 === void 0 ? void 0 : _0.email) === null || _1 === void 0 ? void 0 : _1.endsWith('@facebook.com')); const hasName = !!((_2 = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _2 === void 0 ? void 0 : _2.name); const hasBirthday = !!((_3 = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _3 === void 0 ? void 0 : _3.birthday); const hasGender = typeof ((_4 = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _4 === void 0 ? void 0 : _4.gender) === 'number'; const provider = (_5 = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _5 === void 0 ? void 0 : _5.provider; const finishedSetup = hasName && hasBirthday && hasGender; if (!hasEmail) { useSSOSteps.setState({ steps: [ { type: exports.SSOStepTypeType.UPDATE_EMAIL, config: { provider, afterAction: 'setup', }, }, ].filter(Boolean), currentStepIndex: 0, }); set((s) => (Object.assign({ source: params === null || params === void 0 ? void 0 : params.source, returnUrl: params === null || params === void 0 ? void 0 : params.returnUrl, isOpen: true, overrideClose: undefined, forceReloadOnClose: (params === null || params === void 0 ? void 0 : params.forceReloadOnClose) || false }, (alreadyLoggedIn && !s.flowData ? { flowData: getSSOFlowFromUserProfile(userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) } : {})))); } else if (!finishedSetup) { useSSOSteps.setState({ steps: [ { type: exports.SSOStepTypeType.SETUP_FULL, config: { userInfo: userInfo._data, }, }, ], currentStepIndex: 0, }); set((s) => (Object.assign({ source: params === null || params === void 0 ? void 0 : params.source, returnUrl: params === null || params === void 0 ? void 0 : params.returnUrl, isOpen: true, overrideClose: undefined, forceReloadOnClose: true }, (alreadyLoggedIn && !s.flowData ? { flowData: getSSOFlowFromUserProfile(userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) } : {})))); } else { redirect(params === null || params === void 0 ? void 0 : params.returnUrl, params === null || params === void 0 ? void 0 : params.source, true); set({ isOpen: false, forceReloadOnClose: false, }); (_7 = (_6 = get()).onCloseProp) === null || _7 === void 0 ? void 0 : _7.call(_6); } }); if (!((_u = userInfo === null || userInfo === void 0 ? void 0 : userInfo._data) === null || _u === void 0 ? void 0 : _u.id)) { useSSOSteps.setState({ steps: [ { type: exports.SSOStepTypeType.FIRST, config: { legalTextType: (((_v = params === null || params === void 0 ? void 0 : params.returnUrl) === null || _v === void 0 ? void 0 : _v.includes('joincommunity=1')) ? 'community' : params === null || params === void 0 ? void 0 : params.legalTextType) || 'default', }, }, ], currentStepIndex: 0, }); set({ isOpen: true, overrideClose: forceUpdateEmail, source: params === null || params === void 0 ? void 0 : params.source, returnUrl: params === null || params === void 0 ? void 0 : params.returnUrl, forceReloadOnClose: true, flowData: undefined, }); return; } else { forceUpdateEmail(true); } }), forceReloadOnClose: false, })); const redirect = (returnUrl, source, forceReload) => { if (forceReload) { let newReturnUrl; if ((returnUrl === null || returnUrl === void 0 ? void 0 : returnUrl.startsWith('http')) || (returnUrl === null || returnUrl === void 0 ? void 0 : returnUrl.startsWith('//'))) { newReturnUrl = new URL(returnUrl); } else if (returnUrl) { newReturnUrl = new URL(returnUrl, window.location.href); } else { newReturnUrl = new URL(window.location.href); } if (source) { newReturnUrl.searchParams.set('source', source); } window.location.href = newReturnUrl.href; return true; } const currentUrl = new URL(window.location.href); if (returnUrl) { let newReturnUrl; if (returnUrl.startsWith('http') || returnUrl.startsWith('//')) { newReturnUrl = new URL(returnUrl); } else { newReturnUrl = new URL(returnUrl, window.location.href); } const paramSource = newReturnUrl.searchParams.get('source'); currentUrl.searchParams.delete('source'); newReturnUrl.searchParams.delete('source'); // delete source from both url so we can compare and readd source later if needed const _source = paramSource || source; if (currentUrl.href !== newReturnUrl.href) { if (_source) { newReturnUrl.searchParams.set('source', _source || ''); } window.location.href = newReturnUrl.href; return true; } } if (source) { currentUrl.searchParams.set('source', source); window.history.replaceState({}, '', currentUrl.href); return; } }; const SSOV2_LOCALES = ['vi-VN', 'id-ID', 'ms-MY']; const IS_SSOV2_ENABLED = (locale) => { return (!process.env.NEXT_PUBLIC_MARRY_BABY && SSOV2_LOCALES.includes(locale || process.env.UNIFY_LOCALE || process.env.NEXT_PUBLIC_DEPLOY_LOCALE || '')); }; const getSSOFlowFromUserProfile = (userInfo) => { if (!userInfo) throw new Error('userInfo is required'); const hasName = !!(userInfo === null || userInfo === void 0 ? void 0 : userInfo.name); const hasBirthday = !!(userInfo === null || userInfo === void 0 ? void 0 : userInfo.birthday); const hasGender = typeof (userInfo === null || userInfo === void 0 ? void 0 : userInfo.gender) === 'number'; const finishedSetup = hasName && hasBirthday && hasGender; return { flow: finishedSetup ? 'signup' : 'login', method: (userInfo === null || userInfo === void 0 ? void 0 : userInfo.provider) || 'email', }; }; const isUserFinishedSetup = (userInfo) => { if (!userInfo) throw new Error('userInfo is required'); const hasName = !!(userInfo === null || userInfo === void 0 ? void 0 : userInfo.name); const hasBirthday = !!(userInfo === null || userInfo === void 0 ? void 0 : userInfo.birthday); const hasGender = typeof (userInfo === null || userInfo === void 0 ? void 0 : userInfo.gender) === 'number'; return hasName && hasBirthday && hasGender; }; const isFlowFinishedSetup = (flowData) => { var _a, _b, _c; return (((_a = flowData === null || flowData === void 0 ? void 0 : flowData.metaData) === null || _a === void 0 ? void 0 : _a.is_gender) && ((_b = flowData === null || flowData === void 0 ? void 0 : flowData.metaData) === null || _b === void 0 ? void 0 : _b.is_name) && ((_c = flowData === null || flowData === void 0 ? void 0 : flowData.metaData) === null || _c === void 0 ? void 0 : _c.is_birthday)); }; const isPhoneNotVerifedYet = (userInfo) => { return !(userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone_verified_at) || !(userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone); }; const isLoginWithPhoneNotVerifedYet = (flowData, userInfo) => { return ((flowData === null || flowData === void 0 ? void 0 : flowData.flow) === 'login' && (userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone) && (userInfo === null || userInfo === void 0 ? void 0 : userInfo.area_code) && !(userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone_verified_at)); }; exports.IS_SSOV2_ENABLED = IS_SSOV2_ENABLED; exports.isFlowFinishedSetup = isFlowFinishedSetup; exports.isLoginWithPhoneNotVerifedYet = isLoginWithPhoneNotVerifedYet; exports.isPhoneNotVerifedYet = isPhoneNotVerifedYet; exports.isUserFinishedSetup = isUserFinishedSetup; exports.redirect = redirect; exports.useSSOSteps = useSSOSteps; exports.useSSOV2Store = useSSOV2Store;