terra-consumer-nav
Version:
A responsive container that neatly displays logo, quicklinks, navlinks and profile.
252 lines (196 loc) • 9.02 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || 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; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _bind = require('classnames/bind');
var _bind2 = _interopRequireDefault(_bind);
var _terraButton = require('terra-button');
var _terraButton2 = _interopRequireDefault(_terraButton);
var _IconClose = require('terra-icon/lib/icon/IconClose');
var _IconClose2 = _interopRequireDefault(_IconClose);
var _terraPopup = require('terra-popup');
var _terraPopup2 = _interopRequireDefault(_terraPopup);
var _terraResponsiveElement = require('terra-responsive-element');
var _terraResponsiveElement2 = _interopRequireDefault(_terraResponsiveElement);
var _NavItems = require('./components/nav-items/NavItems');
var _NavItems2 = _interopRequireDefault(_NavItems);
var _Modal = require('./components/modal/Modal');
var _Modal2 = _interopRequireDefault(_Modal);
var _NavLogo = require('./components/nav-logo/NavLogo');
var _NavLogo2 = _interopRequireDefault(_NavLogo);
var _NavHelp = require('./components/nav-help/NavHelp');
var _NavHelp2 = _interopRequireDefault(_NavHelp);
var _NavBurgerButton = require('./components/nav-burger-button/NavBurgerButton');
var _NavBurgerButton2 = _interopRequireDefault(_NavBurgerButton);
var _Nav = require('./Nav.scss');
var _Nav2 = _interopRequireDefault(_Nav);
var _UserProfile = require('./components/user-profile/UserProfile');
var _UserProfile2 = _interopRequireDefault(_UserProfile);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var cx = _bind2.default.bind(_Nav2.default);
var propTypes = {
/**
* An array of objects to be displayed as nav link options.
*/
navItems: _propTypes2.default.array, // eslint-disable-line react/forbid-prop-types
/**
* Object representing all the profile information
*/
profile: _propTypes2.default.shape({
signinUrl: _propTypes2.default.string,
avatar: _propTypes2.default.element
}),
/**
* An object defining the logo to be displayed
*/
logo: _propTypes2.default.shape({
/**
* The location where the image to be displayed is stored.
*/
path: _propTypes2.default.string,
/**
* Alternate text used be screen readers.
*/
altText: _propTypes2.default.string,
/**
* Whether or not the logo should be placed on top of a white card.
*/
isCard: _propTypes2.default.bool
}),
/**
* Callback function: should be used to close the nav on mobile devices.
*/
onRequestClose: _propTypes2.default.func.isRequired
};
var defaultProps = {
navItems: [],
logo: {}
};
var Nav = function (_React$Component) {
_inherits(Nav, _React$Component);
function Nav() {
_classCallCheck(this, Nav);
var _this = _possibleConstructorReturn(this, (Nav.__proto__ || Object.getPrototypeOf(Nav)).call(this));
_this.state = {
isModalOpen: false,
modalContent: {
title: '',
content: _react2.default.createElement('div', null)
}
};
_this.toggleModal = _this.toggleModal.bind(_this);
_this.handleOpenProfile = _this.handleOpenProfile.bind(_this);
_this.handleProfileLinkClick = _this.handleProfileLinkClick.bind(_this);
return _this;
}
_createClass(Nav, [{
key: 'handleOpenProfile',
value: function handleOpenProfile(modalContent, numberOfLinks) {
this.toggleModal(modalContent, numberOfLinks);
}
}, {
key: 'handleProfileLinkClick',
value: function handleProfileLinkClick() {
// close our modal so they can see the new page
this.setState({
isModalOpen: false
});
// Close the navigation panel as well
this.props.onRequestClose();
}
}, {
key: 'toggleModal',
value: function toggleModal(modalObject) {
if (modalObject.title && modalObject.content) {
this.setState({
modalContent: modalObject || {
title: '',
content: _react2.default.createElement('div', null)
}
});
}
this.setState({
isModalOpen: !this.state.isModalOpen
});
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
navItems = _props.navItems,
profile = _props.profile,
logo = _props.logo,
onRequestClose = _props.onRequestClose,
customProps = _objectWithoutProperties(_props, ['navItems', 'profile', 'logo', 'onRequestClose']);
var profileId = 'profile-popup-button';
var defaultElement = _react2.default.createElement(
_Modal2.default,
{
isModalOpen: this.state.isModalOpen,
title: this.state.modalContent.title,
onRequestClose: this.toggleModal
},
this.state.modalContent.content
);
var popup = _react2.default.createElement(
_terraPopup2.default,
{
isOpen: this.state.isModalOpen,
onRequestClose: this.toggleModal,
targetRef: function targetRef() {
return document.getElementById(profileId);
},
contentWidth: '240',
contentHeight: 'auto',
contentAttachment: 'top right',
isArrowDisplayed: true
},
this.state.modalContent.content
);
return _react2.default.createElement(
'div',
_extends({}, customProps, {
id: 'terra-consumer-nav',
className: cx('nav', { 'modal-open': this.state.isModalOpen }, customProps.className)
}),
_react2.default.createElement(
'div',
{ className: cx('close-button-container') },
_react2.default.createElement(_terraButton2.default, { icon: _react2.default.createElement(_IconClose2.default, null), className: cx('close-button'), onClick: function onClick() {
onRequestClose();
}, variant: 'utility', text: 'Close' })
),
_react2.default.createElement(_NavLogo2.default, logo),
_react2.default.createElement(_NavItems2.default, { navItems: navItems, handleClick: onRequestClose }),
_react2.default.createElement(_terraResponsiveElement2.default, { responsiveTo: 'window', defaultElement: defaultElement, medium: popup }),
profile && _react2.default.createElement(
'div',
{ className: cx('profile') },
_react2.default.createElement(_UserProfile2.default, _extends({}, profile, {
id: profileId,
handleClick: this.handleOpenProfile,
onLinkClick: this.handleProfileLinkClick,
isSignIn: profile.signinUrl && !(profile.avatar || profile.userName)
}))
)
);
}
}]);
return Nav;
}(_react2.default.Component);
Nav.propTypes = propTypes;
Nav.defaultProps = defaultProps;
Nav.Help = _NavHelp2.default;
Nav.Burger = _NavBurgerButton2.default;
Nav.UserProfile = _UserProfile2.default;
exports.default = Nav;