@hhgtech/hhg-components
Version:
Hello Health Group common components
286 lines (265 loc) • 11.9 kB
JavaScript
'use strict';
var tslib_es6 = require('./tslib.es6-92cccef3.js');
var React = require('react');
var core = require('@hhgtech/icons/core');
var Spinner = require('./Spinner-af067a8f.js');
var index$2 = require('./index-ae1a5588.js');
var index$1 = require('./index-86fd931c.js');
var index$4 = require('./index-25f2e7a5.js');
var index = require('./index-c2c283f8.js');
var index$3 = require('./index-db44e8cb.js');
var miscTheme = require('./miscTheme.js');
var styled = require('@emotion/styled');
var utils = require('./utils-7ba0038a.js');
var miscDefaultClassWrapper = require('./miscDefaultClassWrapper.js');
var profileNavigation = require('./profileNavigation.js');
var navigationLogoutPopup = require('./navigationLogoutPopup.js');
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefault(React);
var styled__default = /*#__PURE__*/_interopDefault(styled);
const useCSSFocusPopupHelper = (configs) => {
const { allowBgScroll } = configs || {};
const ref = React.useRef();
return {
containerRef: ref,
onContainerFocus: () => {
if (!allowBgScroll)
document.documentElement.style.overflow = 'hidden';
},
onContainerBlur: () => {
if (!allowBgScroll)
document.documentElement.style.overflow = '';
},
onButtonMouseDown: (e) => {
// this close popup when click, run after REact init
if (ref.current &&
(document.activeElement === ref.current ||
ref.current.contains(document.activeElement))) {
ref.current.blur();
document.activeElement.blur();
e.preventDefault();
}
},
onClose: () => {
if (ref.current &&
(document.activeElement === ref.current ||
ref.current.contains(document.activeElement))) {
ref.current.blur();
document.activeElement.blur();
}
},
};
};
const StyledPopup = miscDefaultClassWrapper.setDefaultClass(styled__default["default"].div `
position: absolute;
right: 0;
transition: all 0.5s ease-in-out;
overflow-y: auto;
&[data-open='true'] {
z-index: 200;
top: 120%;
opacity: 1;
visibility: visible;
}
&[data-open='false'] {
display: none;
}
.popup-content {
z-index: 111;
height: 100%;
border: 1px solid #0000001a;
border-radius: 16px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
/* min-height: 415px; */
${utils.MediaQueries.mbUp} {
width: 320px;
}
${utils.MediaQueries.mbDown} {
position: fixed;
left: 0;
width: 100%;
padding-bottom: 70px;
}
`, 'hhgcomp-navprofilebutton-popup');
const StyledPopupWrapper = miscDefaultClassWrapper.setDefaultClass(styled__default["default"].div `
position: fixed;
z-index: 150;
top: var(--header-bottom, 56px);
left: 0;
width: 100%;
height: 100%;
align-items: center;
${utils.MediaQueries.mbUp} {
background-color: transparent;
&[data-type='welcome'] {
background: rgba(38, 38, 38, 0.3);
}
&[data-type='due-date'] {
background: rgba(38, 38, 38, 0.3);
}
}
${utils.MediaQueries.mbDown} {
background: rgba(38, 38, 38, 0.3);
}
&[data-type='welcome'] {
top: 0;
}
&[data-open='false'] {
display: none;
}
`, 'hhgcomp-navprofilebutton-popupwrapper');
const StyledAvatar = styled__default["default"].div `
width: 36px;
height: 36px;
cursor: pointer;
img {
border-radius: 50%;
}
.avatar {
width: 36px;
height: 36px;
object-fit: cover;
}
.avatar-default {
display: flex;
align-items: center;
justify-content: center;
background-color: ${miscTheme.theme.colors.secondaryBase};
border-radius: 50%;
color: white;
font-size: 20px;
font-weight: bold;
}
`;
const StyledImageWrapper = styled__default["default"].div `
display: inline-flex;
position: relative;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
flex-shrink: 0;
cursor: pointer;
.user-close-icon {
display: none;
}
&:focus-within {
.user-close-icon {
display: block;
}
.user-avatar {
display: none;
}
${StyledPopup.classSelector} {
z-index: 200;
top: 120%;
opacity: 1;
visibility: visible;
display: initial;
${utils.MediaQueries.mbDown} {
top: 100%;
}
}
${StyledPopupWrapper.classSelector} {
display: initial;
}
}
`;
const StyledLoggedOutAnchor = styled__default["default"].a `
display: inline-flex;
.login-btn[data-color='tertiary'][data-size='md'] {
padding-left: 12px;
padding-right: 12px;
}
.mobile-only {
${utils.MediaQueries.mbUp} {
display: none;
}
}
.login-btn {
display: none;
${utils.MediaQueries.mbUp} {
display: block;
border: 1px solid ${miscTheme.theme.colors.neutral100};
}
}
`;
const ProfilePopup = ({ isOpen, userInfo, closePopup, siteType = 'helloSites', dispatchLogout, }) => {
const handleClickLogout = () => {
if (dispatchLogout) {
dispatchLogout();
closePopup();
}
};
return (React__default["default"].createElement(StyledPopup, { "data-open": isOpen },
React__default["default"].createElement("div", { className: "popup-content" },
React__default["default"].createElement(profileNavigation.ProfileNavigation, { siteType: siteType, onLogout: handleClickLogout, userInfo: userInfo }))));
};
const NavigationProfileButton = ({ userInfo, siteType, onLoginClick, currentUrl, isMinifyLogin, onLogout, style, isLoading, isMobile, }) => {
const { t } = index.useTranslations();
const [isLogoutConfirmOpen, setIsLogoutConfirmOpen] = React.useState(false);
const name = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.name) || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.username);
const { containerRef, onContainerFocus, onContainerBlur, onButtonMouseDown, onClose, } = useCSSFocusPopupHelper();
const isLoginIcon = React.useMemo(() => isMobile && siteType === 'helloSites', [isMobile]);
if (isLoading)
return isLoginIcon ? (React__default["default"].createElement(Spinner.Spinner, null)) : (React__default["default"].createElement(index$1.Button, { size: 'sm', color: "transparent", loading: true }));
return (userInfo === null || userInfo === void 0 ? void 0 : userInfo.id) ? (React__default["default"].createElement(React__default["default"].Fragment, null,
React__default["default"].createElement(StyledImageWrapper, { ref: containerRef, style: style, tabIndex: 0, onBlur: onContainerBlur, onFocus: () => {
var _a;
onContainerFocus();
const popup = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('#navigation-v2 .hhgcomp-navprofilebutton-popup');
if (popup) {
const bound = popup.getBoundingClientRect();
const top = bound.top;
const maxHeight = `calc(100vh - ${top}px)`;
popup.setAttribute('style', `max-height: ${maxHeight};`);
}
} },
React__default["default"].createElement("div", { onMouseDown: onButtonMouseDown },
React__default["default"].createElement("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", className: "user-close-icon" },
React__default["default"].createElement("path", { d: "M18 6L6 18M18 18L6 6", stroke: "#3E3F58", strokeWidth: "1.3", strokeLinecap: "round" })),
React__default["default"].createElement(index$2.Avatar, { size: 32, className: "user-avatar", src: userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar, color: siteType === 'marryBaby'
? miscTheme.theme.mbColors.pink
: miscTheme.theme.colors.secondaryBase, placeholderText: name && name.length ? name[0].toUpperCase() : 'A' })),
React__default["default"].createElement(ProfilePopup, { dispatchLogout: () => {
onClose();
setIsLogoutConfirmOpen(true);
}, isOpen: false, closePopup: onClose, siteType: siteType, userInfo: userInfo })),
React__default["default"].createElement(navigationLogoutPopup.NavigationLogoutPopup, { openLogoutPopup: isLogoutConfirmOpen, onCloseHandler: () => {
document.body.classList.toggle('noscroll', false);
setIsLogoutConfirmOpen(false);
}, siteType: siteType, onLogoutHandler: () => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
setIsLogoutConfirmOpen(false);
document.body.classList.toggle('noscroll', false);
yield onLogout();
}) }))) : (React__default["default"].createElement(StyledLoggedOutAnchor, { style: Object.assign({ textDecoration: 'none' }, style), "data-event-category": "Sign Up", "data-event-action": "Button Click", "data-event-label": currentUrl, "data-site-type": siteType, onClick: onLoginClick }, isMinifyLogin ? (React__default["default"].createElement(StyledAvatar, null,
React__default["default"].createElement("img", { src: index$3.CommonGAssets.getAssetPath('lock.png'), className: "avatar", loading: "lazy", alt: "avatar" }))) : (
// LOGIC:
// - DEsktop: always show button
// - Mobile: show button only for helloSites, show text for MarryBaby
React__default["default"].createElement(React__default["default"].Fragment, null,
siteType === 'helloSites' &&
(isLoginIcon ? (React__default["default"].createElement("img", { className: "mobile-only", src: index$3.CommonGAssets.getAssetPath('login.svg'), style: {
cursor: 'pointer',
height: 24,
width: 24,
} })) : (React__default["default"].createElement(index$1.Button, { className: "mobile-only", size: "sm", leftIcon: React__default["default"].createElement(core.User, { color: "currentColor", isSolid: true, size: 22 }), sx: {
paddingLeft: '8px',
paddingRight: '12px',
}, styles: {
leftIcon: {
marginRight: 4,
},
} }, t('navigation.loginJoin')))),
siteType === 'marryBaby' && (React__default["default"].createElement("div", { className: "mobile-only", style: {
paddingLeft: 16,
} },
React__default["default"].createElement(index$4.Text, { size: "p3", color: miscTheme.theme.mbColors.pink }, t('navigation.loginJoin')))),
siteType === 'marryBaby' ? (React__default["default"].createElement(index$1.Button, { className: "login-btn", size: "md", leftIcon: React__default["default"].createElement(core.User, { color: "currentColor", isSolid: true, size: 22 }) }, t('navigation.loginJoin'))) : (React__default["default"].createElement(index$1.Button, { className: "login-btn", size: "md", leftIcon: React__default["default"].createElement(core.User, { color: "#595959", isSolid: true, size: 22 }), variant: "ghost", color: "#262626" }, t('navigation.loginJoin')))))));
};
exports.NavigationProfileButton = NavigationProfileButton;
exports.useCSSFocusPopupHelper = useCSSFocusPopupHelper;