UNPKG

react-saasify

Version:

React components for Saasify web clients.

1,414 lines (1,237 loc) 197 kB
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var React = require('react'); var React__default = _interopDefault(React); var PropTypes = _interopDefault(require('prop-types')); var mobxReact = require('mobx-react'); var reactRouterDom = require('react-router-dom'); var mobx = require('mobx'); var cs = _interopDefault(require('classnames')); require('antd/es/avatar/style/css'); require('antd/es/button/style/css'); require('antd/es/checkbox/style/css'); require('antd/es/divider/style/css'); require('antd/es/empty/style/css'); require('antd/es/form/style/css'); require('antd/es/icon/style/css'); require('antd/es/input/style/css'); require('antd/es/input-number/style/css'); require('antd/es/modal/style/css'); require('antd/es/popconfirm/style/css'); require('antd/es/result/style/css'); require('antd/es/select/style/css'); require('antd/es/spin/style/css'); require('antd/es/statistic/style/css'); require('antd/es/steps/style/css'); require('antd/es/tag/style/css'); require('antd/es/tooltip/style/css'); require('antd/es/table/style/css'); require('antd/es/message/style/css'); require('antd/es/dropdown/style/css'); require('antd/es/menu/style/css'); require('antd/es/switch/style/css'); require('antd/es/notification/style/css'); var Avatar = _interopDefault(require('antd/es/avatar')); var AutoComplete = _interopDefault(require('antd/es/auto-complete')); var Button = _interopDefault(require('antd/es/button')); var Checkbox = _interopDefault(require('antd/es/checkbox')); var Divider = _interopDefault(require('antd/es/divider')); var empty = _interopDefault(require('antd/es/empty')); var Form = _interopDefault(require('antd/es/form')); var Icon = _interopDefault(require('antd/es/icon')); var Input = _interopDefault(require('antd/es/input')); var InputNumber = _interopDefault(require('antd/es/input-number')); var Modal = _interopDefault(require('antd/es/modal')); var Popconfirm = _interopDefault(require('antd/es/popconfirm')); var result = _interopDefault(require('antd/es/result')); var Select = _interopDefault(require('antd/es/select')); var statistic = _interopDefault(require('antd/es/statistic')); var steps = _interopDefault(require('antd/es/steps')); var spin = _interopDefault(require('antd/es/spin')); var Tag = _interopDefault(require('antd/es/tag')); var Tooltip = _interopDefault(require('antd/es/tooltip')); var Table = _interopDefault(require('antd/es/table')); var message = _interopDefault(require('antd/es/message')); var Dropdown = _interopDefault(require('antd/es/dropdown')); var Menu = _interopDefault(require('antd/es/menu')); var _switch = _interopDefault(require('antd/es/switch')); var notification = _interopDefault(require('antd/es/notification')); var qs = _interopDefault(require('qs')); var SaasifyClient = _interopDefault(require('saasify-client')); var localforage = _interopDefault(require('localforage')); var _debug = _interopDefault(require('debug')); var reactStripeElements = require('react-stripe-elements'); var raf = _interopDefault(require('raf')); var Hoverable = _interopDefault(require('react-event-as-prop/lib/Hoverable')); var slugify = _interopDefault(require('@sindresorhus/slugify')); var copyTextToClipboard = _interopDefault(require('copy-text-to-clipboard')); var dateFns = require('date-fns'); var titleize = _interopDefault(require('titleize')); var Colr = _interopDefault(require('colr')); var random = _interopDefault(require('random')); var sizeMe = _interopDefault(require('react-sizeme')); var SyntaxHighlighter = _interopDefault(require('react-syntax-highlighter/dist/esm/light')); var defaultCodeTheme = _interopDefault(require('react-syntax-highlighter/dist/esm/styles/hljs/tomorrow')); var js = _interopDefault(require('react-syntax-highlighter/dist/esm/languages/hljs/javascript')); var json = _interopDefault(require('react-syntax-highlighter/dist/esm/languages/hljs/json')); var python = _interopDefault(require('react-syntax-highlighter/dist/esm/languages/hljs/python')); var ruby = _interopDefault(require('react-syntax-highlighter/dist/esm/languages/hljs/ruby')); var bash = _interopDefault(require('react-syntax-highlighter/dist/esm/languages/hljs/bash')); var mem = _interopDefault(require('mem')); var isDeepEqual = _interopDefault(require('fast-deep-equal')); var mediumZoom = _interopDefault(require('medium-zoom')); var mime = _interopDefault(require('mime-types')); var fileType = _interopDefault(require('file-type')); var detectCsv = _interopDefault(require('detect-csv')); var isHtml = _interopDefault(require('is-html')); var download = _interopDefault(require('downloadjs')); var ReactFromJSON = _interopDefault(require('react-from-json')); var ReactMarkdown = _interopDefault(require('react-markdown')); var codeTheme = _interopDefault(require('react-syntax-highlighter/dist/esm/styles/hljs/vs2015')); var Editor = _interopDefault(require('react-simple-code-editor')); var prettier = _interopDefault(require('prettier/standalone')); var prettierBabylon = _interopDefault(require('prettier/parser-babylon')); var Fuse = _interopDefault(require('fuse.js')); var getServiceExamples = _interopDefault(require('saasify-codegen')); var SaasifySDK = _interopDefault(require('saasify-faas-sdk')); var ReactDOM = _interopDefault(require('react-dom')); var EventEmitter3 = _interopDefault(require('eventemitter3')); var ms = _interopDefault(require('ms')); var uniqBy = _interopDefault(require('lodash.uniqby')); 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _extends() { _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; }; return _extends.apply(this, arguments); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } var styles = {"section":"okta-module_section__3C6V-","title":"okta-module_title__7O1oG","subtitle":"okta-module_subtitle__2pQn3","content":"okta-module_content__LUjyp","theme-okta":"okta-module_theme-okta__iN0o9","light":"okta-module_light__2w-1n","header":"okta-module_header__1WlW3","link":"okta-module_link___U-L6","detail":"okta-module_detail__2hQvP","cta-button":"okta-module_cta-button__qGo57","live-service-demo":"okta-module_live-service-demo__1XylH","output__cta__message":"okta-module_output__cta__message__2u8dG","footer__service__name":"okta-module_footer__service__name__4ALiU","docs-page":"okta-module_docs-page__3LlBL","logo":"okta-module_logo__2hB_O","logo--light":"okta-module_logo--light__3U9mY","plan":"okta-module_plan__22aI0","features":"okta-module_features__2473Y"}; var okta = function okta(opts) { if (opts === void 0) { opts = {}; } return _extends({}, styles, { '@name': 'okta', '@section-bg': true, '@section-fg-color': '#23303a', '@section-bg-color': '#1e3a54', '@primary-color': '#d23d67' }, opts); }; var themes = { __proto__: null, okta: okta }; var _class, _descriptor, _temp; var ThemeManagerClass = (_class = (_temp = function ThemeManagerClass() { var _this = this; _initializerDefineProperty(this, "theme", _descriptor, this); this._themes = {}; this.registerTheme = function (name, themeFactory) { if (process.env.NODE_ENV === 'development') { console.log('register theme', name); } _this._themes[name] = themeFactory; }; this.setTheme = function (opts) { var name; if (typeof opts === 'object') { name = opts.name; } else { name = opts; opts = {}; } var themeFactory = name && _this._themes[name]; if (themeFactory) { _this.theme = themeFactory(opts); } else { console.error(); console.error("ThemeManager.setTheme(" + name + ") theme not found"); console.error('Must call ThemeManager.registerTheme first'); console.error(); } }; }, _temp), (_descriptor = _applyDecoratedDescriptor(_class.prototype, "theme", [mobx.observable], { configurable: true, enumerable: true, writable: true, initializer: function initializer() { return {}; } })), _class); var ThemeManager = mobx.observable(new ThemeManagerClass()); window.ThemeManager = ThemeManager; for (var _i = 0, _Object$entries = Object.entries(themes); _i < _Object$entries.length; _i++) { var _Object$entries$_i = _Object$entries[_i], k = _Object$entries$_i[0], v = _Object$entries$_i[1]; ThemeManager.registerTheme(k, v); } if (process.env.NODE_ENV === 'development') { mobx.autorun(function () { mobx.trace(); console.log('theme', mobx.toJS(ThemeManager.theme)); }, { name: 'Theme change (development)' }); } var themeUtil = function themeUtil(styles, id) { var theme = ThemeManager.theme; for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } return cs.apply(void 0, [styles && styles[id], theme[id]].concat(args)); }; var variables = ['@name', '@section-fg-color', '@section-bg-color', 'light', 'codeTheme', '@primary-color', '@link-color', '@success-color', '@warning-color', '@error-color', '@font-size-base', '@heading-color', '@text-color', '@text-color-secondary ', '@disabled-color ', '@border-radius-base', '@border-color-base', '@box-shadow-base']; var _loop = function _loop() { var v = _variables[_i$1]; Object.defineProperty(themeUtil, v, { get: function get() { return ThemeManager.theme[v]; } }); }; for (var _i$1 = 0, _variables = variables; _i$1 < _variables.length; _i$1++) { _loop(); } mobx.decorate(themeUtil, variables.reduce(function (acc, k) { acc[k] = mobx.computed; return acc; }, {})); var theme = themeUtil; var styles$1 = {"loading":"styles-module_loading__2lJ-K","title":"styles-module_title__3WAEn","loading-icon":"styles-module_loading-icon__2Sw0s"}; var Loading = /*#__PURE__*/ function (_Component) { _inheritsLoose(Loading, _Component); function Loading() { return _Component.apply(this, arguments) || this; } var _proto = Loading.prototype; _proto.render = function render() { var _this$props = this.props, className = _this$props.className, title = _this$props.title, rest = _objectWithoutPropertiesLoose(_this$props, ["className", "title"]); return h("div", _extends({ className: themeUtil(styles$1, 'loading', className) }, rest), title && h("h3", { className: themeUtil(styles$1, 'title', className) }, title), h(Icon, { className: themeUtil(styles$1, 'loading-icon', className), type: "loading" })); }; return Loading; }(React.Component); var _dec, _class$1, _class2, _temp$1; var AuthenticatedRoute = (_dec = mobxReact.inject('auth'), _dec(_class$1 = mobxReact.observer(_class$1 = (_temp$1 = _class2 = /*#__PURE__*/ function (_Component) { _inheritsLoose(AuthenticatedRoute, _Component); function AuthenticatedRoute() { return _Component.apply(this, arguments) || this; } var _proto = AuthenticatedRoute.prototype; _proto.render = function render() { var _this$props = this.props, Component = _this$props.component, redirect = _this$props.redirect, auth = _this$props.auth, rest = _objectWithoutPropertiesLoose(_this$props, ["component", "redirect", "auth"]); if (auth.isBootstrapping) { return h(Loading, null); } if (!auth.isAuthenticated) { return h(reactRouterDom.Redirect, { to: { pathname: redirect } }); } return h(reactRouterDom.Route, _extends({}, rest, { render: function render(props) { return auth.isAuthenticated ? h(Component, props) : h(reactRouterDom.Redirect, { to: { pathname: redirect, state: { from: props.location } } }); } })); }; return AuthenticatedRoute; }(React.Component), _class2.propTypes = { component: PropTypes.oneOfType([PropTypes.func, PropTypes.object]).isRequired, auth: PropTypes.object.isRequired, redirect: PropTypes.string }, _class2.defaultProps = { redirect: '/login' }, _temp$1)) || _class$1) || _class$1); var isProd = process.env.NODE_ENV === 'production'; var apiBaseUrl = process.env.REACT_APP_SAASIFY_API_BASE_URL || 'https://api.saasify.sh'; var redirectUri = 'https://auth.saasify.sh'; var origin = typeof window !== 'undefined' ? window.location.origin : 'localhost:3000'; var githubRedirectUri = origin + "/auth/github"; var googleRedirectUri = origin + "/auth/google"; var stripeRedirectUri = origin + "/auth/stripe"; var spotifyRedirectUri = origin + "/auth/spotify"; var twitterRedirectUri = origin + "/auth/twitter"; var linkedinRedirectUri = origin + "/auth/linkedin"; var githubRedirectQuery = qs.stringify({ uri: githubRedirectUri }); var saasifyProviderStripePublicKeyTest = 'pk_test_FvYaeQlk6RbGIL9E36p9xNRo'; var saasifyProviderStripePublicKeyLive = 'pk_live_3vousdHKwzzKdrP0quCQPWcr'; var saasifyProviderStripeClientIdDev = 'ca_GqgriKmt3i5JYrKOaHzJbAceDdB0Yc5k'; var saasifyProviderStripeClientIdPrd = 'ca_Gqgr4b80VSYylXdUDsh548bNb1wqdue8'; var saasifyProviderGitHubClientIdDev = '86d73532d0105da51a4d'; var saasifyProviderGitHubClientIdPrd = '6525c812c9b4430147c3'; var saasifyProviderSpotifyClientIdDev = '99702e2b2d9d45b7bb457b4e8a9e7d68'; var saasifyProviderSpotifyClientIdPrd = '99702e2b2d9d45b7bb457b4e8a9e7d68'; var saasifyProviderLinkedInClientId = '78vssc1d6gg0c2'; var env = { isProd: isProd, apiBaseUrl: apiBaseUrl, redirectUri: redirectUri, githubRedirectUri: redirectUri + "?" + githubRedirectQuery, providerGitHubClientId: isProd ? saasifyProviderGitHubClientIdPrd : saasifyProviderGitHubClientIdDev, googleRedirectUri: googleRedirectUri, stripeRedirectUri: stripeRedirectUri, providerStripeClientId: isProd ? saasifyProviderStripeClientIdPrd : saasifyProviderStripeClientIdDev, stripePublicKey: isProd ? saasifyProviderStripePublicKeyLive : saasifyProviderStripePublicKeyTest, spotifyRedirectUri: spotifyRedirectUri, providerSpotifyClientId: isProd ? saasifyProviderSpotifyClientIdPrd : saasifyProviderSpotifyClientIdDev, twitterRedirectUri: twitterRedirectUri, linkedinRedirectUri: linkedinRedirectUri, providerLinkedInClientId: saasifyProviderLinkedInClientId }; var API = new SaasifyClient({ baseUrl: env.apiBaseUrl }); var cache = {}; var LocalStore = /*#__PURE__*/ function () { function LocalStore() {} LocalStore.get = function get() { var key = arguments.length <= 0 ? undefined : arguments[0]; var cached = cache[key]; if (cached) return Promise.resolve(cached); var value = localforage.getItem.apply(localforage, arguments); cache[key] = value; return value; }; LocalStore.set = function set() { var key = arguments.length <= 0 ? undefined : arguments[0]; var value = arguments.length <= 1 ? undefined : arguments[1]; cache[key] = value; return localforage.setItem.apply(localforage, arguments); }; LocalStore.remove = function remove() { var key = arguments.length <= 0 ? undefined : arguments[0]; delete cache[key]; return localforage.removeItem.apply(localforage, arguments); }; return LocalStore; }(); var authTwitter = function authTwitter() { try { var stateRaw = JSON.stringify({ uri: env.twitterRedirectUri, route: window.location.pathname }); var state = btoa(stateRaw); var params = { state: state }; var opts = qs.stringify(params); var redirectUri = env.redirectUri + "?" + opts; return Promise.resolve(API.getTwitterAuthUrl({ redirectUri: redirectUri })).then(function (_ref4) { var authUrl = _ref4.url; console.log({ redirectUri: redirectUri, authUrl: authUrl }); return Promise.resolve(storeState()).then(function () { window.location = authUrl; }); }); } catch (e) { return Promise.reject(e); } }; var authSpotify = function authSpotify(_ref3) { var _ref3$scope = _ref3.scope, scope = _ref3$scope === void 0 ? '' : _ref3$scope; try { var stateRaw = JSON.stringify({ uri: env.spotifyRedirectUri, route: window.location.pathname }); var state = btoa(stateRaw); var params = { response_type: 'code', client_id: env.providerSpotifyClientId, redirect_uri: env.redirectUri, scope: scope, state: state }; var opts = qs.stringify(params); return Promise.resolve(storeState()).then(function () { window.location = "https://accounts.spotify.com/authorize?" + opts; }); } catch (e) { return Promise.reject(e); } }; var authStripe = function authStripe(_ref2) { var auth = _ref2.auth, _ref2$express = _ref2.express, express = _ref2$express === void 0 ? false : _ref2$express; try { var stateRaw = JSON.stringify({ uri: env.stripeRedirectUri, route: window.location.pathname }); var state = btoa(stateRaw); var scope = express ? undefined : 'read_write'; var params = { response_type: 'code', client_id: env.providerStripeClientId, scope: scope, state: state }; if (auth) { var _auth$user; params['stripe_user[email]'] = (_auth$user = auth.user) === null || _auth$user === void 0 ? void 0 : _auth$user.email; } var opts = qs.stringify(params); return Promise.resolve(storeState()).then(function () { if (express) { window.location = "https://connect.stripe.com/express/oauth/authorize?" + opts; } else { window.location = "https://connect.stripe.com/oauth/authorize?" + opts; } }); } catch (e) { return Promise.reject(e); } }; var authGoogle = function authGoogle(params) { try { return Promise.resolve(API.getGoogleAuthUrl(params)).then(function (_ref) { var url = _ref.url; var authUrl = new URL(url); var state = JSON.stringify({ uri: env.googleRedirectUri, route: window.location.pathname }); var state64 = btoa(state); authUrl.searchParams.set('state', state64); var finalUrl = authUrl.toString(); console.log('authenticating with google', { url: url, finalUrl: finalUrl }); return Promise.resolve(storeState()).then(function () { window.location = finalUrl; }); }); } catch (e) { return Promise.reject(e); } }; var authLinkedIn = function authLinkedIn() { try { var scope = 'r_liteprofile r_emailaddress'; var stateRaw = JSON.stringify({ uri: env.linkedinRedirectUri, route: window.location.pathname }); var state = btoa(stateRaw); var opts = qs.stringify({ client_id: env.providerLinkedInClientId, redirect_uri: env.redirectUri, response_type: 'code', scope: scope, state: state }); return Promise.resolve(storeState()).then(function () { window.location = "https://www.linkedin.com/oauth/v2/authorization?" + opts; }); } catch (e) { return Promise.reject(e); } }; var authGitHub = function authGitHub() { try { var scope = 'read:user user:email'; var opts = qs.stringify(_extends({}, githubConfig, { scope: scope })); return Promise.resolve(storeState()).then(function () { window.location = "https://github.com/login/oauth/authorize?" + opts; }); } catch (e) { return Promise.reject(e); } }; var storeState = function storeState() { try { return Promise.resolve(LocalStore.set(storeKey, window.location.href)); } catch (e) { return Promise.reject(e); } }; var storeKey = 'auth:location'; var githubConfig = { client_id: env.providerGitHubClientId, redirect_uri: env.githubRedirectUri }; var debug = _debug('app'); var styles$2 = {"form":"styles-module_form__yUzwU","title":"styles-module_title__muMf6","forgot":"styles-module_forgot__7hJYu","submit":"styles-module_submit__1k3Id","or-signup":"styles-module_or-signup__dvibh"}; var _dec$1, _dec2, _class$2, _class2$1, _temp$2; var FormItem = Form.Item; var LoginForm = (_dec$1 = mobxReact.inject('auth'), _dec2 = Form.create(), _dec$1(_class$2 = _dec2(_class$2 = (_temp$2 = _class2$1 = /*#__PURE__*/ function (_Component) { _inheritsLoose(LoginForm, _Component); function LoginForm() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _Component.call.apply(_Component, [this].concat(args)) || this; _this.state = { loading: false }; _this._onSubmit = function (e) { e.preventDefault(); _this.props.form.validateFields(function (err, data) { if (!err) { _this.setState({ loading: true }); _this.props.auth.signin(data).then(_this.props.onAuth)["catch"](function (err) { var _err$response, _err$response$data; debug(err); _this.setState({ loading: false }); notification.error({ message: 'Error logging in', description: (err === null || err === void 0 ? void 0 : (_err$response = err.response) === null || _err$response === void 0 ? void 0 : (_err$response$data = _err$response.data) === null || _err$response$data === void 0 ? void 0 : _err$response$data.error) || err.message, duration: 10 }); }); } }); }; _this._onClickGitHub = function (e) { e.preventDefault(); authGitHub(); }; _this._onClickGoogle = function (e) { e.preventDefault(); authGoogle(_this.props.authParams); }; _this._onClickTwitter = function (e) { e.preventDefault(); authTwitter(); }; _this._onClickLinkedIn = function (e) { e.preventDefault(); authLinkedIn(); }; return _this; } var _proto = LoginForm.prototype; _proto.render = function render() { var _authConfig$github, _authConfig$google, _authConfig$twitter, _authConfig$linkedin, _authConfig$default; var _this$props = this.props, className = _this$props.className, authConfig = _this$props.authConfig; var getFieldDecorator = this.props.form.getFieldDecorator; var loading = this.state.loading; var iconUser = h(Icon, { type: "user", style: { color: 'rgba(0,0,0,.25)' } }); var iconLock = h(Icon, { type: "lock", style: { color: 'rgba(0,0,0,.25)' } }); var hasGitHubAuth = ((_authConfig$github = authConfig.github) === null || _authConfig$github === void 0 ? void 0 : _authConfig$github.enabled) !== false; var hasGoogleAuth = ((_authConfig$google = authConfig.google) === null || _authConfig$google === void 0 ? void 0 : _authConfig$google.enabled) !== false; var hasTwitterAuth = ((_authConfig$twitter = authConfig.twitter) === null || _authConfig$twitter === void 0 ? void 0 : _authConfig$twitter.enabled) !== false; var hasLinkedInAuth = ((_authConfig$linkedin = authConfig.linkedin) === null || _authConfig$linkedin === void 0 ? void 0 : _authConfig$linkedin.enabled) !== false; var hasDefaultAuth = ((_authConfig$default = authConfig["default"]) === null || _authConfig$default === void 0 ? void 0 : _authConfig$default.enabled) !== false; return h(Form, { className: themeUtil(styles$2, 'form', themeUtil.light, className), onSubmit: this._onSubmit }, h("h2", { className: themeUtil(styles$2, 'title') }, "Login"), authConfig.preBody, hasGitHubAuth && h(FormItem, null, h(Button, { className: themeUtil(styles$2, 'submit'), icon: "github", onClick: this._onClickGitHub }, "Log in with GitHub")), hasGoogleAuth && h(FormItem, null, h(Button, { className: themeUtil(styles$2, 'submit'), icon: "google", onClick: this._onClickGoogle }, "Log in with Google")), hasTwitterAuth && h(FormItem, null, h(Button, { className: themeUtil(styles$2, 'submit'), icon: "twitter", onClick: this._onClickTwitter }, "Log in with Twitter")), hasLinkedInAuth && h(FormItem, null, h(Button, { className: themeUtil(styles$2, 'submit'), icon: "linkedin", onClick: this._onClickLinkedIn }, "Log in with LinkedIn")), (hasGitHubAuth || hasGoogleAuth || hasTwitterAuth || hasLinkedInAuth) && hasDefaultAuth && h(Divider, null, "Or"), hasDefaultAuth && h(React__default.Fragment, null, h(FormItem, null, getFieldDecorator('username', { rules: [{ required: true, message: 'Please enter your username or email.' }] })(h(Input, { prefix: iconUser, placeholder: "Username" }))), h(FormItem, null, getFieldDecorator('password', { rules: [{ required: true, message: 'Please enter your password.' }] })(h(Input, { prefix: iconLock, type: "password", placeholder: "Password" }))), h(FormItem, null, getFieldDecorator('remember', { valuePropName: 'checked', initialValue: true })(h(Checkbox, null, "Remember me"))), h(Button, { type: "primary", htmlType: "submit", className: themeUtil(styles$2, 'submit'), loading: loading }, "Log in")), authConfig.orSignup !== false && h("div", { className: themeUtil(styles$2, 'or-signup') }, authConfig.orSignup || h("span", null, "Or ", h(reactRouterDom.Link, { to: "/signup" }, "sign up!"))), authConfig.postBody); }; return LoginForm; }(React.Component), _class2$1.propTypes = { auth: PropTypes.object.isRequired, form: PropTypes.object.isRequired, authConfig: PropTypes.object, authParams: PropTypes.object, className: PropTypes.string, onAuth: PropTypes.func }, _class2$1.defaultProps = { authConfig: {}, authParams: {}, onAuth: function onAuth() { return undefined; } }, _temp$2)) || _class$2) || _class$2); var styles$3 = {"form":"styles-module_form__QEYKq","title":"styles-module_title__2b9xU","submit":"styles-module_submit__2hmyi"}; var _dec$2, _dec2$1, _class$3, _class2$2, _temp$3; var FormItem$1 = Form.Item; var SignupForm = (_dec$2 = mobxReact.inject('auth'), _dec2$1 = Form.create(), _dec$2(_class$3 = _dec2$1(_class$3 = (_temp$3 = _class2$2 = /*#__PURE__*/ function (_Component) { _inheritsLoose(SignupForm, _Component); function SignupForm() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _Component.call.apply(_Component, [this].concat(args)) || this; _this.state = { loading: false }; _this._onSubmit = function (e) { e.preventDefault(); _this.props.form.validateFields(function (err, data) { if (!err) { _this.setState({ loading: true }); _this.props.auth.signup(data).then(_this.props.onAuth)["catch"](function (err) { var _err$response, _err$response$data; debug(err); _this.setState({ loading: false }); notification.error({ message: 'Error signing up', description: (err === null || err === void 0 ? void 0 : (_err$response = err.response) === null || _err$response === void 0 ? void 0 : (_err$response$data = _err$response.data) === null || _err$response$data === void 0 ? void 0 : _err$response$data.error) || err.message, duration: 10 }); }); } }); }; _this._onClickGitHub = function (e) { e.preventDefault(); authGitHub(); }; _this._onClickGoogle = function (e) { e.preventDefault(); authGoogle(_this.props.authParams); }; _this._onClickTwitter = function (e) { e.preventDefault(); authTwitter(); }; _this._onClickLinkedIn = function (e) { e.preventDefault(); authLinkedIn(); }; return _this; } var _proto = SignupForm.prototype; _proto.render = function render() { var _authConfig$github, _authConfig$google, _authConfig$twitter, _authConfig$linkedin, _authConfig$default; var _this$props = this.props, className = _this$props.className, authConfig = _this$props.authConfig; var getFieldDecorator = this.props.form.getFieldDecorator; var loading = this.state.loading; var iconUser = h(Icon, { type: "user", style: { color: 'rgba(0,0,0,.25)' } }); var iconLock = h(Icon, { type: "lock", style: { color: 'rgba(0,0,0,.25)' } }); var hasGitHubAuth = ((_authConfig$github = authConfig.github) === null || _authConfig$github === void 0 ? void 0 : _authConfig$github.enabled) !== false; var hasGoogleAuth = ((_authConfig$google = authConfig.google) === null || _authConfig$google === void 0 ? void 0 : _authConfig$google.enabled) !== false; var hasTwitterAuth = ((_authConfig$twitter = authConfig.twitter) === null || _authConfig$twitter === void 0 ? void 0 : _authConfig$twitter.enabled) !== false; var hasLinkedInAuth = ((_authConfig$linkedin = authConfig.linkedin) === null || _authConfig$linkedin === void 0 ? void 0 : _authConfig$linkedin.enabled) !== false; var hasDefaultAuth = ((_authConfig$default = authConfig["default"]) === null || _authConfig$default === void 0 ? void 0 : _authConfig$default.enabled) !== false; return h(Form, { className: themeUtil(styles$3, 'form', themeUtil.light, className), onSubmit: this._onSubmit }, h("h2", { className: themeUtil(styles$3, 'title') }, "Sign up"), authConfig.preBody, hasGitHubAuth && h(FormItem$1, null, h(Button, { className: themeUtil(styles$3, 'submit'), icon: "github", onClick: this._onClickGitHub }, "Sign up with GitHub")), hasGoogleAuth && h(FormItem$1, null, h(Button, { className: themeUtil(styles$3, 'submit'), icon: "google", onClick: this._onClickGoogle }, "Sign up with Google")), hasTwitterAuth && h(FormItem$1, null, h(Button, { className: themeUtil(styles$3, 'submit'), icon: "twitter", onClick: this._onClickTwitter }, "Sign up with Twitter")), hasLinkedInAuth && h(FormItem$1, null, h(Button, { className: themeUtil(styles$3, 'submit'), icon: "linkedin", onClick: this._onClickLinkedIn }, "Sign up with LinkedIn")), (hasGitHubAuth || hasGoogleAuth || hasTwitterAuth || hasLinkedInAuth) && hasDefaultAuth && h(Divider, null, "Or"), hasDefaultAuth && h(React__default.Fragment, null, h(FormItem$1, null, getFieldDecorator('email', { rules: [{ required: true, message: 'Please enter your email.' }] })(h(Input, { prefix: iconUser, placeholder: "Email" }))), h(FormItem$1, null, getFieldDecorator('username', { rules: [{ required: true, message: 'Please enter a username.' }] })(h(Input, { prefix: iconUser, placeholder: "Username" }))), h(FormItem$1, null, getFieldDecorator('password', { rules: [{ required: true, message: 'Please enter a password.' }] })(h(Input, { prefix: iconLock, type: "password", placeholder: "Password" }))), h(FormItem$1, null, getFieldDecorator('remember', { valuePropName: 'checked', initialValue: true })(h(Checkbox, null, "Remember me"))), h(Button, { type: "primary", htmlType: "submit", className: themeUtil(styles$3, 'submit'), loading: loading }, "Sign up")), authConfig.postBody); }; return SignupForm; }(React.Component), _class2$2.propTypes = { auth: PropTypes.object.isRequired, form: PropTypes.object.isRequired, authConfig: PropTypes.object, authParams: PropTypes.object, className: PropTypes.string, onAuth: PropTypes.func }, _class2$2.defaultProps = { authConfig: {}, authParams: {}, onAuth: function onAuth() { return undefined; } }, _temp$3)) || _class$3) || _class$3); var styles$4 = {"form":"styles-module_form__IMIw5","title":"styles-module_title__202A0","submit":"styles-module_submit__3cAJZ","label":"styles-module_label__1mKjb","input":"styles-module_input__2PQy2","detail":"styles-module_detail__1-Z3w"}; var _dec$3, _class$4, _class2$3, _temp$4, _class3, _class4, _temp2; var createOptions = function createOptions(fontSize) { if (fontSize === void 0) { fontSize = 16; } return { style: { base: { fontSize: fontSize, color: '#424770', letterSpacing: '0.025em', '::placeholder': { color: '#aab7c4' } }, invalid: { color: '#9e2146' } } }; }; var CheckoutForm = (_dec$3 = mobxReact.inject('config'), _dec$3(_class$4 = mobxReact.observer(_class$4 = (_temp$4 = _class2$3 = /*#__PURE__*/ function (_Component) { _inheritsLoose(CheckoutForm, _Component); function CheckoutForm() { return _Component.apply(this, arguments) || this; } var _proto = CheckoutForm.prototype; _proto.render = function render() { return h(reactStripeElements.StripeProvider, { apiKey: env.stripePublicKey }, h(reactStripeElements.Elements, null, h(CheckoutFormImpl, this.props))); }; return CheckoutForm; }(React.Component), _class2$3.propTypes = { onSubmit: PropTypes.func.isRequired, loading: PropTypes.bool, title: PropTypes.string, action: PropTypes.node, footer: PropTypes.node, className: PropTypes.string, config: PropTypes.object.isRequired }, _temp$4)) || _class$4) || _class$4); var CheckoutFormImpl = reactStripeElements.injectStripe(_class3 = (_temp2 = _class4 = /*#__PURE__*/ function (_Component2) { _inheritsLoose(CheckoutFormImpl, _Component2); function CheckoutFormImpl() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _Component2.call.apply(_Component2, [this].concat(args)) || this; _this._onSubmit = function (e) { try { e.preventDefault(); var name = e.target.name.value; var coupon = e.target.coupon && e.target.coupon.value; _this.props.onSubmit({ name: name, coupon: coupon, stripe: _this.props.stripe }); return Promise.resolve(); } catch (e) { return Promise.reject(e); } }; return _this; } var _proto2 = CheckoutFormImpl.prototype; _proto2.render = function render() { var _this$props = this.props, config = _this$props.config, loading = _this$props.loading, title = _this$props.title, action = _this$props.action, footer = _this$props.footer, className = _this$props.className; return h("form", { className: themeUtil(styles$4, 'form', className, themeUtil(styles$4, 'light')), onSubmit: this._onSubmit }, title && h("h2", { className: themeUtil(styles$4, 'title') }, title), h("label", { className: themeUtil(styles$4, 'label') }, "Name", h("input", { className: themeUtil(styles$4, 'input'), name: "name", type: "text", placeholder: "John Doe", required: true })), h("label", { className: themeUtil(styles$4, 'label') }, "Card Details", h(Tooltip, { placement: "right", title: "All payment info is securely handled by Stripe." }, h(Icon, { className: themeUtil(styles$4, 'detail'), type: "question-circle" })), h(reactStripeElements.CardElement, createOptions())), config.coupons && config.coupons.length > 0 && h("label", { className: themeUtil(styles$4, 'label') }, "Promo Code", h("input", { className: themeUtil(styles$4, 'input'), name: "coupon", type: "text", placeholder: "" })), action && h(Button, { type: "primary", htmlType: "submit", className: themeUtil(styles$4, 'submit'), loading: loading }, action), footer); }; return CheckoutFormImpl; }(React.Component), _class4.propTypes = { config: PropTypes.object.isRequired, stripe: PropTypes.object.isRequired, onSubmit: PropTypes.func.isRequired, loading: PropTypes.bool, title: PropTypes.string, action: PropTypes.node, footer: PropTypes.node, className: PropTypes.string }, _class4.defaultProps = { loading: false }, _temp2)) || _class3; var styles$5 = {"cta-button":"styles-module_cta-button__3AKzj","inline":"styles-module_inline__1QeA5"}; var _class$5; var CTAButton = Hoverable(_class$5 = mobxReact.observer(_class$5 = /*#__PURE__*/ function (_Component) { _inheritsLoose(CTAButton, _Component); function CTAButton() { return _Component.apply(this, arguments) || this; } var _proto = CTAButton.prototype; _proto.render = function render() { var _this$props = this.props, hovered = _this$props.hovered, _this$props$type = _this$props.type, type = _this$props$type === void 0 ? 'primary' : _this$props$type, inline = _this$props.inline, className = _this$props.className, children = _this$props.children, _this$props$style = _this$props.style, style = _this$props$style === void 0 ? {} : _this$props$style, rest = _objectWithoutPropertiesLoose(_this$props, ["hovered", "type", "inline", "className", "children", "style"]); var primaryColor = themeUtil['@primary-color']; var borderColor = type === 'secondary' || !hovered ? primaryColor : 'transparent'; var ownStyle = { border: "2px solid " + borderColor }; if (type === 'secondary') { ownStyle.background = hovered ? primaryColor : 'transparent'; } return h(Button, _extends({ type: type, className: themeUtil(styles$5, 'cta-button', className, type, styles$5[type], inline && themeUtil(styles$5, 'inline')), style: _extends({}, ownStyle, {}, style) }, rest), children); }; return CTAButton; }(React.Component)) || _class$5) || _class$5; var styles$6 = {"logo":"styles-module_logo__CDiMd"}; var _dec$4, _class$6; var Logo = (_dec$4 = mobxReact.inject('config'), _dec$4(_class$6 = mobxReact.observer(_class$6 = /*#__PURE__*/ function (_Component) { _inheritsLoose(Logo, _Component); function Logo() { return _Component.apply(this, arguments) || this; } var _proto = Logo.prototype; _proto.render = function render() { var _config$deployment, _config$deployment$sa; var _this$props = this.props, className = _this$props.className, _this$props$style = _this$props.style, style = _this$props$style === void 0 ? {} : _this$props$style, light = _this$props.light, config = _this$props.config, rest = _objectWithoutPropertiesLoose(_this$props, ["className", "style", "light", "config"]); return config.logo ? h("img", _extends({ className: themeUtil(styles$6, 'logo', className), src: light && ((_config$deployment = config.deployment) === null || _config$deployment === void 0 ? void 0 : (_config$deployment$sa = _config$deployment.saas) === null || _config$deployment$sa === void 0 ? void 0 : _config$deployment$sa.logoLight) || config.logo, alt: config.name + " Logo", style: style }, rest)) : h("div", _extends({ className: themeUtil(styles$6, 'logo', className), style: style }, rest), config.name); }; return Logo; }(React.Component)) || _class$6) || _class$6); var styles$7 = {"nav-header":"styles-module_nav-header__1B5br","content":"styles-module_content__1AUWq","content-body":"styles-module_content-body__1Omfb","attached":"styles-module_attached__2xShN","primary":"styles-module_primary__1cin0","logo-image":"styles-module_logo-image__2ur8t","logo":"styles-module_logo__3yU03","logo--light":"styles-module_logo--light__3Pv3B","logo-text":"styles-module_logo-text__KGXVL","links":"styles-module_links__3DD6V","link":"styles-module_link__oAvSn","active-link":"styles-module_active-link__1Hooy","container":"styles-module_container__2vHAE","menuWrapper":"styles-module_menuWrapper__2252q","actions":"styles-module_actions__RSgiO","action":"styles-module_action__3O1Yp","burger":"styles-module_burger__1fkY1","icon":"styles-module_icon__3CHwg","expanded":"styles-module_expanded__39KUP"}; var Link = (function (_ref) { var children = _ref.children, label = _ref.label, to = _ref.to, href = _ref.href, className = _ref.className, rest = _objectWithoutPropertiesLoose(_ref, ["children", "label", "to", "href", "className"]); return to ? h(reactRouterDom.NavLink, _extends({ to: to, className: themeUtil(styles$7, 'link', className), activeClassName: themeUtil(styles$7, 'active-link', className), exact: true }, rest), label || children) : h("a", _extends({ href: href, className: themeUtil(styles$7, 'link', className) }, rest), label || children); }); var _dec$5, _dec2$2, _class$7, _class2$4, _temp$5; var isServer = typeof window === 'undefined'; var NavHeader = (_dec$5 = mobxReact.inject('config'), _dec2$2 = mobxReact.inject('auth'), _dec$5(_class$7 = _dec2$2(_class$7 = mobxReact.observer(_class$7 = (_temp$5 = _class2$4 = /*#__PURE__*/ function (_Component) { _inheritsLoose(NavHeader, _Component); function NavHeader() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _Component.call.apply(_Component, [this].concat(args)) || this; _this.state = { attached: isServer || window.scrollY > 0, expanded: false, width: isServer ? 1000 : window.clientWidth || window.innerWidth }; _this._onToggleMainNav = function () { _this.setState({ expanded: !_this.state.expanded }); }; _this._onScroll = function () { if (!_this._resetRaf) { _this._resetRaf = raf(_this._onReset); } }; _this._onResize = function () { if (!_this._resetRaf) { _this._resetRaf = raf(_this._onReset); } }; _this._onReset = function () { _this._resetRaf = null; _this.setState({ attached: isServer || window.scrollY > 0, width: window.clientWidth || window.innerWidth }); }; return _this; } var _proto = NavHeader.prototype; _proto.componentDidMount = function componentDidMount() { if (!isServer) { window.addEventListener('scroll', this._onScroll); window.addEventListener('resize', this._onResize); this._onReset(); } }; _proto.componentWillUnmount = function componentWillUnmount() { if (!isServer) { window.removeEventListener('scroll', this._onScroll); window.removeEventListener('resize', this._onResize); } if (this._resetRaf) { raf.cancel(this._resetRaf); this._resetRaf = null; } }; _proto.render = function render() { var _config$deployment, _config$deployment$sa, _config$header, _sections$navHeader, _config$header2, _sections$navHeader2, _config$deployment2, _config$deployment2$s; var _this$props = this.props, auth = _this$props.auth, config = _this$props.config, fixed = _this$props.fixed, className = _this$props.className; var _this$state = this.state, attached = _this$state.attached, expanded = _this$state.expanded, width = _this$state.width; var sections = config === null || config === void 0 ? void 0 : (_config$deployment = config.deployment) === null || _config$deployment === void 0 ? void 0 : (_config$deployment$sa = _config$deployment.saas) === null || _config$deployment$sa === void 0 ? void 0 : _config$deployment$sa.sections; var actions = ((_config$header = config.header) === null || _config$header === void 0 ? void 0 : _config$header.actions) || []; if (typeof actions === 'function') { actions = actions({ config: config, auth: auth, fixed: fixed, attached: attached }); } var actionsMenu = actions && auth.isAuthenticated && h(Menu, { onClick: function onClick(e) { return console.log(e); } }, actions.map(function (action, index) { if (typeof action === 'function') { action = action({ config: config, auth: auth, fixed: fixed, attached: attached }); if (!action) return null; } var _action = action, to = _action.to, href = _action.href, label = _action.label, icon = _action.icon, rest = _objectWithoutPropertiesLoose(_action, ["key", "to", "href", "label", "icon"]); var validKey = action.key || action.to || action.href || index; return h(Menu.Item, { key: validKey }, h(Link, _extends({ key: validKey, to: to, href: href }, rest), icon && h(Icon, { type: icon, className: styles$7.icon }), label)); })); return h("header", { className: themeUtil(styles$7, 'nav-header', attached || fixed ? themeUtil(styles$7, 'attached') : null, expanded ? themeUtil(styles$7, 'expanded') : null, className), style: { background: attached || fixed || expanded ? themeUtil['@section-fg-color'] : 'transparent', paddingBottom: expanded ? 24 : undefined } }, h("div", { className: themeUtil(styles$7, 'content') }, h("div", { className: themeUtil(styles$7, 'primary') }, h(Link, { to: "/" }, config.logo && (sections === null || sections === void 0 ? void 0 : (_sections$navHeader = sections.navHeader) === null || _sections$navHeader === void 0 ? void 0 : _sections$navHeader.logo) !== false && h("span", { className: themeUtil(styles$7, 'logo-image') }, h(Logo, { className: themeUtil(styles$7, 'logo') }), h(Logo, { className: themeUtil(styles$7, 'logo', themeUtil(styles$7, 'logo--light')), light: true })), config.logo && (config === null || config === void 0 ? void 0 : (_config$header2 = config.header) === null || _config$header2 === void 0 ? void 0 : _config$header2.displayName) !== false && (sections === null || sections === void 0 ? void 0 : (_sections$navHeader2 = sections.navHeader) === null || _sections$navHeader2 === void 0 ? void 0 : _sections$navHeader2.displayName) !== false && h("span", { className: themeUtil(styles$7, 'logo-text') }, (config === null || config === void 0 ? void 0 : (_config$deployment2 = config.deployment) === null || _config$deployment2 === void 0 ? void 0 : (_config$deployment2$s = _config$deployment2.saas) === null || _config$deployment2$s === void 0 ? void 0 : _config$deployment2$s.headerName) ? config.deployment.saas.headerName : config === null || config === void 0 ? void 0 : config.name)), h("div", { className: themeUtil(styles$7, 'burger') }, h(Button, { type: "secondary", onClick: this._onToggleMainNav, icon: "menu" }))), h("div", { className: themeUtil(styles$7, 'content-body') }, h("div", { className: themeUtil(styles$7, 'links') }, config.header.links.map(function (link) { if (typeof link === 'function') { link = link({ config: config, auth: auth, fixed: fixed, attached: attached }); if (!link) return null; } var _link = link, label = _link.label, rest = _objectWithoutPropertiesLoose(_link, ["label", "icon"]); retu