{"version":3,"file":"js/landing.js","mappings":";;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAEA;AACA;AAEA;AAAA;AASA;;;;;;;;;;;;;;;;;;AC1FA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACnDA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAGA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAIA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;ACjEA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC/CA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;ACPA;AACA;AAYA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAEA;AAAA;AAGA;AACA;AACA;AACA;AAGA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAAA;AAAA;AAGA;AAAA;AAGA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAGA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;;;;;;;;;;;;;;;ACpJA;AACA;AACA;AAEA;AAEA;;;;;;;;;;;ACNA;AACA","sources":["webpack://@fortressiq/trinity/./client/landing/Base.jsx","webpack://@fortressiq/trinity/./client/landing/MessageContext.jsx","webpack://@fortressiq/trinity/./client/landing/Routes.jsx","webpack://@fortressiq/trinity/./client/landing/TokenContext.jsx","webpack://@fortressiq/trinity/./client/landing/common/loginFooter.jsx","webpack://@fortressiq/trinity/./client/landing/login/index.jsx","webpack://@fortressiq/trinity/./client/packs/landing.js","webpack://@fortressiq/trinity/./client/styles/login.scss"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport { BrowserRouter as Router } from 'react-router-dom'\nimport { ModalProvider, theme, ThemeProvider } from '@fortressiq/fiq-ds'\n\nimport Routes from './Routes'\nimport { useTokenDispatch, TokenProvider } from './TokenContext'\nimport { useMessageDispatch, MessageProvider } from './MessageContext'\n\nfunction Base() {\n const tokenDispatch = useTokenDispatch()\n const messageDispatch = useMessageDispatch()\n const [requestPasswordToken, setRequestPasswordToken] = useState('')\n const [confirmationToken, setConfirmationToken] = useState('')\n\n useEffect(() => {\n const authTokenElement = document.getElementById('fiq:authenticity_token')\n const authInfo = JSON.parse(authTokenElement.content)\n\n const confirmationTokenEl = document.getElementById('fiq:confirmation_token')\n setConfirmationToken(confirmationTokenEl.content)\n\n const requestPasswordTokenEl = document.getElementById('fiq:reset_password_token')\n setRequestPasswordToken(requestPasswordTokenEl.content)\n\n tokenDispatch({\n type: 'set',\n auth: {\n name: authInfo.name,\n token: authInfo.token,\n },\n confirmation: {\n token: confirmationTokenEl.content,\n },\n requestPassword: {\n token: requestPasswordTokenEl.content,\n },\n })\n }, [tokenDispatch])\n\n useEffect(() => {\n const errorsEl = document.getElementById('fiq:errors')\n const errorsObj = JSON.parse(errorsEl.content)\n const messagesEl = document.getElementById('fiq:messages')\n const messagesObj = JSON.parse(messagesEl.content)\n let messageKeys = Object.keys(messagesObj)\n\n // extract any alert messages and put them in errors\n const errors = errorsObj ? errorsObj.errors.map(error => ({ text: error })) : []\n\n messageKeys = messageKeys.reduce((acc, key) => {\n if (key === 'alert') {\n errors.push({ text: messagesObj[key] })\n } else {\n acc.push(key)\n }\n return acc\n }, [])\n\n const messages = messageKeys\n ? messageKeys.map(key => ({\n text: messagesObj[key],\n }))\n : []\n\n messageDispatch({\n type: 'set',\n errors,\n messages,\n })\n }, [messageDispatch])\n\n return (\n \n \n \n )\n}\n\nexport default () => {\n return (\n \n \n \n \n \n \n \n \n \n )\n}\n","import React, { createContext, useContext, useReducer } from 'react'\n\nconst MessageStateContext = createContext()\nconst MessageDispatchContext = createContext()\n\nfunction messageReducer(state, action) {\n switch (action.type) {\n case 'set': {\n return {\n errors: action.errors,\n messages: action.messages,\n }\n }\n case 'clear': {\n return {\n errors: [],\n messages: [],\n }\n }\n default: {\n throw new Error(`Unhandled action type: ${action.type}`)\n }\n }\n}\n\nfunction MessageProvider({ children }) {\n const [state, dispatch] = useReducer(messageReducer, {\n errors: [],\n messages: [],\n })\n return (\n \n {children}\n \n )\n}\n\nfunction useMessageState() {\n const context = useContext(MessageStateContext)\n if (context === undefined) {\n throw new Error('useMessageState must be used within a MessageProvider')\n }\n return context\n}\n\nfunction useMessageDispatch() {\n const context = React.useContext(MessageDispatchContext)\n if (context === undefined) {\n throw new Error('useMessageDispatch must be used within a MessageProvider')\n }\n return context\n}\n\nexport { MessageDispatchContext, MessageProvider, useMessageState, useMessageDispatch }\n","import React, { Suspense, lazy } from 'react'\nimport PropTypes from 'prop-types'\nimport { Route, Switch, useHistory } from 'react-router-dom'\n\nimport LoadingFallback from 'components/loaders/MainLoader'\n\nimport { useMessageDispatch } from './MessageContext'\nimport Login from './login'\n\nconst Routes = ({ confirmationToken, requestPasswordToken }) => {\n const routes = [\n { path: '/users/password/new', component: () => import('./forgot_password') },\n { path: '/users/password/edit', component: () => import('./password_reset') },\n {\n path: '/users/password',\n component: () => {\n if (requestPasswordToken) return import('./password_reset')\n else return import('./forgot_password')\n },\n },\n { path: '/users/confirmation/new', component: () => import('./confirmation_request') },\n {\n path: '/users/confirmation',\n component: () => {\n if (confirmationToken) return import('./confirmation')\n else return import('./confirmation_request')\n },\n },\n { path: '/user/confirmation', component: () => import('./confirmation') },\n ]\n\n const history = useHistory()\n const messageDispatch = useMessageDispatch()\n\n history.listen(() => {\n // if the user changes location, clear out the errors and messages\n messageDispatch({ type: 'clear' })\n })\n\n return (\n }>\n \n {routes.map(({ component, routes: nestedRoutes, switchRoutes, exact, ...rest }, index) => {\n const Component = lazy(component)\n const key = `${rest.path.replace('/', '-')}-${index}`\n return } key={key} {...rest} />\n })}\n \n \n \n )\n}\n\nRoutes.propTypes = {\n confirmationToken: PropTypes.string,\n lastMethod: PropTypes.string,\n requestPasswordToken: PropTypes.string,\n}\n\nRoutes.defaultProps = {\n confirmationToken: '',\n lastMethod: '',\n requestPasswordToken: '',\n}\n\nexport default Routes\n","import React, { createContext, useContext, useReducer } from 'react'\n\nconst TokenStateContext = createContext()\nconst TokenDispatchContext = createContext()\n\nfunction tokenReducer(state, action) {\n switch (action.type) {\n case 'set': {\n return {\n auth: { name: action.auth.name, token: action.auth.token },\n confirmation: { token: action.confirmation.token },\n requestPassword: { token: action.requestPassword.token },\n }\n }\n default: {\n throw new Error(`Unhandled action type: ${action.type}`)\n }\n }\n}\n\nfunction TokenProvider({ children }) {\n const [state, dispatch] = useReducer(tokenReducer, {\n auth: { name: 'authenticity_token', token: '' },\n confirmation: { token: '' },\n requestPassword: { token: '' },\n })\n return (\n \n {children}\n \n )\n}\n\nfunction useTokenState() {\n const context = useContext(TokenStateContext)\n if (context === undefined) {\n throw new Error('useTokenState must be used within a TokenProvider')\n }\n return context\n}\n\nfunction useTokenDispatch() {\n const context = React.useContext(TokenDispatchContext)\n if (context === undefined) {\n throw new Error('useTokenDispatch must be used within a TokenProvider')\n }\n return context\n}\n\nexport { TokenDispatchContext, TokenProvider, useTokenState, useTokenDispatch }\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nconst loginFooter = () => ({\n left: Didn't receive confirmation instructions?,\n})\n\nexport default loginFooter\n","import React, { useCallback, useMemo, useReducer } from 'react'\nimport {\n Button,\n Checkbox,\n Element,\n FullscreenPage,\n Group,\n HiddenInput,\n Icon,\n Input,\n SwitchView,\n theme,\n} from '@fortressiq/fiq-ds'\nimport { Link } from 'react-router-dom'\nimport debounce from 'lodash/debounce'\n\nimport api from 'lib/Api'\n\nimport { useTokenState } from '../TokenContext'\nimport { useMessageState } from '../MessageContext'\nimport loginFooter from '../common/loginFooter'\n\nexport default () => {\n const {\n auth: { name, token },\n } = useTokenState()\n const { errors, messages } = useMessageState()\n const [formState, dispatch] = useReducer(\n (state, { type, payload }) => ({\n ...state,\n [type]: payload,\n }),\n {\n password: '',\n username: '',\n ssoLink: null,\n }\n )\n\n const handleUsernameChange = e => {\n dispatch({ type: 'username', payload: e.target.value })\n debouncedSAMLRequest(e?.target?.value)\n }\n const handlePasswordChange = e => dispatch({ type: 'password', payload: e.target.value })\n\n const checkSAMLUser = useCallback(async u => {\n const { data } = await api.get(`/api/v1/users/info?username=${encodeURIComponent(u)}`, null, false)\n\n if (data?.provider === 'saml') {\n dispatch({ type: 'ssoLink', payload: data.redirectURI })\n } else {\n dispatch({ type: 'ssoLink', payload: null })\n }\n }, [])\n\n const debouncedSAMLRequest = useMemo(() => debounce(checkSAMLUser, 500), [checkSAMLUser])\n\n const showForgotP = formState?.ssoLink === null\n\n const pageContent = [\n ,\n \n }\n key='switchview'\n switchTo={\n \n \n Single Sign-on Enabled\n \n }\n switchView={formState?.ssoLink !== null}\n />,\n ,\n \n \n Remember Me\n \n {showForgotP && Forgot your password?}\n ,\n ]\n const formSettings = {\n acceptCharset: 'UTF-8',\n action: formState?.ssoLink || '/users/sign_in',\n hiddenFields: (\n \n ),\n method: 'post',\n }\n\n return (\n \n )\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport Landing from '../landing/Base'\n\nimport 'styles/login.scss'\n\nReactDOM.render(, document.getElementById('landing'))\n","// extracted by mini-css-extract-plugin\nexport default {};"],"names":[],"sourceRoot":""}