@twreporter/universal-header
Version:
Universal header of TWReporter sites
318 lines (315 loc) • 18.9 kB
JavaScript
;
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _headerContext = _interopRequireWildcard(require("../contexts/header-context"));
var _links = require("../utils/links");
var _theme = require("../utils/theme");
var _channels = _interopRequireDefault(require("../constants/channels"));
var _channelsNew = _interopRequireDefault(require("../constants/channels-new"));
var _hamburgerMenu = require("../constants/hamburger-menu");
var _actionButton = require("./action-button");
var _hamburgerMenuItem = require("./hamburger-menu-item");
var _icons = require("./icons");
var _mediaQuery = _interopRequireDefault(require("@twreporter/core/lib/utils/media-query"));
var _customizedLink = _interopRequireDefault(require("@twreporter/react-components/lib/customized-link"));
var _divider = _interopRequireDefault(require("@twreporter/react-components/lib/divider"));
var _button = require("@twreporter/react-components/lib/button");
var _icon = require("@twreporter/react-components/lib/icon");
var _logo = require("@twreporter/react-components/lib/logo");
var _input = require("@twreporter/react-components/lib/input");
var _categorySet = require("@twreporter/core/lib/constants/category-set");
var _theme2 = require("@twreporter/core/lib/constants/theme");
var _rwd = require("@twreporter/react-components/lib/rwd");
var _featureFlag = require("@twreporter/core/lib/constants/feature-flag");
var _hamburgerFooter = _interopRequireDefault(require("./hamburger-footer"));
var _map = _interopRequireDefault(require("lodash/map"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; // context
// utils
// constants
// import {
// CHANNEL_KEY,
// CHANNEL_ORDER,
// CHANNEL_TYPE,
// CHANNEL_LABEL,
// CHANNEL_LINK_TYPE,
// CHANNEL_DROPDOWN,
// } from '../constants/channels'
// components
// @twreporter
// Footer
// lodash
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure " + obj); }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
var _ = {
map: _map["default"]
};
var _ref = _featureFlag.LAWMAKER ? _channelsNew["default"] : _channels["default"],
CHANNEL_KEY = _ref.CHANNEL_KEY,
CHANNEL_ORDER = _ref.CHANNEL_ORDER,
CHANNEL_TYPE = _ref.CHANNEL_TYPE,
CHANNEL_LABEL = _ref.CHANNEL_LABEL,
CHANNEL_LINK_TYPE = _ref.CHANNEL_LINK_TYPE,
CHANNEL_DROPDOWN = _ref.CHANNEL_DROPDOWN;
// global var
var reserveHeightForIos15 = 48;
var MenuContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__MenuContainer",
componentId: "sc-15rzowt-0"
})(["width:", ";height:100vh;max-height:100vh;overflow-y:scroll;overscroll-behavior:contain;background-color:", ";-webkit-overflow-scrolling:touch;", " ", " &::-webkit-scrollbar{background-color:transparent;width:4px;}&::-webkit-scrollbar-thumb{background-color:", ";border-radius:2px;}"], _hamburgerMenu.MENU_WIDTH.desktop, function (props) {
return props.$bgColor;
}, _mediaQuery["default"].tabletOnly(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: ", ";\n "])), _hamburgerMenu.MENU_WIDTH.tablet), _mediaQuery["default"].mobileOnly(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n width: ", ";\n height: ", ";\n max-height: ", ";\n padding-bottom: ", "px;\n "])), _hamburgerMenu.MENU_WIDTH.mobile, function (props) {
return props.$mobileHeight;
}, function (props) {
return props.$mobileHeight;
}, reserveHeightForIos15 + 48), function (props) {
return props.$scrollBarColor;
});
var CloseSection = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__CloseSection",
componentId: "sc-15rzowt-1"
})(["display:flex;padding:24px 32px 16px 0;justify-content:end;align-items:center;", ""], _mediaQuery["default"].mobileOnly(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n display: none;\n "]))));
var LogoSection = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__LogoSection",
componentId: "sc-15rzowt-2"
})(["display:flex;justify-content:center;a{display:flex;}img{height:24px;width:24px;}", ""], _mediaQuery["default"].mobileOnly(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: none;\n "]))));
var SearchSection = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__SearchSection",
componentId: "sc-15rzowt-3"
})(["display:flex;justify-content:center;align-items:center;padding:24px 32px 0 32px;", " ", ""], _mediaQuery["default"].mobileOnly(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding: 24px 32px 8px 32px;\n "]))), _mediaQuery["default"].desktopAndAbove(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: none;\n "]))));
var ContentSection = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__ContentSection",
componentId: "sc-15rzowt-4"
})(["padding-top:16px;"]);
var ActionSection = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__ActionSection",
componentId: "sc-15rzowt-5"
})(["padding:40px 32px 32px 32px;"]);
var HeaderSection = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__HeaderSection",
componentId: "sc-15rzowt-6"
})(["display:flex;justify-content:space-between;padding:16px 24px;"]);
var FlexGroup = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__FlexGroup",
componentId: "sc-15rzowt-7"
})(["display:flex;align-items:center;img{height:21px;}"]);
var DropdownItemContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__DropdownItemContainer",
componentId: "sc-15rzowt-8"
})([""]);
var SubContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__SubContainer",
componentId: "sc-15rzowt-9"
})(["max-height:", ";overflow:hidden;transition:max-height 300ms ease-in-out;"], function (props) {
return props.$isActive ? '300px' : '0';
});
var DividerContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__DividerContainer",
componentId: "sc-15rzowt-10"
})(["margin:16px 32px;"]);
var IconContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
displayName: "hamburger-menu__IconContainer",
componentId: "sc-15rzowt-11"
})(["margin-left:24px;", ""], _mediaQuery["default"].mobileOnly(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n z-index: 1;\n margin-left: 16px;\n "]))));
var StyledMobileHamburgerAction = /*#__PURE__*/(0, _styledComponents["default"])(_actionButton.MobileHamburgerAction).withConfig({
displayName: "hamburger-menu__StyledMobileHamburgerAction",
componentId: "sc-15rzowt-12"
})(["width:100%;"]);
var DropdownContent = function DropdownContent(_ref2) {
var itemKey = _ref2.itemKey,
isActive = _ref2.isActive,
toggleFunc = _ref2.toggleFunc;
var _useContext = (0, _react.useContext)(_headerContext["default"]),
releaseBranch = _useContext.releaseBranch,
isLinkExternal = _useContext.isLinkExternal;
var _useContext2 = (0, _react.useContext)(_headerContext.HamburgerContext),
closeHamburgerMenu = _useContext2.closeHamburgerMenu;
var subItemJSX;
if (itemKey === CHANNEL_KEY.category) {
// category
subItemJSX = _.map(_categorySet.CATEGORY_ORDER, function (catKey) {
var label = _categorySet.CATEGORY_LABEL[catKey];
var path = "/categories/".concat(catKey);
var link = (0, _links.getLink)(isLinkExternal, releaseBranch, path);
if (!label || !link) {
return;
}
return /*#__PURE__*/_react["default"].createElement(_hamburgerMenuItem.MenuSubItem, {
text: label,
link: link,
key: catKey
});
});
} else {
// subcategory
subItemJSX = _.map(CHANNEL_DROPDOWN[itemKey], function (subItem, key) {
var type = subItem.type;
var label, path;
if (type === 'subcategory') {
label = _categorySet.SUBCATEGORY_LABEL[subItem.key];
path = "/categories/".concat(_categorySet.CATEGORY_PATH[itemKey]);
if (subItem.key !== 'all') {
path += "/".concat(subItem.key);
}
}
if (type === 'path') {
label = subItem.label;
path = subItem.path;
}
var link = (0, _links.getLink)(isLinkExternal, releaseBranch, path);
if (!label || !link) {
return;
}
var componentKey = "".concat(itemKey, "-").concat(key);
return /*#__PURE__*/_react["default"].createElement(_hamburgerMenuItem.MenuSubItem, {
text: label,
link: link,
key: componentKey
});
});
}
var label = CHANNEL_LABEL[itemKey];
var handleClick = function handleClick() {
return toggleFunc(itemKey);
};
var dropdownKey = "".concat(itemKey, "-dropdown");
return /*#__PURE__*/_react["default"].createElement(DropdownItemContainer, {
key: itemKey
}, /*#__PURE__*/_react["default"].createElement(_hamburgerMenuItem.MenuDropdownItem, {
text: label,
isActive: isActive,
onClick: handleClick,
key: dropdownKey
}), /*#__PURE__*/_react["default"].createElement(SubContainer, {
$isActive: isActive,
onClick: closeHamburgerMenu
}, subItemJSX));
};
DropdownContent.propTypes = {
itemKey: _propTypes["default"].string,
isActive: _propTypes["default"].bool,
toggleFunc: _propTypes["default"].func
};
var Content = function Content() {
var _useContext3 = (0, _react.useContext)(_headerContext["default"]),
releaseBranch = _useContext3.releaseBranch,
isLinkExternal = _useContext3.isLinkExternal;
var _useContext4 = (0, _react.useContext)(_headerContext.HamburgerContext),
closeHamburgerMenu = _useContext4.closeHamburgerMenu;
var _useState = (0, _react.useState)(''),
_useState2 = _slicedToArray(_useState, 2),
activeKey = _useState2[0],
setActiveKey = _useState2[1];
var itemLinks = (0, _links.getChannelLinks)(isLinkExternal, releaseBranch);
var itemJSX = _.map(CHANNEL_ORDER, function (itemKey, index) {
// divider
if (itemKey === 'divider') {
return /*#__PURE__*/_react["default"].createElement(DividerContainer, {
key: index
}, /*#__PURE__*/_react["default"].createElement(_divider["default"], null));
}
var label = CHANNEL_LABEL[itemKey];
var type = CHANNEL_TYPE[itemKey];
// link type
if (type === CHANNEL_LINK_TYPE) {
var link = itemLinks && itemLinks[itemKey];
if (!label || !link) {
return;
}
return /*#__PURE__*/_react["default"].createElement(_hamburgerMenuItem.MenuLinkItem, {
text: label,
link: link,
key: itemKey,
onClick: closeHamburgerMenu
});
}
// dropdown type
var isActive = activeKey === itemKey;
var toggleFunc = function toggleFunc(key) {
var nextActiveKey = activeKey === key ? '' : key;
setActiveKey(nextActiveKey);
};
return /*#__PURE__*/_react["default"].createElement(DropdownContent, {
itemKey: itemKey,
isActive: isActive,
toggleFunc: toggleFunc
});
});
return /*#__PURE__*/_react["default"].createElement(ContentSection, null, itemJSX);
};
var HamburgerMenu = function HamburgerMenu(_ref3) {
var props = _extends({}, (_objectDestructuringEmpty(_ref3), _ref3));
var _useContext5 = (0, _react.useContext)(_headerContext["default"]),
theme = _useContext5.theme,
releaseBranch = _useContext5.releaseBranch,
isLinkExternal = _useContext5.isLinkExternal;
var _useContext6 = (0, _react.useContext)(_headerContext.HamburgerContext),
closeHamburgerMenu = _useContext6.closeHamburgerMenu;
var _useState3 = (0, _react.useState)('100vh'),
_useState4 = _slicedToArray(_useState3, 2),
mobileHeight = _useState4[0],
setMobileHeight = _useState4[1];
var menuTheme = theme === _theme2.THEME.photography ? theme : _theme2.THEME.noraml;
var _selectHamburgerMenuT = (0, _theme.selectHamburgerMenuTheme)(menuTheme),
bgColor = _selectHamburgerMenuT.bgColor,
scrollBarColor = _selectHamburgerMenuT.scrollBarColor;
var logoType = (0, _theme.selectLogoType)(menuTheme);
var CloseIcon = /*#__PURE__*/_react["default"].createElement(_icon.Cross, {
releaseBranch: releaseBranch
});
var logoLink = (0, _links.getLogoLink)(isLinkExternal, releaseBranch);
var onSearch = function onSearch(keywords) {
if (!window) {
return;
}
window.location = "".concat((0, _links.getSearchLink)(isLinkExternal, releaseBranch).to, "?q=").concat(keywords);
};
(0, _react.useEffect)(function () {
setMobileHeight("".concat(window.innerHeight + reserveHeightForIos15, "px"));
}, []);
return /*#__PURE__*/_react["default"].createElement(MenuContainer, _extends({
$bgColor: bgColor,
$scrollBarColor: scrollBarColor,
$mobileHeight: mobileHeight
}, props), /*#__PURE__*/_react["default"].createElement(_rwd.TabletAndAbove, null, /*#__PURE__*/_react["default"].createElement(CloseSection, null, /*#__PURE__*/_react["default"].createElement(_button.IconButton, {
iconComponent: CloseIcon,
theme: menuTheme,
onClick: closeHamburgerMenu,
"aria-label": "\u95DC\u9589\u6F22\u5821\u9078\u55AE"
})), /*#__PURE__*/_react["default"].createElement(LogoSection, null, /*#__PURE__*/_react["default"].createElement(_customizedLink["default"], _extends({}, logoLink, {
onClick: closeHamburgerMenu
}), /*#__PURE__*/_react["default"].createElement(_logo.LogoSymbol, {
type: logoType,
releaseBranch: releaseBranch
})))), /*#__PURE__*/_react["default"].createElement(_rwd.MobileOnly, null, /*#__PURE__*/_react["default"].createElement(HeaderSection, null, /*#__PURE__*/_react["default"].createElement(FlexGroup, null, /*#__PURE__*/_react["default"].createElement(_customizedLink["default"], _extends({}, logoLink, {
onClick: closeHamburgerMenu
}), /*#__PURE__*/_react["default"].createElement(_logo.LogoHeader, {
type: logoType,
releaseBranch: releaseBranch
}))), /*#__PURE__*/_react["default"].createElement(FlexGroup, null, /*#__PURE__*/_react["default"].createElement(_actionButton.MobileHeaderAction, {
isForHambuger: true
}), /*#__PURE__*/_react["default"].createElement(IconContainer, null, /*#__PURE__*/_react["default"].createElement(_icons.MobileIcons, {
isForHambuger: true
}))))), /*#__PURE__*/_react["default"].createElement(SearchSection, null, /*#__PURE__*/_react["default"].createElement(_input.SearchBar, {
onSearch: onSearch,
autofocus: false,
widthType: "stretch",
placeholder: "\u95DC\u9375\u5B57\u641C\u5C0B"
})), /*#__PURE__*/_react["default"].createElement(Content, null), /*#__PURE__*/_react["default"].createElement(_hamburgerFooter["default"], null), /*#__PURE__*/_react["default"].createElement(ActionSection, null, /*#__PURE__*/_react["default"].createElement(_rwd.TabletAndAbove, null, /*#__PURE__*/_react["default"].createElement(_actionButton.DesktopHamburgerAction, null)), /*#__PURE__*/_react["default"].createElement(_rwd.MobileOnly, null, /*#__PURE__*/_react["default"].createElement(StyledMobileHamburgerAction, null))));
};
var _default = exports["default"] = HamburgerMenu;