{"version":3,"sources":["components/modal/Modal.tsx","components/Header.tsx","components/Copyright.tsx","components/Footer.tsx","components/Layout.tsx","components/MaterialTextField.tsx","hooks/useDisableContinue.ts","components/forms/LoginForm.tsx","components/StyledButton.tsx","components/forms/TwoFactorAuthForm.tsx","components/forms/ForgotPasswordForm.tsx","components/forms/LoginModel.ts","components/utils.ts","hooks/useAuthentication.ts","hooks/useResendPasscode.ts","components/modal/MaterialModal.tsx","components/modal/ModalContent.tsx","components/modal/ModalHeader.tsx","components/Login.tsx","hooks/useForgotPassword.tsx","components/MaterialDatePicker.tsx","components/forms/CustomerPortalLoginForm.tsx","hooks/useCustomerPortal.ts","components/forms/SetPasswordModels.ts","components/Error.tsx","hooks/useAxios.ts","components/Logout.tsx","components/forms/SetPasswordForm.tsx","components/SetPassword.tsx","App.tsx","serviceWorker.ts","theme.ts","index.tsx"],"names":["ModalWidth","useStyles","makeStyles","theme","link","margin","spacing","fontSize","fontFamily","toolbar","minHeight","maxWidth","width","breakpoints","down","nav","display","logo","flexGrow","height","verticalAlign","offset","Header","classes","AppBar","position","Toolbar","variant","className","src","alt","data-testid","createStyles","copyrightText","textAlign","color","lineHeight","Copyright","Typography","Date","getFullYear","footer","paddingTop","paddingBottom","marginTop","backgroundColor","footerLinksContainer","justifyContent","marginBottom","footerLink","palette","primary","main","Footer","useState","uinsureUrl","setUinsureUrl","useEffect","window","location","href","indexOf","process","Container","Grid","container","item","xs","Divider","id","underline","target","_","root","flexDirection","Layout","children","textField","styleProps","showLabel","text","transform","marginRight","textTransform","borderBottom","borderBottomColor","secondary","labelRoot","MaterialTextField","field","form","touched","errors","props","get","o","path","split","reduce","key","touchedField","name","errorsField","label","TextField","fullWidth","helperText","error","Boolean","inputProps","maxLength","InputLabelProps","shrink","useDisableContinue","allowEmptyFields","useFormikContext","dirty","isValid","initialValues","isDisabled","setIsDisabled","flattened","Object","assign","_flatten","concat","keys","map","k","populatedInitialValues","values","filter","value","length","LoginForm","isLoading","noValidate","component","placeholder","type","direction","justify","alignItems","Button","disabled","CircularProgress","size","StyledButton","withStyles","LinkButton","padding","textDecoration","TwoFactorAuthForm","isWaiting2fa","resendClicked","timer","Box","px","onClick","ForgotPasswordForm","handleReturnToLoginClick","onReturnToLoginClick","mr","emailRegex","RegExp","safeAndSecureIdRegex","LoginInitial","EmailAddress","Password","Passcode","DateOfBirth","emailAddress","Yup","test","required","matches","passcode","dob","NaN","parse","LoginValidationSchema","TwoFactorAuthValidationSchema","DobAuthSchema","ForgotPasswordValidationSchema","ForgotPasswordEmailAddress","email","getQueryVariable","variable","vars","search","substring","i","pair","decodeURIComponent","useAuthentication","loginModel","results","setResults","loading","setLoading","setError","source","axios","CancelToken","a","returnUrl","body","JSON","stringify","username","password","dateofbirth","post","cancelToken","token","headers","response","status","data","message","fetchData","cancel","useResendPasscode","regenPasscodeRequest","regenLoading","setRegenLoading","regenError","setRegenError","regenResults","setRegenResults","sendRegenPasscodeRequest","modal","top","left","outline","paper","MaterialModal","open","onClose","disableBackdropClick","disableEscapeKeyDown","aria-labelledby","closeAfterTransition","BackdropComponent","Backdrop","BackdropProps","timeout","Fade","in","Paper","modalContent","centerContent","maxHeight","overflowY","overflowX","ModalContent","testId","modalHeader","closeButtonContainer","cursor","paddingLeft","content","centerTitle","ModalHeader","showClose","DirectLoginType","Modal","title","_520","style","baseFunctionsStagingUrl","REACT_APP_FUNCTION_BASE_STAGING_URL","useForgotPassword","isForgotPasswordRequest","onRequestFinished","result","setResult","undefined","isStaging","url","console","log","postPasswordReset","TextMaskCustom","inputRef","mask","other","maskPattern","Error","getMask","inputMask","ref","inputElement","guide","showMask","dateInputStyles","MaterialDateInput","rest","FormControl","clsx","visibleLabel","InputLabel","htmlFor","Input","inputComponent","FormHelperText","CustomerPortalLoginForm","useCustomerPortal","payload","postcode","firstName","avatar","light","header","twoFaCopy","loginForm","invalidLogin","SetPasswordErrorCode","Login","displayError","setDisplayError","None","directLogin","setDirectLogin","submitLoginModel","setSubmitLoginModel","regenPasscode","setRegenPasscode","is2FA","setIS2FA","obfuscatedPhone","setObfuscatedPhone","isForgotPasswordOpen","setForgotPasswordOpen","setForgotPasswordRequest","forgotPasswordEmailAddress","setForgotPasswordEmailAddress","isForgotPasswordRequestFinished","setForgotPasswordRequestFinished","query","queryParams","URLSearchParams","unescape","hasReturnUrl","toLowerCase","postcodeResult","errorPostcode","forgotPasswordResult","isForgotPasswordLoading","forgotPasswordError","Standard","Portal","isOk","redirectUrl","is2Fa","start2faTimer","obfuscatedPhoneNumber","handleSubmit","handleResend","handleForgotPasswordClose","setTimeout","hasChangedValues","setWaiting2fa","timer2fa","setTimer2fa","interval","setInterval","clearInterval","mb","Avatar","validationSchema","onSubmit","pb","disableRipple","PhoneNumber","changed","dateOfBirthHasChanged","_560","mt","mx","useAxios","config","updateData","json","iframe","Logout","logoutIdQuery","withCredentials","postLogoutRedirectUri","signOutIFrameUrl","SetPasswordModelInitial","RetypedPassword","Code","NewPasswordModelSchema","min","oneOf","SetPasswordForm","isResetting","buttonText","SetPassword","resetting","ErrorCode","errorCode","setErrorCode","timeoutError","setTimeoutError","errorText","setErrorText","success","setSuccess","redirect","setRedirect","code","validateStatus","timeoutCheckResponse","hasTimedOut","to","setPassword","TimedOut","Exception","headerCopy","errorCopy","successCopy","toLocaleLowerCase","AlreadyUsed","ShouldShowErrorToUser","App","exact","render","hostname","match","createMuiTheme","MuiTextField","overrides","MuiAppBar","colorPrimary","MuiPaper","rounded","borderRadius","elevation4","boxShadow","MuiButton","outlined","borderColor","border","borderWidth","outlinedPrimary","contained","containedPrimary","containedSecondary","MuiInputBase","input","MuiInputLabel","MuiInput","formControl","borderBottomWidth","MuiFormHelperText","MuiFormLabel","MuiTypography","h1","h2","h3","body1","typography","join","red","A400","background","default","shape","sm","md","lg","xl","baseUrl","document","getElementsByTagName","getAttribute","ReactDOM","StrictMode","ThemeProvider","CssBaseline","basename","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch"],"mappings":"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","file":"static/js/main.3b6a7a98.chunk.js","sourcesContent":["import { Typography } from '@material-ui/core';\r\nimport React from 'react';\r\nimport MaterialModal from './MaterialModal';\r\nimport ModalContent from './ModalContent';\r\nimport ModalHeader from './ModalHeader';\r\n\r\ninterface ModalProps {\r\n open: boolean;\r\n showClose?: boolean;\r\n onClose: () => void;\r\n title?: string;\r\n testId?: string;\r\n children: JSX.Element | string;\r\n centerContent?: boolean;\r\n width?: ModalWidth;\r\n centerTitle?: boolean;\r\n disableBackdropClick?: boolean;\r\n disableEscapeKeyDown?: boolean;\r\n}\r\n\r\nexport enum ModalWidth {\r\n _460 = '460px',\r\n _520 = '520px',\r\n _560 = '560px',\r\n _800 = '800px',\r\n _1040 = '1040px',\r\n _1260 = '1260px',\r\n}\r\n\r\nconst Modal = ({\r\n open,\r\n showClose = true,\r\n onClose,\r\n title,\r\n children,\r\n centerContent = false,\r\n width = ModalWidth._520,\r\n centerTitle = false,\r\n disableBackdropClick = false,\r\n disableEscapeKeyDown = false,\r\n}: ModalProps) => {\r\n return (\r\n \r\n <>\r\n {title && (\r\n \r\n \r\n {title}\r\n \r\n \r\n )}\r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import { AppBar, makeStyles, Toolbar } from '@material-ui/core';\r\nimport React from 'react';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n link: {\r\n margin: theme.spacing(1, 2),\r\n fontSize: '0.8125rem',\r\n fontFamily: 'Spartan MB SemiBold',\r\n },\r\n toolbar: {\r\n minHeight: 104,\r\n margin: 'auto',\r\n maxWidth: '1060px',\r\n width: '100%',\r\n [theme.breakpoints.down(theme.breakpoints.width('md'))]: {\r\n minHeight: '88px',\r\n },\r\n },\r\n nav: {\r\n display: 'flex',\r\n },\r\n logo: {\r\n flexGrow: 1,\r\n '& img': {\r\n width: 130,\r\n height: 45,\r\n verticalAlign: 'middle',\r\n },\r\n },\r\n offset: {\r\n minHeight: 104,\r\n [theme.breakpoints.down(theme.breakpoints.width('md'))]: {\r\n minHeight: '88px',\r\n },\r\n },\r\n}));\r\n\r\nconst Header = () => {\r\n const classes = useStyles();\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Header;\r\n","import Typography from '@material-ui/core/Typography';\r\nimport React from 'react';\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n copyrightText: {\r\n fontFamily: 'Spartan MB',\r\n fontSize: '0.6875rem',\r\n textAlign: 'center',\r\n color: '#666666',\r\n lineHeight: '1.7',\r\n [theme.breakpoints.down('sm')]: {\r\n textAlign: 'left',\r\n },\r\n },\r\n }),\r\n);\r\n\r\nconst Copyright = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n \r\n {'Copyright © '}\r\n {new Date().getFullYear()} Uinsure Ltd.\r\n \r\n \r\n Registered in England and Wales No. 06046870\r\n \r\n \r\n Uinsure Limited is Authorised and Regulated by the Financial Conduct Authority No.\r\n 463689\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Copyright;\r\n","import { Container, Divider, Grid, makeStyles } from '@material-ui/core';\r\nimport MuiLink from '@material-ui/core/Link';\r\nimport React, { useEffect, useState } from 'react';\r\nimport Copyright from './Copyright';\r\n\r\nconst brokerAppUrl = process.env.REACT_APP_BROKER_APP_URL || 'http://localhost:8000';\r\nconst brokerAppStagingUrl = process.env.REACT_APP_BROKER_APP_STAGING_URL || 'https://quotes.test.uinsure.co.uk';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n footer: {\r\n paddingTop: '2rem',\r\n paddingBottom: '4rem',\r\n marginTop: 'auto',\r\n backgroundColor: theme.footer.backgroundColor,\r\n textAlign: 'center',\r\n '& nav a': {\r\n margin: theme.spacing(1.5, 2.25),\r\n display: 'inline-block',\r\n },\r\n },\r\n footerLinksContainer: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'grid',\r\n marginBottom: '35px',\r\n marginTop: '40px',\r\n },\r\n },\r\n footerLink: {\r\n fontFamily: 'Spartan MB SemiBold',\r\n fontSize: '0.75rem',\r\n textAlign: 'center',\r\n color: theme.palette.primary.main,\r\n [theme.breakpoints.down('sm')]: {\r\n margin: '7px 18px',\r\n },\r\n },\r\n}));\r\n\r\nconst Footer = () => {\r\n const classes = useStyles();\r\n const [uinsureUrl, setUinsureUrl] = useState('');\r\n\r\n\r\n useEffect(() => {\r\n if (window.location.href.indexOf(\"idp.test\") > 0) {\r\n setUinsureUrl(brokerAppStagingUrl);\r\n } else {\r\n setUinsureUrl(brokerAppUrl);\r\n }\r\n }, []);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Footer;\r\n","import React from 'react';\r\nimport Header from './Header';\r\nimport Footer from './Footer';\r\nimport { makeStyles, Container } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles(_ => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minHeight: '100vh',\r\n },\r\n}));\r\n\r\ninterface Props {\r\n children: JSX.Element | JSX.Element[];\r\n}\r\n\r\nexport const Layout = ({ children }: Props) => {\r\n const classes = useStyles();\r\n return (\r\n
\r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { createStyles, makeStyles, TextField, Theme } from '@material-ui/core';\r\nimport { FieldProps } from 'formik';\r\nimport React from 'react';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n textField: (styleProps: any) => ({\r\n margin: styleProps.showLabel ? theme.spacing(2.5, 0) : theme.spacing(0, 0, 2.5),\r\n '& label.MuiFormLabel-root': {\r\n color: theme.palette.text.primary,\r\n fontFamily: 'Spartan MB SemiBold',\r\n fontSize: '1rem',\r\n transform: 'scale(1)',\r\n lineHeight: '1.25rem',\r\n marginTop: '0rem',\r\n marginRight: '48px',\r\n position: 'relative',\r\n },\r\n '& .MuiInput-formControl': {\r\n marginTop: '0px',\r\n },\r\n '& .MuiInput-input': {\r\n fontFamily: 'Spartan MB ',\r\n fontSize: '0.875rem',\r\n paddingBottom: 10,\r\n paddingTop: 12,\r\n textTransform: styleProps.textTransform || 'none',\r\n },\r\n '& .MuiInput-underline:before': {\r\n borderBottom: '2px solid #e5e5e5',\r\n },\r\n '& .MuiInput-underline': {\r\n '&:after, &:hover:before': {\r\n borderBottomColor: theme.palette.secondary.main,\r\n },\r\n },\r\n '&::placeholder': {\r\n fontSize: '0.875rem',\r\n },\r\n }),\r\n labelRoot: {\r\n color: theme.palette.text.primary,\r\n },\r\n }),\r\n);\r\n\r\ninterface InputProps {\r\n textTransform: 'none' | 'uppercase' | 'capitalize';\r\n}\r\n\r\nconst MaterialTextField =

({\r\n textTransform = 'none',\r\n field,\r\n form: { touched, errors },\r\n ...props\r\n}: FieldProps

& InputProps) => {\r\n const get = (o: any, path: string) =>\r\n path.split('.').reduce((o: any = {}, key: string) => o[key], o);\r\n\r\n const touchedField = get(touched, field.name);\r\n const errorsField = get(errors, field.name);\r\n const showLabel = !!({ ...props } as any).label;\r\n\r\n const classes = useStyles({ showLabel, textTransform });\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default MaterialTextField;\r\n","import { useFormikContext } from 'formik';\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst useDisableContinue = (allowEmptyFields: boolean = false) => {\r\n const { dirty, isValid, errors, initialValues } = useFormikContext();\r\n const [isDisabled, setIsDisabled] = useState(true);\r\n\r\n useEffect(() => {\r\n const flattened = Object.assign(\r\n {},\r\n ...(function _flatten(o: any): any {\r\n return [].concat(\r\n ...Object.keys(o).map(k =>\r\n typeof o[k] === 'object' ? _flatten(o[k]) : { [k]: o[k] },\r\n ),\r\n );\r\n })(initialValues),\r\n );\r\n\r\n // If any the initial values are populated, then the form must have been submitted succesfully\r\n // at some point, and therefore must contain valid values.\r\n const populatedInitialValues = Object.values(flattened as any).filter((value: any) => {\r\n return value && value.length > 0 ? true : false;\r\n });\r\n\r\n if (\r\n (dirty || populatedInitialValues.length > 0 || allowEmptyFields) &&\r\n isValid &&\r\n Object.values(errors).length === 0\r\n ) {\r\n setIsDisabled(false);\r\n } else {\r\n setIsDisabled(true);\r\n }\r\n }, [dirty, isValid, errors]);\r\n\r\n return { isDisabled };\r\n};\r\n\r\nexport default useDisableContinue;\r\n","import { Button, CircularProgress, Grid } from '@material-ui/core';\r\nimport { Field, Form } from 'formik';\r\nimport React from 'react';\r\nimport MaterialTextField from '../MaterialTextField';\r\nimport useDisableContinue from '../../hooks/useDisableContinue';\r\n\r\ninterface Props {\r\n isLoading: boolean;\r\n}\r\n\r\nconst LoginForm = ({ isLoading }: Props) => {\r\n const { isDisabled } = useDisableContinue();\r\n\r\n return (\r\n

\r\n \r\n \r\n \r\n \r\n \r\n <>Sign in  {isLoading && }\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LoginForm;\r\n","import { withStyles, Button, Theme } from '@material-ui/core';\r\n\r\nconst StyledButton = withStyles({\r\n root: {\r\n fontFamily: 'Spartan MB Semibold',\r\n fontSize: '0.8125rem',\r\n },\r\n})(Button);\r\n\r\nexport const LinkButton = withStyles((theme: Theme) => ({\r\n root: {\r\n color: theme.palette.primary.main,\r\n fontFamily: 'Spartan MB Semibold',\r\n fontSize: '0.8125rem',\r\n padding: 0,\r\n '&:focus, &:hover': {\r\n textDecoration: 'underline',\r\n backgroundColor: '#ffffff00',\r\n },\r\n },\r\n}))(Button);\r\n\r\nexport default StyledButton;\r\n","import { Box, Button, CircularProgress, Grid } from '@material-ui/core';\r\nimport { Field, Form } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport useDisableContinue from '../../hooks/useDisableContinue';\r\nimport MaterialTextField from '../MaterialTextField';\r\nimport { LinkButton } from '../StyledButton';\r\n\r\ninterface Props {\r\n isLoading: boolean;\r\n isWaiting2fa: boolean;\r\n timer: number;\r\n resendClicked: () => void;\r\n}\r\n\r\nconst TwoFactorAuthForm = ({ isLoading, isWaiting2fa, resendClicked, timer }: Props) => {\r\n const { isDisabled } = useDisableContinue();\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n <>Submit  {isLoading && }\r\n \r\n \r\n \r\n \r\n \r\n {`Not received a code? Click to resend ${timer > 0 ? `(${timer})` : ''}`}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default TwoFactorAuthForm;\r\n","import { Box, CircularProgress, Grid } from '@material-ui/core';\r\nimport { Field, Form } from 'formik';\r\nimport React from 'react';\r\nimport useDisableContinue from '../../hooks/useDisableContinue';\r\nimport MaterialTextField from '../MaterialTextField';\r\nimport StyledButton from '../StyledButton';\r\n\r\ninterface Props {\r\n isLoading: boolean;\r\n onReturnToLoginClick: () => void;\r\n}\r\n\r\nconst ForgotPasswordForm = ({\r\n isLoading,\r\n onReturnToLoginClick: handleReturnToLoginClick,\r\n}: Props) => {\r\n const { isDisabled } = useDisableContinue();\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n <>\r\n Send verification email  \r\n {isLoading && }\r\n \r\n \r\n \r\n \r\n \r\n \r\n Return to login page\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ForgotPasswordForm;\r\n","import * as Yup from 'yup';\r\nconst emailRegex = new RegExp(/^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]+)$/, 'i');\r\nconst safeAndSecureIdRegex = new RegExp(/^\\d+$/);\r\n\r\nexport interface LoginModel {\r\n EmailAddress: string;\r\n Password: string;\r\n Passcode?: string;\r\n DateOfBirth?: string;\r\n}\r\n\r\nexport const LoginInitial: LoginModel = {\r\n EmailAddress: '',\r\n Password: '',\r\n Passcode: '',\r\n DateOfBirth: '',\r\n};\r\n\r\nconst emailAddress = Yup.lazy((value: string) => {\r\n if (safeAndSecureIdRegex.test(value)) {\r\n return Yup.string().required().length(6, 'Please enter a valid email address');\r\n } else {\r\n return Yup.string().matches(emailRegex, 'Please enter a valid email address').required('Email address is required');\r\n }\r\n});\r\n\r\nconst passcode = Yup.lazy(() => {\r\n return Yup.string().required().length(6, 'Passcode must be 6 digits');\r\n});\r\n\r\nconst dob = Yup.lazy(() => {\r\n return Yup.string()\r\n .required('Date of birth is required')\r\n .test('test-minimum-age', 'Must be a valid date', (value) => {\r\n const dob = Date.parse(value);\r\n return dob !== NaN;\r\n });\r\n});\r\n\r\nexport const LoginValidationSchema = Yup.object({\r\n EmailAddress: emailAddress,\r\n Password: Yup.string().required('Password is required'),\r\n});\r\n\r\nexport const TwoFactorAuthValidationSchema = Yup.object({\r\n Passcode: passcode,\r\n});\r\n\r\nexport const DobAuthSchema = Yup.object({\r\n DateOfBirth: dob,\r\n});\r\n\r\nexport const ForgotPasswordValidationSchema = Yup.object({\r\n ForgotPasswordEmailAddress: Yup.string()\r\n .email('Please enter a valid email address')\r\n .required('Email address is required'),\r\n});\r\n","const getQueryVariable = (variable: string) => {\r\n const query = window.location.search.substring(1);\r\n const vars = query.split('&');\r\n for (let i = 0; i < vars.length; i++) {\r\n let pair = vars[i].split('=');\r\n if (decodeURIComponent(pair[0]) == variable) {\r\n return decodeURIComponent(pair[1]);\r\n }\r\n }\r\n};\r\n\r\nexport { getQueryVariable };\r\n","import axios from 'axios';\r\nimport { useEffect, useState } from 'react';\r\nimport { LoginModel } from '../components/forms/LoginModel';\r\nimport { getQueryVariable } from '../components/utils';\r\n\r\ninterface AuthenticationResponse {\r\n isOk: boolean;\r\n is2Fa: boolean;\r\n obfuscatedPhoneNumber: string;\r\n redirectUrl: string;\r\n}\r\n\r\nconst useAuthentication = (loginModel: LoginModel) => {\r\n const [results, setResults] = useState();\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n const cancelToken = axios.CancelToken;\r\n const source = cancelToken.source();\r\n\r\n useEffect(() => {\r\n async function fetchData(values: LoginModel) {\r\n try {\r\n const returnUrl = getQueryVariable('ReturnUrl');\r\n setLoading(true);\r\n setError(false);\r\n\r\n const url = 'api/authenticate';\r\n\r\n const body = JSON.stringify({\r\n username: values.EmailAddress,\r\n password: values.Password,\r\n passcode: values.Passcode,\r\n dateofbirth: values.DateOfBirth,\r\n returnUrl,\r\n });\r\n\r\n const response = await axios.post(url, body, {\r\n cancelToken: source.token,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (response.status == 200) {\r\n setResults(response.data);\r\n setLoading(false);\r\n } else {\r\n setResults(response.data);\r\n setLoading(false);\r\n setError(true);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (error.message != 'Operation canceled by the user.') {\r\n setLoading(false);\r\n }\r\n setError(true);\r\n }\r\n }\r\n\r\n if (loginModel.EmailAddress !== '' && loginModel.Password !== '') {\r\n fetchData(loginModel);\r\n }\r\n\r\n return function cleanup() {\r\n source.cancel('Operation canceled by the user.');\r\n setLoading(false);\r\n };\r\n }, [loginModel]);\r\n\r\n return { results, loading, error };\r\n};\r\n\r\nexport default useAuthentication;\r\n","import axios from 'axios';\r\nimport { useEffect, useState } from 'react';\r\nimport { LoginModel } from '../components/forms/LoginModel';\r\nimport { TwoFactorAuthResultEnum } from '../components/enums';\r\nimport { getQueryVariable } from '../components/utils'\r\n\r\ninterface RegenPasscodeResponse {\r\n regenResult: TwoFactorAuthResultEnum;\r\n}\r\n\r\nconst useResendPasscode = (loginModel: LoginModel, regenPasscodeRequest: Boolean) => {\r\n const [regenLoading, setRegenLoading] = useState(false);\r\n const [regenError, setRegenError] = useState(false);\r\n const [regenResults, setRegenResults] = useState();\r\n const cancelToken = axios.CancelToken;\r\n const source = cancelToken.source();\r\n\r\n useEffect(() => {\r\n async function sendRegenPasscodeRequest(values: LoginModel) {\r\n try {\r\n setRegenLoading(true);\r\n\r\n const returnUrl = getQueryVariable('ReturnUrl');\r\n\r\n const url = 'api/authenticate/RegenPasscode';\r\n\r\n const body = JSON.stringify({\r\n username: values.EmailAddress,\r\n password: values.Password,\r\n returnUrl,\r\n });\r\n\r\n const response = await axios.post(url, body, {\r\n cancelToken: source.token,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (response.status == 200) {\r\n setRegenResults(response.data);\r\n setRegenLoading(false);\r\n } else {\r\n setRegenResults(response.data);\r\n setRegenLoading(false);\r\n setRegenError(true);\r\n }\r\n\r\n return response;\r\n\r\n } catch (error) {\r\n if (error.message != 'Regen Passcode operation canceled by the user.') {\r\n setRegenLoading(false);\r\n }\r\n setRegenError(true);\r\n }\r\n }\r\n\r\n if (loginModel.EmailAddress !== '' && loginModel.Password !== '') {\r\n sendRegenPasscodeRequest(loginModel);\r\n }\r\n\r\n return function cleanup() {\r\n source.cancel('Operation canceled by the user.');\r\n setRegenLoading(false);\r\n };\r\n }, [regenPasscodeRequest]);\r\n\r\n return { regenResults, regenLoading, regenError };\r\n};\r\n\r\nexport default useResendPasscode;\r\n","import { Backdrop, createStyles, Fade, makeStyles, Modal, Paper, Theme } from '@material-ui/core';\r\nimport React from 'react';\r\nimport { ModalWidth } from './Modal';\r\n\r\ninterface Props {\r\n children: JSX.Element | JSX.Element[];\r\n open: boolean;\r\n onClose?: (_: React.MouseEvent) => void;\r\n width: ModalWidth;\r\n disableBackdropClick?: boolean;\r\n disableEscapeKeyDown?: boolean;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n modal: (styleProps: any) => ({\r\n position: 'absolute',\r\n maxWidth: styleProps.width,\r\n width: '95%',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n '&:focus': {\r\n outline: 'none',\r\n },\r\n }),\r\n paper: {\r\n margin: theme.spacing(2),\r\n },\r\n })\r\n);\r\n\r\nconst MaterialModal = ({\r\n children,\r\n open,\r\n width,\r\n onClose,\r\n disableBackdropClick = false,\r\n disableEscapeKeyDown = false,\r\n}: Props) => {\r\n const classes = useStyles({ width });\r\n return (\r\n \r\n \r\n
\r\n {children}\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default MaterialModal;\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core';\r\nimport React from 'react';\r\n\r\ninterface Props {\r\n centerContent?: boolean;\r\n testId?: string;\r\n children: JSX.Element | JSX.Element[] | string;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n modalContent: (styleProps: any) => ({\r\n padding: theme.spacing(0, 2, 4, 2),\r\n textAlign: styleProps.centerContent ? 'center' : 'left',\r\n maxHeight: '70vh',\r\n overflowY: 'auto',\r\n overflowX: 'hidden',\r\n }),\r\n }),\r\n);\r\n\r\nconst ModalContent = ({ children, testId, centerContent }: Props) => {\r\n const classes = useStyles({ centerContent });\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};\r\n\r\nexport default ModalContent;\r\n","import { Box, createStyles, Grid, makeStyles, Theme } from '@material-ui/core';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport React from 'react';\r\n\r\ninterface Props {\r\n showClose?: boolean;\r\n children: JSX.Element;\r\n onClick?: (_: React.MouseEvent) => void;\r\n centerTitle?: boolean;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n modalHeader: {\r\n borderBottom: '1px solid #d3d3d3',\r\n padding: theme.spacing(2, 4),\r\n },\r\n closeButtonContainer: {\r\n cursor: 'pointer',\r\n color: '#e1e1e1',\r\n paddingLeft: theme.spacing(1),\r\n },\r\n content: (styleProps: any) => ({\r\n textAlign: styleProps.centerTitle ? 'center' : 'left',\r\n color: theme.palette.text.primary,\r\n }),\r\n })\r\n);\r\n\r\nconst ModalHeader = ({ showClose, onClick, children, centerTitle = false }: Props) => {\r\n const classes = useStyles({ centerTitle });\r\n return (\r\n
\r\n \r\n \r\n {children}\r\n \r\n {showClose && (\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ModalHeader;\r\n","import { Avatar } from '@material-ui/core';\r\nimport Container from '@material-ui/core/Container';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport MuiLink from '@material-ui/core/Link';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined';\r\nimport { Formik, FormikProps } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport LoginForm from './forms/LoginForm';\r\nimport TwoFactorAuthForm from './forms/TwoFactorAuthForm';\r\nimport ForgotPasswordForm from './forms/ForgotPasswordForm';\r\nimport {\r\n LoginModel,\r\n LoginValidationSchema,\r\n LoginInitial,\r\n TwoFactorAuthValidationSchema,\r\n ForgotPasswordValidationSchema,\r\n DobAuthSchema,\r\n} from './forms/LoginModel';\r\nimport useAuthentication from '../hooks/useAuthentication';\r\nimport useResendPasscode from '../hooks/useResendPasscode';\r\nimport { Box } from '@material-ui/core';\r\nimport Modal, { ModalWidth } from './modal/Modal';\r\nimport useForgotPassword from '../hooks/useForgotPassword';\r\nimport StyledButton, { LinkButton } from './StyledButton';\r\nimport CustomerPortalLoginForm from './forms/CustomerPortalLoginForm';\r\nimport useCustomerPortal from '../hooks/useCustomerPortal';\r\n\r\nconst brokerAppUrl = process.env.REACT_APP_BROKER_APP_URL || 'http://localhost:8000';\r\nconst brokerAppStagingUrl = process.env.REACT_APP_BROKER_APP_STAGING_URL || 'https://quotes.test.uinsure.co.uk';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n paddingBottom: theme.spacing(2),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n marginTop: theme.spacing(8),\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.light,\r\n },\r\n header: {\r\n margin: 0,\r\n },\r\n twoFaCopy: {\r\n margin: theme.spacing(1, 0),\r\n },\r\n loginForm: {\r\n paddingBottom: theme.spacing(2),\r\n },\r\n invalidLogin: {\r\n paddingBottom: theme.spacing(2),\r\n },\r\n link: {\r\n margin: theme.spacing(1, 2),\r\n fontSize: '0.8125rem',\r\n fontFamily: 'Spartan MB SemiBold',\r\n },\r\n}));\r\n\r\nenum DirectLoginType {\r\n None,\r\n Standard,\r\n Portal,\r\n}\r\n\r\nconst Login = () => {\r\n const classes = useStyles();\r\n const [displayError, setDisplayError] = useState(false);\r\n const [directLogin, setDirectLogin] = useState(DirectLoginType.None);\r\n const [submitLoginModel, setSubmitLoginModel] = useState(LoginInitial);\r\n const [regenPasscode, setRegenPasscode] = useState(false);\r\n const [is2FA, setIS2FA] = useState(false);\r\n const [obfuscatedPhone, setObfuscatedPhone] = useState('');\r\n const [isForgotPasswordOpen, setForgotPasswordOpen] = useState(false);\r\n const [isForgotPasswordRequest, setForgotPasswordRequest] = useState(false);\r\n const [forgotPasswordEmailAddress, setForgotPasswordEmailAddress] = useState('');\r\n const [isForgotPasswordRequestFinished, setForgotPasswordRequestFinished] = useState(false);\r\n\r\n const query = window.location.search;\r\n const queryParams = new URLSearchParams(unescape(window.location.search));\r\n const hasReturnUrl = query && query.toLowerCase().indexOf('?returnurl=') == 0;\r\n const { results, loading, error } = useAuthentication(submitLoginModel);\r\n const {\r\n result: postcodeResult,\r\n error: errorPostcode,\r\n } = useCustomerPortal(queryParams.get('portalcode'), submitLoginModel);\r\n const { regenResults, regenLoading, regenError } = useResendPasscode(submitLoginModel, regenPasscode);\r\n const {\r\n result: forgotPasswordResult,\r\n isLoading: isForgotPasswordLoading,\r\n error: forgotPasswordError,\r\n } = useForgotPassword(forgotPasswordEmailAddress, isForgotPasswordRequest, () => {\r\n setForgotPasswordRequestFinished(true);\r\n });\r\n\r\n if (query.indexOf('payload') > 0) {\r\n if (directLogin === DirectLoginType.None) {\r\n setDirectLogin(DirectLoginType.Standard);\r\n setSubmitLoginModel({ EmailAddress: 'directlogin', Password: 'directlogin' });\r\n }\r\n }\r\n\r\n if (query.indexOf('portalcode') > 0) {\r\n if (directLogin === DirectLoginType.None) {\r\n setDirectLogin(DirectLoginType.Portal);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (results) {\r\n if (results.isOk && results.redirectUrl) window.location.href = results.redirectUrl;\r\n else if (results.is2Fa) {\r\n setIS2FA(true);\r\n start2faTimer();\r\n setObfuscatedPhone(results.obfuscatedPhoneNumber);\r\n }\r\n }\r\n }, [results]);\r\n\r\n useEffect(() => {\r\n if (!hasReturnUrl) {\r\n if (window.location.href.indexOf('idp.test') > 0) {\r\n window.location.href = brokerAppStagingUrl;\r\n } else {\r\n window.location.href = brokerAppUrl;\r\n }\r\n }\r\n }, []);\r\n\r\n const handleSubmit = (values: LoginModel) => {\r\n setSubmitLoginModel(values);\r\n };\r\n\r\n const handleForgotPasswordSubmit = (emailAddress: string) => {\r\n setForgotPasswordEmailAddress(emailAddress);\r\n setForgotPasswordRequest(true);\r\n };\r\n\r\n const handleResend = () => {\r\n setRegenPasscode(!regenPasscode);\r\n start2faTimer();\r\n };\r\n\r\n const handleForgotPasswordClose = () => {\r\n if (!isForgotPasswordLoading) {\r\n setForgotPasswordOpen(false);\r\n setTimeout(() => {\r\n setForgotPasswordRequest(false);\r\n setForgotPasswordRequestFinished(false);\r\n }, 100);\r\n }\r\n };\r\n\r\n const handleForgotPasswordClick = () => {\r\n setForgotPasswordEmailAddress('');\r\n setForgotPasswordOpen(true);\r\n };\r\n\r\n const hasChangedValues = (values: LoginModel) => {\r\n if (submitLoginModel.EmailAddress !== values.EmailAddress ||\r\n submitLoginModel.Password !== values.Password) {\r\n setDisplayError(false);\r\n return false;\r\n }\r\n return false;\r\n };\r\n\r\n const dateOfBirthHasChanged = (values: LoginModel) => {\r\n const changed = values.DateOfBirth !== submitLoginModel.DateOfBirth;\r\n if (changed) {\r\n setDisplayError(false)\r\n }\r\n return changed;\r\n }\r\n\r\n useEffect(() => {\r\n if (error || errorPostcode) {\r\n setDisplayError(true);\r\n }\r\n }, [error, errorPostcode]);\r\n\r\n const [isWaiting2fa, setWaiting2fa] = useState(false);\r\n const [timer2fa, setTimer2fa] = useState(0);\r\n\r\n useEffect(() => {\r\n let interval: any = null;\r\n if (isWaiting2fa) {\r\n interval = setInterval(() => {\r\n setTimer2fa((timer2fa) => timer2fa - 1);\r\n }, 1000);\r\n } else {\r\n if (interval != null) {\r\n clearInterval(interval);\r\n }\r\n }\r\n\r\n if (timer2fa <= 0) {\r\n setWaiting2fa(false);\r\n setTimer2fa(0);\r\n }\r\n\r\n return () => clearInterval(interval);\r\n }, [isWaiting2fa, timer2fa]);\r\n\r\n const start2faTimer = () => {\r\n setTimer2fa(10);\r\n setWaiting2fa(true);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {hasReturnUrl && (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n Login\r\n \r\n {directLogin === DirectLoginType.None && !is2FA && (\r\n <>\r\n {\r\n handleSubmit(values);\r\n }}\r\n >\r\n {({ values }: FormikProps) => (\r\n <>\r\n \r\n \r\n \r\n {displayError && !hasChangedValues(values) && (\r\n \r\n \r\n \r\n Invalid login credentials\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n Forgot password?\r\n \r\n \r\n \r\n \r\n Don't have an account? Sign Up\r\n \r\n \r\n \r\n \r\n )}\r\n {directLogin === DirectLoginType.None && is2FA && (\r\n <>\r\n \r\n You will shortly receive a 6 digit passcode by SMS to the telephone number below.\r\n \r\n \r\n If you dont receive a code within 60 seconds request another code below. If you have any issues\r\n please contact 0344 844 3844.\r\n \r\n {\r\n handleSubmit(values);\r\n }}\r\n >\r\n {({ values }: FormikProps) => (\r\n <>\r\n \r\n \r\n \r\n {displayError && !hasChangedValues(values) && (\r\n \r\n \r\n \r\n Passcode incorrect\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n )}\r\n {directLogin === DirectLoginType.Portal && (\r\n <>\r\n \r\n Access your renewal documents online.\r\n \r\n \r\n Welcome back {postcodeResult?.firstName}, we just need a few details to retrieve your renewal for{' '}\r\n {postcodeResult.postcode}\r\n \r\n {\r\n handleSubmit({ ...values, EmailAddress: 'portallogin', Password: 'portallogin' });\r\n }}\r\n >\r\n {({ values }: FormikProps) => (\r\n <>\r\n \r\n \r\n \r\n {displayError && !dateOfBirthHasChanged(values) && (\r\n \r\n \r\n \r\n Date of birth is incorrect\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n )}\r\n
\r\n
\r\n )}\r\n
\r\n \r\n {isForgotPasswordRequestFinished ? (\r\n forgotPasswordResult && !forgotPasswordError ? (\r\n <>\r\n \r\n \r\n If your email address is linked to an account you will shortly receive an email with a link to reset\r\n your password.\r\n \r\n \r\n \r\n \r\n Return to login page\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n \r\n \r\n Unable to submit request. Call us on 0344 844 3844 if you require further assistance.\r\n \r\n \r\n \r\n \r\n Return to login page\r\n \r\n \r\n \r\n )\r\n ) : (\r\n <>\r\n \r\n \r\n To reset your password please enter your email address below.\r\n \r\n \r\n You should receive an email within the next 10 minutes.\r\n \r\n {\r\n handleForgotPasswordSubmit(values.ForgotPasswordEmailAddress);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Login;\r\n","import axios from 'axios';\r\nimport { useEffect, useState } from 'react';\r\n\r\ninterface ForgotPasswordResponse {\r\n Success: boolean;\r\n}\r\n\r\nconst baseFunctionsUrl = process.env.REACT_APP_FUNCTION_BASE_URL || 'http://localhost:7071';\r\nconst baseFunctionsStagingUrl =\r\n process.env.REACT_APP_FUNCTION_BASE_STAGING_URL ||\r\n 'https://uinsureapifunctionsqa.azurewebsites.net';\r\n\r\nconst useForgotPassword = (\r\n emailAddress: string,\r\n isForgotPasswordRequest: boolean,\r\n onRequestFinished: Function,\r\n) => {\r\n const [isLoading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n const [result, setResult] = useState();\r\n const cancelToken = axios.CancelToken;\r\n const source = cancelToken.source();\r\n\r\n useEffect(() => {\r\n async function postPasswordReset(emailAddress: string) {\r\n try {\r\n setResult(undefined);\r\n setError(false);\r\n setLoading(true);\r\n\r\n const isStaging = window.location.href.indexOf('idp.test') > 0;\r\n const url = `${\r\n isStaging ? baseFunctionsStagingUrl : baseFunctionsUrl\r\n }/api/forgotpassword`;\r\n\r\n const body = JSON.stringify({\r\n EmailAddress: emailAddress,\r\n });\r\n\r\n const response = await axios.post(url, body, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n cancelToken: source.token,\r\n });\r\n\r\n if (response.status === 200) {\r\n setResult(response.data);\r\n setLoading(false);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (error.message !== 'Operation canceled by the user.') {\r\n setLoading(false);\r\n }\r\n setError(true);\r\n console.log(error);\r\n } finally {\r\n onRequestFinished();\r\n }\r\n }\r\n\r\n if (emailAddress && isForgotPasswordRequest) {\r\n postPasswordReset(emailAddress);\r\n }\r\n\r\n return function cleanup() {\r\n source.cancel('Operation canceled by the user.');\r\n setLoading(false);\r\n };\r\n }, [isForgotPasswordRequest, emailAddress]);\r\n\r\n return { result, isLoading, error };\r\n};\r\n\r\nexport default useForgotPassword;\r\n","import {\r\n createStyles,\r\n FormControl,\r\n FormHelperText,\r\n Input,\r\n InputLabel,\r\n makeStyles,\r\n Theme,\r\n withStyles,\r\n WithStyles,\r\n} from '@material-ui/core';\r\nimport { FieldProps } from 'formik';\r\nimport React from 'react';\r\nimport MaskedInput from 'react-text-mask';\r\nimport clsx from 'clsx';\r\n\r\nconst get = (o: any, path: string) => path.split('.').reduce((o: any = {}, key: string) => o[key], o);\r\n\r\nexport type Mask = string | RegExp;\r\nexport type DateMask = 'yyyy' | 'dd / mm / yyyy';\r\n\r\ninterface MaskAndPlaceHolder {\r\n mask: Mask[];\r\n placeholder: string;\r\n}\r\nconst getMask = (mask?: DateMask): MaskAndPlaceHolder => {\r\n const maskPattern = mask || 'dd / mm / yyyy';\r\n if (maskPattern === 'dd / mm / yyyy') {\r\n return {\r\n mask: [/\\d/, /\\d/, ' ', '/', ' ', /\\d/, /\\d/, ' ', '/', ' ', /\\d/, /\\d/, /\\d/, /\\d/],\r\n placeholder: 'dd / mm / yyyy',\r\n };\r\n } else if (maskPattern === 'yyyy') {\r\n return {\r\n mask: [/\\d/, /\\d/, /\\d/, /\\d/],\r\n placeholder: 'yyyy',\r\n };\r\n }\r\n\r\n throw new Error('Masking pattern not identified');\r\n};\r\n\r\ninterface TextMaskCustomProps {\r\n inputRef: (ref: HTMLInputElement | null) => void;\r\n mask?: DateMask;\r\n}\r\n\r\nconst TextMaskCustom = (props: TextMaskCustomProps) => {\r\n const { inputRef, mask, ...other } = props;\r\n const { mask: inputMask, placeholder } = getMask(mask);\r\n return (\r\n {\r\n inputRef(ref ? ref.inputElement : null);\r\n }}\r\n mask={inputMask}\r\n guide={false}\r\n showMask\r\n placeholder={placeholder}\r\n />\r\n );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => dateInputStyles(theme));\r\n\r\nconst dateInputStyles = (theme: Theme) =>\r\n createStyles({\r\n textField: (styleProps: any) => ({\r\n margin: styleProps.showLabel ? theme.spacing(2.5, 0) : theme.spacing(0, 0, 2.5),\r\n '& label.MuiFormLabel-root': {\r\n color: theme.palette.text.primary,\r\n fontFamily: 'Spartan MB SemiBold',\r\n fontSize: '1rem',\r\n transform: 'scale(1)',\r\n lineHeight: '1.25rem',\r\n marginTop: '0rem',\r\n marginRight: '48px',\r\n position: 'relative',\r\n },\r\n '& .MuiInput-formControl': {\r\n marginTop: '0px',\r\n },\r\n '& .MuiInput-input': {\r\n fontFamily: 'Spartan MB ',\r\n fontSize: '1rem',\r\n paddingBottom: 10,\r\n paddingTop: 12,\r\n },\r\n '& .MuiInput-underline:before': {\r\n borderBottom: '2px solid #e5e5e5',\r\n },\r\n '& .MuiInput-underline': {\r\n '&:after, &:hover:before': {\r\n borderBottomColor: theme.palette.secondary.main,\r\n },\r\n },\r\n '&::placeholder': {\r\n fontSize: '1rem',\r\n },\r\n }),\r\n labelRoot: {\r\n color: theme.palette.text.primary,\r\n },\r\n });\r\n\r\ninterface Props {\r\n label: string;\r\n mask?: Mask[];\r\n placeholder?: string;\r\n}\r\n\r\nconst MaterialDateInput =

({\r\n field,\r\n form: { touched, errors },\r\n mask,\r\n placeholder,\r\n ...props\r\n}: FieldProps

& Props & WithStyles) => {\r\n const touchedField = get(touched, field.name);\r\n const errorsField = get(errors, field.name);\r\n const showLabel = !!props.label;\r\n const inputProps = (props as any).inputProps || {};\r\n\r\n const rest: any = { ...props };\r\n const testId = inputProps['data-testid'];\r\n rest['data-testid'] = `${rest['data-testid']}-inner`;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {props.label && (\r\n \r\n {props.label}\r\n \r\n )}\r\n \r\n {touchedField && errorsField && (\r\n \r\n {errorsField}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst FormDrawerDateInput = withStyles((theme: Theme) => ({\r\n ...dateInputStyles(theme),\r\n textField: {\r\n margin: '10px 0',\r\n '& label.MuiFormLabel-root': {\r\n fontSize: '0.75rem',\r\n color: '#291B44',\r\n fontFamily: 'Spartan MB Bold',\r\n },\r\n },\r\n labelRoot: {\r\n fontSize: '0.75rem',\r\n color: '#291b44',\r\n fontFamily: 'Spartan MB Bold',\r\n },\r\n}))(MaterialDateInput);\r\n\r\nexport default MaterialDateInput;\r\nexport { FormDrawerDateInput };\r\n","import { Box, Button, CircularProgress, Grid } from '@material-ui/core';\r\nimport { Field, Form } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport useDisableContinue from '../../hooks/useDisableContinue';\r\nimport MaterialDateInput from '../MaterialDatePicker';\r\n\r\ninterface Props {\r\n isLoading: boolean;\r\n}\r\n\r\nconst CustomerPortalLoginForm = ({ isLoading }: Props) => {\r\n const { isDisabled } = useDisableContinue();\r\n\r\n return (\r\n

\r\n \r\n \r\n \r\n \r\n <>Sign in  {isLoading && }\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CustomerPortalLoginForm;\r\n","import axios from 'axios';\r\nimport { useEffect, useState } from 'react';\r\nimport {LoginModel} from \"../components/forms/LoginModel\";\r\n\r\nconst useCustomerPortal = (payload: string | null, loginModel: LoginModel) => {\r\n const [result, setResult] = useState({\r\n postcode: '',\r\n firstName: '',\r\n });\r\n const [error, setError] = useState(false);\r\n\r\n const cancelToken = axios.CancelToken;\r\n const source = cancelToken.source();\r\n\r\n useEffect(() => {\r\n async function fetchData(payload: string) {\r\n try {\r\n const url = 'api/customerportal/postcode';\r\n const body = JSON.stringify({\r\n payload: payload,\r\n });\r\n\r\n const response = await axios.post(url, body, {\r\n cancelToken: source.token,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (response.status === 200) {\r\n if (response.data === null) {\r\n setError(true);\r\n } else {\r\n setResult(response.data);\r\n }\r\n } else {\r\n setError(true);\r\n }\r\n } catch (error) {\r\n if (error.message !== 'Operation canceled by the user.') {\r\n }\r\n setError(true);\r\n }\r\n }\r\n\r\n if (payload !== '' && payload !== null) {\r\n fetchData(payload);\r\n }\r\n\r\n return function cleanup() {\r\n source.cancel('Operation canceled by the user.');\r\n };\r\n }, [payload, loginModel]);\r\n\r\n return { result, error };\r\n};\r\n\r\nexport default useCustomerPortal;\r\n","import * as Yup from 'yup';\r\n\r\nexport interface SetPasswordModel {\r\n Password: string;\r\n RetypedPassword: string;\r\n Code: string;\r\n}\r\n\r\nexport const SetPasswordModelInitial: SetPasswordModel = {\r\n Password: '',\r\n RetypedPassword: '',\r\n Code: '',\r\n};\r\n\r\nexport interface ErrorResponse {\r\n errorCode: SetPasswordErrorCode;\r\n message: string;\r\n}\r\n\r\nexport interface TimeoutCheckResponse {\r\n hasTimedOut: boolean;\r\n message: string;\r\n}\r\n\r\nexport enum SetPasswordErrorCode {\r\n None = 0,\r\n TimedOut = 10,\r\n AlreadyUsed = 20,\r\n InputSquaredError = 30,\r\n Exception = 40,\r\n}\r\n\r\nexport const NewPasswordModelSchema = Yup.object({\r\n Password: Yup.string()\r\n .required('Password is required')\r\n .min(8, 'Password is too short - should be 8 chars minimum.')\r\n .matches(/([A-Z])+/g, 'Must contain at least 1 capital')\r\n .matches(/([a-zA-Z])+/g, 'Must have a mixture of letters and numbers')\r\n .matches(/([0-9])+/g, 'Must have a mixture of letters and numbers'),\r\n RetypedPassword: Yup.string()\r\n .required('Please confirm your password')\r\n .oneOf([Yup.ref('Password'), null], 'Passwords must match'),\r\n});\r\n","import { Avatar, Box, Button } from '@material-ui/core';\r\nimport Container from '@material-ui/core/Container';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\r\nimport React from 'react';\r\n\r\nconst brokerAppUrl = process.env.REACT_APP_BROKER_APP_URL || 'http://localhost:8000';\r\nconst brokerAppStagingUrl =\r\n process.env.REACT_APP_BROKER_APP_STAGING_URL || 'https://quotes.test.uinsure.co.uk';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n paddingBottom: theme.spacing(2),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n marginTop: theme.spacing(8),\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.light,\r\n },\r\n header: {\r\n margin: 0,\r\n },\r\n}));\r\n\r\nconst Error = () => {\r\n const classes = useStyles();\r\n\r\n const handleLogin = () => {\r\n if (window.location.href.indexOf('idp.test') > 0) {\r\n window.location.href = brokerAppStagingUrl;\r\n } else {\r\n window.location.href = brokerAppUrl;\r\n }\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n There has been a error.\r\n \r\n \r\n \r\n Please try to login again by clicking below.\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Error;\r\n","import { useState, useEffect } from 'react';\r\nimport axios, { AxiosRequestConfig } from 'axios';\r\n\r\nconst useAxios = (url: string, config: AxiosRequestConfig | undefined) => {\r\n const [data, updateData] = useState(undefined);\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n const response = await axios.get(url, config);\r\n const json = await response.data;\r\n updateData(json);\r\n }\r\n fetchData();\r\n }, [url]);\r\n\r\n return data;\r\n};\r\n\r\nexport default useAxios;\r\n","import { Avatar, Box, Button } from '@material-ui/core';\r\nimport Container from '@material-ui/core/Container';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\r\nimport React, { useEffect } from 'react';\r\nimport useAxios from '../hooks/useAxios';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n paddingBottom: theme.spacing(2),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n marginTop: theme.spacing(8),\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.light,\r\n },\r\n header: {\r\n margin: 0,\r\n },\r\n iframe: {\r\n display: 'none',\r\n },\r\n}));\r\n\r\nconst Logout = () => {\r\n const classes = useStyles();\r\n const query = window.location.search;\r\n const logoutIdQuery = query && query.toLowerCase().indexOf('?logoutid=') == 0 && query;\r\n const url = `/api/authenticate/logout${logoutIdQuery}`;\r\n\r\n const data = useAxios(url, { withCredentials: true }) as any;\r\n\r\n const handleLogin = () => {\r\n if (data && data.postLogoutRedirectUri) window.location.href = data.postLogoutRedirectUri;\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n You have been logged out successfully.\r\n \r\n \r\n Click below to login.\r\n \r\n \r\n
\r\n {data && data.signOutIFrameUrl && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default Logout;\r\n","import { Box, Button, CircularProgress, Grid } from '@material-ui/core';\r\nimport { Field, Form } from 'formik';\r\nimport React from 'react';\r\nimport MaterialTextField from '../MaterialTextField';\r\nimport useDisableContinue from '../../hooks/useDisableContinue';\r\n\r\ninterface Props {\r\n isLoading: boolean;\r\n isResetting: boolean;\r\n}\r\n\r\nconst SetPasswordForm = ({ isLoading, isResetting }: Props) => {\r\n const { isDisabled } = useDisableContinue();\r\n\r\n const buttonText = isResetting ? 'Reset password' : 'Activate account';\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
  • Must contain at least 1 capital
  • \r\n
  • Must have a minimum of 8 characters
  • \r\n
  • Must have a mixture of letters and numbers
  • \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <>\r\n {buttonText}  \r\n {isLoading && }\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default SetPasswordForm;\r\n","import { Box, Button } from '@material-ui/core';\r\nimport Container from '@material-ui/core/Container';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport axios from 'axios';\r\nimport { Formik } from 'formik';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Redirect } from 'react-router-dom';\r\nimport {\r\n SetPasswordErrorCode as ErrorCode,\r\n SetPasswordModel,\r\n SetPasswordModelInitial,\r\n NewPasswordModelSchema,\r\n ErrorResponse,\r\n TimeoutCheckResponse,\r\n} from './forms/SetPasswordModels';\r\nimport SetPasswordForm from './forms/SetPasswordForm';\r\nimport Modal from './modal/Modal';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n paddingBottom: theme.spacing(2),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n marginTop: theme.spacing(8),\r\n },\r\n header: {\r\n margin: 0,\r\n color: '#291B44',\r\n },\r\n error: {\r\n paddingBottom: theme.spacing(2),\r\n },\r\n}));\r\n\r\nfunction ShouldShowErrorToUser(error: ErrorCode) {\r\n return error === ErrorCode.AlreadyUsed || error === ErrorCode.TimedOut;\r\n}\r\n\r\nconst SetPassword = (props: any) => {\r\n const classes = useStyles();\r\n const [isResetting] = useState(props.resetting);\r\n const [loading, setLoading] = useState(false);\r\n const [errorCode, setErrorCode] = useState(ErrorCode.None);\r\n const [timeoutError, setTimeoutError] = useState(false);\r\n const [errorText, setErrorText] = useState('');\r\n const [success, setSuccess] = useState(false);\r\n const [redirect, setRedirect] = useState(false);\r\n\r\n const code = new URLSearchParams(window.location.search).get('code');\r\n\r\n useEffect(() => {\r\n (async function checkTimeout() {\r\n try {\r\n const url = 'api/SetPassword/timeoutCheck';\r\n const body = JSON.stringify({ code: code });\r\n const response = await axios.post(url, body, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n validateStatus: () => true,\r\n });\r\n if (response.status === 200) {\r\n const timeoutCheckResponse = response.data as TimeoutCheckResponse;\r\n setTimeoutError(timeoutCheckResponse.hasTimedOut);\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n })();\r\n }, [code]);\r\n\r\n if (redirect) {\r\n return ;\r\n }\r\n\r\n const setPassword = async (values: SetPasswordModel) => {\r\n values.Code = code!;\r\n try {\r\n setLoading(true);\r\n const url = 'api/SetPassword';\r\n const body = JSON.stringify(values);\r\n const response = await axios.post(url, body, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n validateStatus: () => true,\r\n });\r\n\r\n if (response.status >= 200 || response.status < 300) {\r\n setSuccess(true);\r\n setLoading(false);\r\n setErrorCode(ErrorCode.None);\r\n setErrorText('');\r\n } else {\r\n const error = response.data as ErrorResponse;\r\n setSuccess(false);\r\n setLoading(false);\r\n setErrorCode(error.errorCode);\r\n setErrorText(error.message);\r\n if (error.errorCode === ErrorCode.TimedOut) {\r\n setTimeoutError(true);\r\n }\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n setSuccess(false);\r\n setLoading(false);\r\n setErrorCode(ErrorCode.Exception);\r\n setErrorText(error);\r\n }\r\n };\r\n\r\n const headerCopy = isResetting ? 'Reset Password' : 'Activate your account';\r\n const errorCopy = isResetting ? 'Password is not reset' : 'Account is not activated';\r\n const successCopy = isResetting\r\n ? 'Your password has been successfully reset.'\r\n : 'Your account has been successfully activated.';\r\n\r\n const error = !code || timeoutError;\r\n\r\n return (\r\n \r\n \r\n Uinsure\r\n \r\n \r\n {headerCopy}\r\n \r\n \r\n {error ? (\r\n \r\n \r\n There was an error during the attempt to {headerCopy.toLocaleLowerCase()}.\r\n \r\n {timeoutError && (\r\n \r\n One time link has expired.\r\n \r\n )}\r\n \r\n Call us on 0344 844 3844 if you require further assistance.\r\n \r\n \r\n ) : (\r\n {\r\n setPassword(values);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n\r\n setErrorCode(ErrorCode.None)}\r\n open={errorCode !== ErrorCode.None}\r\n >\r\n \r\n \r\n \r\n \r\n Error\r\n \r\n \r\n \r\n {errorCopy}\r\n \r\n {ShouldShowErrorToUser(errorCode) && (\r\n \r\n {errorText}\r\n \r\n )}\r\n \r\n \r\n Call us on 0344 844 3844 if you require further assistance\r\n \r\n \r\n \r\n setErrorCode(ErrorCode.None)}\r\n fullWidth\r\n >\r\n Okay\r\n \r\n \r\n \r\n \r\n \r\n\r\n setRedirect(true)} open={success}>\r\n \r\n \r\n \r\n \r\n Success\r\n \r\n \r\n \r\n {successCopy}\r\n \r\n \r\n \r\n To log in and access the Uinsure platform, please click below\r\n \r\n \r\n \r\n setRedirect(true)}\r\n fullWidth\r\n >\r\n Continue\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SetPassword;\r\n","import React from 'react';\r\nimport { Route } from 'react-router-dom';\r\nimport './App.css';\r\nimport { Layout } from './components/Layout';\r\nimport Login from './components/Login';\r\nimport Error from './components/Error';\r\nimport Logout from './components/Logout';\r\nimport SetPassword from './components/SetPassword';\r\n\r\nfunction App() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n } />\r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n process.env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then(registration => {\r\n registration.unregister();\r\n })\r\n .catch(error => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import { red } from '@material-ui/core/colors';\r\nimport { createMuiTheme } from '@material-ui/core/styles';\r\n\r\ndeclare module '@material-ui/core/styles/createMuiTheme' {\r\n interface Theme {\r\n footer: {\r\n backgroundColor: string;\r\n };\r\n }\r\n interface ThemeOptions {\r\n footer?: {\r\n backgroundColor?: string;\r\n };\r\n }\r\n}\r\n\r\n// A custom theme for this app\r\nconst theme = createMuiTheme({\r\n props: {\r\n MuiTextField: {\r\n margin: 'normal',\r\n InputLabelProps: {\r\n shrink: true,\r\n },\r\n },\r\n },\r\n overrides: {\r\n MuiAppBar: {\r\n colorPrimary: {\r\n backgroundColor: '#291b44',\r\n },\r\n },\r\n MuiPaper: {\r\n root: {},\r\n rounded: {\r\n borderRadius: 5,\r\n },\r\n elevation4: {\r\n filter: 'drop-shadow(0px 9px 8px rgba(152,184,190,0.31))',\r\n boxShadow: 'none',\r\n },\r\n },\r\n MuiButton: {\r\n root: {\r\n color: '#9d9d9d',\r\n fontFamily: 'Spartan MB Bold',\r\n fontSize: '1rem',\r\n textTransform: 'none',\r\n },\r\n outlined: {\r\n borderColor: '#e5e5e5',\r\n border: 'solid',\r\n borderWidth: 2,\r\n padding: '9px 15px',\r\n },\r\n outlinedPrimary: {\r\n color: '#00c9af',\r\n },\r\n contained: {\r\n padding: 11,\r\n boxShadow: '0px 9px 8px rgba(0,201,175,0.22)',\r\n '&:focus, &:hover': {\r\n boxShadow: '0px 9px 8px rgba(0,201,175,0.22)',\r\n },\r\n },\r\n containedPrimary: {\r\n backgroundColor: '#00c9af',\r\n '&:focus, &:hover': {\r\n backgroundColor: '#00c9af',\r\n },\r\n },\r\n containedSecondary: {\r\n backgroundColor: '#291b44',\r\n '&:focus, &:hover': {\r\n backgroundColor: '#291b44',\r\n },\r\n },\r\n text: {\r\n //padding: \"6px 50px\",\r\n },\r\n },\r\n MuiInputBase: {\r\n root: {\r\n fontSize: '1rem',\r\n lineHeight: '1.875rem',\r\n },\r\n input: {\r\n padding: '12px 0 10px',\r\n },\r\n },\r\n MuiInputLabel: {\r\n shrink: {\r\n transform: 'scale(1)',\r\n },\r\n },\r\n MuiInput: {\r\n formControl: {\r\n marginTop: 32, //theme.spacing(2)\r\n fontSize: '0.875rem',\r\n },\r\n underline: {\r\n '&:before': {\r\n borderBottomWidth: 2,\r\n borderBottomColor: '#e5e5e5',\r\n },\r\n //focused\r\n // '&:after': {\r\n // borderBottomWidth: 2,\r\n // borderBottomColor: 'black',\r\n // }\r\n },\r\n },\r\n MuiFormHelperText: {\r\n root: {\r\n error: {\r\n fontSize: '1rem',\r\n color: '#f30a2f',\r\n },\r\n },\r\n },\r\n MuiFormLabel: {\r\n root: {\r\n fontFamily: 'Spartan MB SemiBold',\r\n fontSize: '1rem',\r\n lineHeight: '1.25rem',\r\n color: '#000000',\r\n // '&.Mui-focused': {\r\n // color: 'black'\r\n // }\r\n },\r\n },\r\n MuiTypography: {\r\n h1: {\r\n margin: '40px 0 18px',\r\n fontFamily: 'Spartan MB ExtraBold',\r\n fontSize: '1.875rem',\r\n lineHeight: '40px',\r\n textAlign: 'center',\r\n color: '#291b44',\r\n },\r\n h2: {\r\n margin: '8px',\r\n fontFamily: 'Spartan MB SemiBold',\r\n fontSize: '1rem',\r\n lineHeight: '20px',\r\n textAlign: 'center',\r\n },\r\n h3: {\r\n fontSize: '1.25rem',\r\n fontFamily: 'Spartan MB Bold',\r\n margin: '8px 0',\r\n },\r\n body1: {\r\n fontSize: '0.9375rem',\r\n },\r\n },\r\n },\r\n typography: {\r\n fontSize: 16,\r\n fontFamily: ['Spartan MB', 'Roboto', 'Helvetica', 'Arial', 'sans-serif'].join(','),\r\n },\r\n palette: {\r\n primary: {\r\n main: '#291b44',\r\n },\r\n secondary: {\r\n light: '#00c9af',\r\n main: '#19857b',\r\n },\r\n error: {\r\n main: red.A400,\r\n },\r\n background: {\r\n default: '#f8f8f8',\r\n },\r\n },\r\n shape: {\r\n borderRadius: 25,\r\n },\r\n footer: {\r\n backgroundColor: 'transparent',\r\n },\r\n breakpoints: {\r\n values: {\r\n xs: 0,\r\n sm: 600,\r\n md: 960,\r\n lg: 1108, // originally was 1280\r\n xl: 1920,\r\n },\r\n },\r\n});\r\n\r\nexport default theme;\r\n","import 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport theme from './theme';\r\nimport { ThemeProvider, CssBaseline } from '@material-ui/core';\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root'),\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}