UNPKG

@twreporter/universal-header

Version:
318 lines (315 loc) 18.9 kB
"use strict"; 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;