UNPKG

auth0-lock

Version:
488 lines (403 loc) 17.8 kB
'use strict'; exports.__esModule = 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 _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _reactTransitionGroup = require('react-transition-group'); var _multisize_slide = require('./multisize_slide'); var _multisize_slide2 = _interopRequireDefault(_multisize_slide); var _global_message = require('./global_message'); var _global_message2 = _interopRequireDefault(_global_message); var _index = require('../../core/index'); var l = _interopRequireWildcard(_index); var _header = require('./header'); var _header2 = _interopRequireDefault(_header); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 submitSvg = '<svg aria-hidden="true" focusable="false" width="43px" height="42px" viewBox="0 0 43 42" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"><g id="Lock" sketch:type="MSArtboardGroup" transform="translate(-280.000000, -3592.000000)"><g id="SMS" sketch:type="MSLayerGroup" transform="translate(153.000000, 3207.000000)"><g id="Group" sketch:type="MSShapeGroup"><g id="Login" transform="translate(0.000000, 369.000000)"><g id="Btn"><g id="Oval-302-+-Shape" transform="translate(128.000000, 17.000000)"><circle id="Oval-302" stroke="#FFFFFF" stroke-width="2" cx="20.5" cy="20" r="20"></circle><path d="M17.8,15.4 L19.2,14 L25.2,20 L19.2,26 L17.8,24.6 L22.4,20 L17.8,15.4 Z" id="Shape" fill="#FFFFFF"></path></g></g></g></g></g></g></g></svg>'; var submitText = '<svg aria-hidden="true" focusable="false" class="icon-text" width="8px" height="12px" viewBox="0 0 8 12" version="1.1" xmlns="http://www.w3.org/2000/svg"><g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Web/Submit/Active" transform="translate(-148.000000, -32.000000)" fill="#FFFFFF"><polygon id="Shape" points="148 33.4 149.4 32 155.4 38 149.4 44 148 42.6 152.6 38"></polygon></g></g></svg>'; var SubmitButton = function (_React$Component) { _inherits(SubmitButton, _React$Component); function SubmitButton() { _classCallCheck(this, SubmitButton); return _possibleConstructorReturn(this, _React$Component.apply(this, arguments)); } SubmitButton.prototype.handleSubmit = function handleSubmit() { var _props = this.props, label = _props.label, screenName = _props.screenName, contentProps = _props.contentProps; var model = contentProps.model; if (screenName === 'main.signUp') { l.emitEvent(model, 'signup submit'); } else if (screenName === 'main.login') { l.emitEvent(model, 'signin submit'); } else if (screenName === 'forgotPassword') { l.emitEvent(model, 'forgot_password submit'); } else if (screenName === 'socialOrEmail') { l.emitEvent(model, 'socialOrEmail submit'); } else if (screenName === 'socialOrPhoneNumber') { l.emitEvent(model, 'socialOrPhoneNumber submit'); } else if (screenName === 'vcode') { l.emitEvent(model, 'vcode submit'); } if (this.props.onSubmit) { this.props.onSubmit(label, screenName); } }; SubmitButton.prototype.focus = function focus() { _reactDom2.default.findDOMNode(this).focus(); }; SubmitButton.prototype.render = function render() { var _props2 = this.props, color = _props2.color, disabled = _props2.disabled, label = _props2.label, display = _props2.display; var content = label ? _react2.default.createElement( 'span', { className: 'auth0-label-submit' }, label, _react2.default.createElement('span', { dangerouslySetInnerHTML: { __html: submitText } }) ) : _react2.default.createElement('span', { dangerouslySetInnerHTML: { __html: submitSvg } }); return _react2.default.createElement( 'button', { className: 'auth0-lock-submit', disabled: disabled, style: { backgroundColor: color, display: display }, onClick: this.handleSubmit.bind(this), name: 'submit', type: 'submit', 'aria-label': label ? label : 'Submit' }, _react2.default.createElement( 'div', { className: 'auth0-loading-container' }, _react2.default.createElement('div', { className: 'auth0-loading' }) ), content ); }; return SubmitButton; }(_react2.default.Component); SubmitButton.propTypes = { color: _propTypes2.default.string.isRequired, disabled: _propTypes2.default.bool, label: _propTypes2.default.string, screenName: _propTypes2.default.string, onSubmit: _propTypes2.default.func, contentProps: _propTypes2.default.object }; var MESSAGE_ANIMATION_DURATION = 250; var AUXILIARY_ANIMATION_DURATION = 350; var Chrome = function (_React$Component2) { _inherits(Chrome, _React$Component2); function Chrome(props) { _classCallCheck(this, Chrome); var _this2 = _possibleConstructorReturn(this, _React$Component2.call(this, props)); _this2.state = { moving: false, reverse: false }; return _this2; } Chrome.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { var _this3 = this; var _props3 = this.props, auxiliaryPane = _props3.auxiliaryPane, showSubmitButton = _props3.showSubmitButton; var delayingShowSubmitButton = this.state.delayingShowSubmitButton; if (!showSubmitButton && nextProps.showSubmitButton && !delayingShowSubmitButton) { this.setState({ delayingShowSubmitButton: true }); } if (!auxiliaryPane && nextProps.auxiliaryPane) { this.auxiliaryPaneTriggerInput = global.document.activeElement; this.setState({ moving: true }); } if (auxiliaryPane && !nextProps.auxiliaryPane) { // TODO clear timeout setTimeout(function () { return _this3.setState({ moving: false }); }, AUXILIARY_ANIMATION_DURATION + 50); } }; Chrome.prototype.componentDidUpdate = function componentDidUpdate(prevProps) { var _this4 = this; var _props4 = this.props, autofocus = _props4.autofocus, auxiliaryPane = _props4.auxiliaryPane, error = _props4.error, screenName = _props4.screenName; if (!autofocus) return; if (auxiliaryPane && !prevProps.auxiliaryPane) { var input = this.findAutofocusInput(this.refs.auxiliary); if (input) { // TODO clear timeout setTimeout(function () { return input.focus(); }, AUXILIARY_ANIMATION_DURATION); } return; } if (!auxiliaryPane && prevProps.auxiliaryPane) { if (this.auxiliaryPaneTriggerInput) { // TODO clear timeout setTimeout(function () { return _this4.auxiliaryPaneTriggerInput.focus(); }, AUXILIARY_ANIMATION_DURATION); } return; } if (screenName !== prevProps.screenName) { var _input = this.findAutofocusInput(); if (_input) { if (this.mainScreenName(prevProps.screenName) !== this.mainScreenName()) { this.inputToFocus = _input; } else { // TODO clear timeout setTimeout(function () { return _input.focus(); }, 17); } } } }; Chrome.prototype.onWillSlide = function onWillSlide() { this.setState({ moving: true }); this.sliding = true; }; Chrome.prototype.onDidSlide = function onDidSlide() { this.sliding = false; this.setState({ reverse: false }); }; Chrome.prototype.onDidAppear = function onDidAppear() { this.setState({ moving: false }); if (this.state.delayingShowSubmitButton) { this.setState({ delayingShowSubmitButton: false }); } if (this.inputToFocus) { this.inputToFocus.focus(); delete this.inputToFocus; } }; Chrome.prototype.mainScreenName = function mainScreenName(str) { return (str || this.props.screenName || '').split('.')[0]; }; Chrome.prototype.findAutofocusInput = function findAutofocusInput(ref) { return _reactDom2.default.findDOMNode(ref || this.refs.screen).querySelector('input'); }; Chrome.prototype.focusError = function focusError() { var node = _reactDom2.default.findDOMNode(this.refs.screen); // TODO: make the error input selector configurable via props. var error = node.querySelector('.auth0-lock-error input'); if (error) { error.focus(); } }; Chrome.prototype.render = function render() { var _this5 = this; var _props5 = this.props, avatar = _props5.avatar, auxiliaryPane = _props5.auxiliaryPane, backHandler = _props5.backHandler, contentComponent = _props5.contentComponent, contentProps = _props5.contentProps, disableSubmitButton = _props5.disableSubmitButton, error = _props5.error, info = _props5.info, isSubmitting = _props5.isSubmitting, logo = _props5.logo, primaryColor = _props5.primaryColor, screenName = _props5.screenName, showSubmitButton = _props5.showSubmitButton, submitButtonLabel = _props5.submitButtonLabel, success = _props5.success, terms = _props5.terms, title = _props5.title, classNames = _props5.classNames, scrollGlobalMessagesIntoView = _props5.scrollGlobalMessagesIntoView; var _state = this.state, delayingShowSubmitButton = _state.delayingShowSubmitButton, moving = _state.moving, reverse = _state.reverse; var backgroundUrl = void 0, name = void 0; if (avatar) { backgroundUrl = avatar; name = title; } else { backgroundUrl = logo; name = ''; } var shouldShowSubmitButton = showSubmitButton && !delayingShowSubmitButton; function wrapGlobalMessage(message) { return typeof message === 'string' ? _react2.default.createElement('span', { dangerouslySetInnerHTML: { __html: message } }) : message; } var globalError = error ? _react2.default.createElement(_global_message2.default, { key: 'global-error', message: wrapGlobalMessage(error), type: 'error', scrollIntoView: scrollGlobalMessagesIntoView }) : null; var globalSuccess = success ? _react2.default.createElement(_global_message2.default, { key: 'global-success', message: wrapGlobalMessage(success), type: 'success', scrollIntoView: scrollGlobalMessagesIntoView }) : null; var globalInfo = info ? _react2.default.createElement(_global_message2.default, { key: 'global-info', message: wrapGlobalMessage(info), type: 'info', scrollIntoView: scrollGlobalMessagesIntoView }) : null; var Content = contentComponent; var className = 'auth0-lock-cred-pane'; var isQuiet = !moving && !delayingShowSubmitButton; className += isQuiet ? ' auth0-lock-quiet' : ' auth0-lock-moving'; return _react2.default.createElement( 'div', { className: className }, _react2.default.createElement( 'div', { className: 'auth0-lock-cred-pane-internal-wrapper' }, _react2.default.createElement(_header2.default, { title: title, name: name, backHandler: backHandler && this.handleBack.bind(this), backgroundUrl: backgroundUrl, backgroundColor: primaryColor, logoUrl: logo }), _react2.default.createElement( 'div', { className: 'auth0-lock-content-wrapper' }, _react2.default.createElement( _reactTransitionGroup.TransitionGroup, null, _react2.default.createElement( _reactTransitionGroup.CSSTransition, { classNames: 'global-message', timeout: MESSAGE_ANIMATION_DURATION }, _react2.default.createElement( 'div', null, globalSuccess, globalError, globalInfo ) ) ), _react2.default.createElement( 'div', { style: { position: 'relative' }, ref: 'screen' }, _react2.default.createElement( _multisize_slide2.default, { delay: 550, onDidAppear: this.onDidAppear.bind(this), onDidSlide: this.onDidSlide.bind(this), onWillSlide: this.onWillSlide.bind(this), transitionName: classNames, reverse: reverse }, _react2.default.createElement( 'div', { key: this.mainScreenName(), className: 'auth0-lock-view-content' }, _react2.default.createElement( 'div', { style: { position: 'relative' } }, _react2.default.createElement( 'div', { className: 'auth0-lock-body-content' }, _react2.default.createElement( 'div', { className: 'auth0-lock-content' }, _react2.default.createElement( 'div', { className: 'auth0-lock-form' }, _react2.default.createElement(Content, _extends({ focusSubmit: this.focusSubmit.bind(this) }, contentProps)) ) ), terms && _react2.default.createElement( 'small', { className: 'auth0-lock-terms' }, terms ) ) ) ) ) ) ), _react2.default.createElement(SubmitButton, { color: primaryColor, disabled: disableSubmitButton, screenName: screenName, contentProps: contentProps, label: submitButtonLabel, ref: function ref(el) { return _this5.submitButton = el; }, display: shouldShowSubmitButton ? 'block' : 'none' }), auxiliaryPane && _react2.default.createElement( _reactTransitionGroup.TransitionGroup, null, _react2.default.createElement( _reactTransitionGroup.CSSTransition, { ref: 'auxiliary', classNames: 'slide', timeout: AUXILIARY_ANIMATION_DURATION }, auxiliaryPane ) ) ) ); }; Chrome.prototype.focusSubmit = function focusSubmit() { this.submitButton.focus(); }; Chrome.prototype.handleBack = function handleBack() { if (this.sliding) return; var backHandler = this.props.backHandler; this.setState({ reverse: true }); backHandler(); }; return Chrome; }(_react2.default.Component); exports.default = Chrome; Chrome.propTypes = { autofocus: _propTypes2.default.bool.isRequired, avatar: _propTypes2.default.string, auxiliaryPane: _propTypes2.default.element, backHandler: _propTypes2.default.func, contentComponent: _propTypes2.default.func.isRequired, // TODO: it also can be a class component contentProps: _propTypes2.default.object.isRequired, disableSubmitButton: _propTypes2.default.bool.isRequired, error: _propTypes2.default.node, info: _propTypes2.default.node, isSubmitting: _propTypes2.default.bool.isRequired, logo: _propTypes2.default.string.isRequired, primaryColor: _propTypes2.default.string.isRequired, screenName: _propTypes2.default.string.isRequired, showSubmitButton: _propTypes2.default.bool.isRequired, submitButtonLabel: _propTypes2.default.string, success: _propTypes2.default.node, terms: _propTypes2.default.element, title: _propTypes2.default.string, classNames: _propTypes2.default.string.isRequired, scrollGlobalMessagesIntoView: _propTypes2.default.bool }; Chrome.defaultProps = { autofocus: false, disableSubmitButton: false, showSubmitButton: true, scrollGlobalMessagesIntoView: true };