{"version":3,"file":"main.hostapp.bundle.js","mappings":"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ET,CACEC,MAAO,KACPD,MAAO,UAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,aAET,CACEC,MAAO,KACPD,MAAO,iBAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,SAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,aAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,eAET,CACEC,MAAO,KACPD,MAAO,WAET,CACEC,MAAO,KACPD,MAAO,kBAET,CACEC,MAAO,KACPD,MAAO,gBAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,iBAET,CACEC,MAAO,KACPD,MAAO,cAET,CACEC,MAAO,KACPD,MAAO,cAET,CACEC,MAAO,KACPD,MAAO,UAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,QAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,UAET,CACEC,MAAO,KACPD,MAAO,gBAET,CACEC,MAAO,KACPD,MAAO,gBAET,CACEC,MAAO,KACPD,MAAO,kBAET,CACEC,MAAO,KACPD,MAAO,gBAET,CACEC,MAAO,KACPD,MAAO,aAET,CACEC,MAAO,KACPD,MAAO,SAET,CACEC,MAAO,KACPD,MAAO,QAET,CACEC,MAAO,KACPD,MAAO,YAET,CACEC,MAAO,KACPD,MAAO,WAET,CACEC,MAAO,KACPD,MAAO,cAET,CACEC,MAAO,KACPD,MAAO,aAET,CACEC,MAAO,KACPD,MAAO,iBAET,CACEC,MAAO,KACPD,MAAO,YAyIEI,EAAwC,CACnD,CACEJ,MAAO,OACPC,MAAO,MAET,CACED,MAAO,OACPC,MAAO,OAIEI,EAAyC,CACpD,CACEL,MAAO,OACPC,MAAO,MAET,CACED,MAAO,OACPC,MAAO,OAIEK,EAAyB,CACpC,CACEL,MAAO,WACPD,MAAO,SAET,CACEC,MAAO,YACPD,MAAO,UAET,CACEC,MAAO,YACPD,MAAO,WAIEO,EAAyC,CACpD,CACEN,MAAO,MACPD,MAAO,OAET,CACEC,MAAO,MACPD,MAAO,eAET,CACEC,MAAO,MACPD,MAAO,0BAET,CACEC,MAAO,MACPD,MAAO,kBAET,CACEC,MAAO,OACPD,MAAO,SAIEQ,EAAyC,CACpD,CACEP,MAAO,MACPD,MAAO,OAET,CACEC,MAAO,MACPD,MAAO,eAET,CACEC,MAAO,MACPD,MAAO,kBAET,CACEC,MAAO,OACPD,MAAO,QAET,CACEC,MAAO,OACPD,MAAO,QAET,CACEC,MAAO,SACPD,MAAO,UAET,CACEC,MAAO,SACPD,MAAO,WAIES,EAA2C,CACtD,CACER,MAAO,YACPD,MAAO,UAET,CACEC,MAAO,YACPD,MAAO,UAET,CACEC,MAAO,WACPD,MAAO,UAIEU,EAAmD,CAC9D,CACET,MAAO,YACPD,MAAO,UAET,CACEC,MAAO,YACPD,MAAO,UAET,CACEC,MAAO,WACPD,MAAO,UAIEW,EAAkC,CAC7C,CACEV,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,IACPD,MAAO,MAET,CACEC,MAAO,KACPD,MAAO,OAET,CACEC,MAAO,KACPD,MAAO,OAET,CACEC,MAAO,KACPD,MAAO,QAIEY,EAA8B,GAC9BC,EAA8B,EAE9BC,EAAY,CACvB,CACEb,MAAO,OACPD,MAAO,QAET,CACEC,MAAO,uBACPD,MAAO,wBAET,CACEC,MAAO,mBACPD,MAAO,oBAET,CACEC,MAAO,cACPD,MAAO,eAET,CACEC,MAAO,cACPD,MAAO,gBAIEe,EAAY,CACvB,CACEd,MAAO,OACPD,MAAO,QAET,CACEC,MAAO,aACPD,MAAO,gBAET,CACEC,MAAO,WACPD,MAAO,eAIEgB,EAA2B,CACtCC,QAAS,2BACTC,MAAO,4BACPC,QAAS,yBACTC,KAAM,0BAGKC,E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","sources":["webpack://lyra-host-app/./src/components/AlertMessage/AlertMessage.styles.ts","webpack://lyra-host-app/./src/components/AlertMessage/AlertMessage.tsx","webpack://lyra-host-app/./src/components/Avatar/Avatar.styles.ts","webpack://lyra-host-app/./src/components/Avatar/Avatar.tsx","webpack://lyra-host-app/./src/components/Common/LyraComponents.tsx","webpack://lyra-host-app/./src/components/Common/styles.tsx","webpack://lyra-host-app/./src/components/Errors/NotFound/NotFound.styles.ts","webpack://lyra-host-app/./src/components/Errors/NotFound/NotFound.tsx","webpack://lyra-host-app/./src/components/LoadingIndicator/index.tsx","webpack://lyra-host-app/./src/components/Modal/index.tsx","webpack://lyra-host-app/./src/components/SideBar/index.tsx","webpack://lyra-host-app/./src/config/config.ts","webpack://lyra-host-app/./src/constants/auth.ts","webpack://lyra-host-app/./src/constants/index.ts","webpack://lyra-host-app/./src/components/Header/styles.tsx","webpack://lyra-host-app/./src/components/Header/index.tsx","webpack://lyra-host-app/./src/components/Modal/modals/AccountSetupModal/AccountSetupModal.styles.ts","webpack://lyra-host-app/./src/components/Modal/modals/AccountSetupModal/AccountSetupModal.tsx","webpack://lyra-host-app/./src/components/MainContainer/index.tsx","webpack://lyra-host-app/./src/components/Router/PrivateRoute.tsx","webpack://lyra-host-app/./src/services/hubspot/hubspot-initial.ts","webpack://lyra-host-app/./src/pages/TitleUpdater.tsx","webpack://lyra-host-app/./src/pages/App.tsx","webpack://lyra-host-app/./src/stores/AccountStore.ts","webpack://lyra-host-app/./src/services/AuthService.ts","webpack://lyra-host-app/./src/stores/AuthStore.ts","webpack://lyra-host-app/./src/stores/DashboardStore.ts","webpack://lyra-host-app/./src/stores/LeadStore.ts","webpack://lyra-host-app/./src/utils/log.ts","webpack://lyra-host-app/./src/main.tsx","webpack://lyra-host-app/./src/stores/RootStore.ts","webpack://lyra-host-app/./src/services/DesignService.ts","webpack://lyra-host-app/./src/services/DocumentsService.ts","webpack://lyra-host-app/./src/services/HostAppService.ts","webpack://lyra-host-app/./src/services/analytics/AnalyticsEvents.ts","webpack://lyra-host-app/./src/services/analytics/segment-initial.js","webpack://lyra-host-app/./src/services/hubspot/HubSpotTracking.ts","webpack://lyra-host-app/./src/services/analytics/AnalyticsService.ts","webpack://lyra-host-app/./src/services/analytics/index.ts","webpack://lyra-host-app/./src/services/generic/HttpService.ts","webpack://lyra-host-app/./src/services/generic/SessionService.ts","webpack://lyra-host-app/./src/services/hubspot/HubSpotConversations.ts","webpack://lyra-host-app/./src/services/live-chat/LiveChatService.ts","webpack://lyra-host-app/./src/stores/index.tsx","webpack://lyra-host-app/./src/utils/analytics.ts","webpack://lyra-host-app/./src/utils/errors.ts","webpack://lyra-host-app/./src/utils/helper.ts","webpack://lyra-host-app/./src/utils/storage.ts"],"sourcesContent":["import styled from 'styled-components';\nimport {\n MESSAGE_BACKGROUND_COLOR, MESSAGE_BORDER_COLOR\n} from '../../constants';\nimport type { TAlertType } from './AlertMessage';\ntype Props = {\n isMessageVisible?: boolean;\n type: TAlertType;\n};\n\nexport const AlertMessageBox = styled.div`\n box-sizing: border-box;\n display: ${({ isMessageVisible }: Props): string => (isMessageVisible ? 'block' : 'none')};\n width: 100%;\n padding: 15px 12px;\n border: solid 1px ${({ type }: Props): string => MESSAGE_BORDER_COLOR[type]};\n background-color: ${({ type }: Props): string => MESSAGE_BACKGROUND_COLOR[type]};\n border-radius: 0.25rem;\n font-size: 14px;\n line-height: 18px;\n font-family: 'Mukta', sans-serif;\n`;\n","import type {\n FC, ReactElement\n} from 'react';\nimport React from 'react';\nimport { AlertMessageBox } from './AlertMessage.styles';\n\nexport type TAlertType = 'success' | 'error' | 'warning' | 'info';\n\nexport type AlertProps = {\n message: string;\n type?: TAlertType;\n isMessageVisible: boolean;\n};\n\nconst AlertMessage: FC = ({\n message,\n isMessageVisible,\n type\n}: AlertProps): ReactElement => {\n return (\n \n {message}\n \n );\n};\n\nAlertMessage.defaultProps = {\n type: 'error',\n};\n\nexport { AlertMessage };\n","import styled from 'styled-components';\nimport type { TAvatarSize } from './Avatar';\n\nexport const Container = styled.div<{ size: TAvatarSize }>`\n background-color: #535672;\n text-transform: uppercase;\n color: white;\n font-family: 'Mukta', sans-serif;\n text-align: center;\n border-radius: 50%;\n overflow: hidden;\n \n // Styles for small avatar (right top corner)\n ${({ size }) => size === 'small' && `\n width: 40px;\n height: 40px;\n font-size: 24px;\n line-height: 40px;\n `}\n \n // Styles for large avatar (profile) \n ${({ size }) => size === 'large' && `\n width: 84px;\n height: 84px;\n font-size: 48px;\n line-height: 84px;\n `}\n`;\n\nexport const Image = styled.img`\n width: 100%;\n height: 100%;\n display: block;\n object-fit: cover;\n`;\n","import { default as getInitials } from 'initials';\nimport type { ReactElement } from 'react';\nimport React, {\n useEffect, useState\n} from 'react';\nimport {\n Container, Image\n} from './Avatar.styles';\n\nexport type TAvatarSize = 'small' | 'large';\n\nexport interface IAvatarProps {\n size: TAvatarSize;\n name: string;\n image?: string;\n}\n\nfunction Avatar(props: IAvatarProps): ReactElement {\n const {\n size, name, image\n } = props;\n const [userInitials, setUserInitials] = useState('');\n\n useEffect((): void => {\n const initials = getInitials(name);\n\n const initialsString = Array.isArray(initials)\n ? initials.join('')\n : initials;\n\n setUserInitials(initialsString);\n }, [name]);\n\n return (\n \n {image ? (\n {name}\n ) : userInitials}\n \n );\n}\n\nexport default Avatar;\n","import {\n LyraButtons,\n LyraCardList,\n LyraDataTable,\n LyraDropDownNew,\n LyraFontFamily,\n LyraFormElementsHostApp,\n LyraIcon,\n LyraLayout,\n LyraSideBar,\n LyraTag,\n LyraTheme\n} from '@aurorasolar/lyra-ui-kit';\n\nconst {\n Buttons, TabBar\n} = LyraButtons;\nconst { CardList } = LyraCardList;\nconst { DataTable } = LyraDataTable;\nconst { DropDownNew } = LyraDropDownNew;\nconst {\n H1, H2, H3, H4, Paragraph, Link\n} = LyraFontFamily.FontFamily;\nconst {\n HAInput,\n HADropdown,\n HACheckBox,\n HAToggle\n} = LyraFormElementsHostApp.FormElementsHostApp;\nconst { Icon } = LyraIcon;\nconst { Flexbox } = LyraLayout;\nconst { SideBar } = LyraSideBar;\nconst {\n Theme, defaultTheme\n} = LyraTheme;\nconst { Tag } = LyraTag;\n\nexport {\n Buttons as LyraButton,\n TabBar as LyraTabBar,\n CardList as LyraCardList,\n DataTable as LyraDataTable,\n DropDownNew as LyraDropDownNew,\n H1 as LyraH1,\n H2 as LyraH2,\n H3 as LyraH3,\n H4 as LyraH4,\n Paragraph as LyraParagraph,\n Link as LyraLink,\n HADropdown as LyraDropdown,\n HAInput as LyraInput,\n HACheckBox as LyraCheckBox,\n Icon as LyraIcon,\n Flexbox as LyraFlexbox,\n SideBar as LyraSideBar,\n Theme as LyraTheme,\n defaultTheme as defaultThemeConfig,\n Tag as LyraTag,\n HAToggle as LyraToggle\n};\n","import {\n Col, Grid, Row\n} from 'react-flexbox-grid';\nimport type { PropsTheme } from 'styled-components';\nimport styled from 'styled-components';\nimport type { Color } from '../../typings';\nimport {\n LyraCheckBox, LyraFlexbox, LyraH1, LyraH2, LyraH3, LyraH4, LyraParagraph\n} from './LyraComponents';\n\ntype InputProps = PropsTheme & {\n isValid?: boolean;\n isTouched?: boolean;\n attrs?: { [attributeName: string]: string };\n};\n\nexport const FlexColumnView = styled(LyraFlexbox).attrs({\n justify: 'center',\n align: 'center',\n dir: 'column'\n})``;\n\nexport const AppContainer = styled.div`\n display: flex;\n`;\n\nexport const ErrorLabel = styled.span`\n font: normal 12px/1.4 Mukta;\n display: inline-block;\n color: #d34a4a;\n padding: 6px 0;\n`;\n\nexport const MainWrapper = styled.div`\n width: calc(100% - 272px);\n position: relative;\n left: 272px;\n overflow-x: clip;\n min-height: 100vh;\n background: ${({ theme }: PropsTheme): Color => theme.colors.grayColor11};\n`;\n\nexport const ContentWrapper = styled.div`\n margin-top: 50px;\n`;\n\nexport const AuthFormContainer = styled.div`\n display: flex;\n width: 100%;\n min-height: 100vh;\n`;\n\nexport const CenterRow = styled(Row)`\n display: flex;\n align-items: center;\n`;\n\nexport const EndRow = styled(Row)`\n display: flex;\n align-items: stretch;\n`;\n\nexport const SpacedRow = styled(Row)`\n display: flex;\n justify-content: space-between;\n\n & > div {\n flex: 1;\n }\n`;\n\nexport const FormContainer = styled.div`\n position: relative;\n width: calc(100% - 680px);\n max-height: 100vh;\n padding: 161px 0px 192px 0px;\n`;\n\nexport const FormOverContainer = styled.div`\n width: calc(100% - 680px);\n padding: 60px 0px 169px 0px;\n`;\n\nexport const ResetContainer = styled(Grid)`\n width: calc(100% - 680px);\n padding: 161px 0px 192px 0px;\n position: relative;\n`;\n\nexport const PanelHeaderText = styled.div`\n color: ${({ theme }: PropsTheme): Color => theme.colors.mainColor1};\n font: normal normal 24px Mukta;\n line-height: 1.67;\n`;\n\nexport const WarningSection = styled.div`\n width: 100%;\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n`;\n\nexport const PanelSubHeaderText = styled(LyraH1)`\n line-height: 1.28;\n color: ${({ theme }: PropsTheme): Color => theme.colors.grayColor1};\n`;\n\nexport const ActionContainer = styled(LyraFlexbox).attrs({\n align: 'center'\n})`\n margin-top: 57px;\n`;\n\nexport const BlueParagraph = styled.div`\n font: bold 14px Mukta;\n margin-left: 8px;\n color: ${({ theme }: PropsTheme): Color => theme.colors.mainColor1};\n cursor: pointer;\n`;\n\nexport const InputContainer = styled.div`\n margin-top: 50px;\n`;\n\nexport const PaddingView = styled.div`\n margin-top: 36px;\n & > div:first-child {\n font-weight: bold;\n }\n`;\n\nexport const HeightParagraph = styled(LyraParagraph)`\n line-height: 1.71;\n`;\n\nexport const RightCol = styled(Col)`\n text-align: right;\n`;\n\nexport const LeftCol = styled(Col)`\n display: flex;\n align-items: center;\n`;\n\nexport const ButtonContainer = styled(LyraFlexbox).attrs({\n justify: 'center',\n align: 'center'\n})`\n margin-top: 56px;\n`;\n\nexport const ButtonWrapper = styled.div`\n margin-left: 10px;\n`;\n\nexport const CommentContainer = styled.div`\n margin-top: 85px;\n text-align: center;\n`;\n\nexport const CommentLink = styled.div`\n color: ${({ theme }: PropsTheme): Color => theme.colors.iconBg2};\n font: normal normal 12px Mukta;\n line-height: normal;\n text-align: left;\n`;\n\nexport const InputHeaderText = styled(LyraH3)`\n font-size: 18px;\n line-height: 2.22;\n`;\n\nexport const SearchWrapper = styled.div`\n position: relative;\n`;\n\nexport const SearchInput = styled.input`\n width: 100%;\n height: 46px;\n border-radius: 23px;\n border: 1px solid ${({ theme }: PropsTheme): Color => theme.colors.grayColor3};\n font-family: 'Mukta', sans-serif;\n font-size: 16px;\n color: ${({ theme }: PropsTheme): Color => theme.colors.grayColor3};\n padding-left: 40px;\n outline: none;\n`;\n\nexport const SearchIcon = styled.div`\n position: absolute;\n top: 18px;\n left: 15px;\n width: 18px;\n height: 18px;\n background-image: url('../../assets/search.svg');\n background-repeat: no-repeat;\n`;\n\nexport const HeaderTitle = styled(LyraH2)`\n color: ${({ theme }: PropsTheme): Color => theme.colors.mainColor1};\n line-height: 1.67;\n margin-bottom: 17px;\n`;\n\nexport const EmptyCardWrapper = styled(FlexColumnView)`\n width: 100%;\n height: 600px;\n border-radius: 4px;\n box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);\n background-color: ${({ theme }: PropsTheme): Color => theme.colors.highlight};\n margin-bottom: 20px;\n`;\n\nexport const PopUpContainer = styled(FlexColumnView)`\n box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);\n background-color: ${({ theme }: PropsTheme): Color => theme.colors.highlight};\n position: absolute !important;\n top: 45px;\n right: 22px;\n border-radius: 5px;\n padding: 10px 0px 10px 0px;\n z-index: 100;\n &:before {\n border: solid;\n border-color: white transparent;\n border-width: 0 0.7em 0.8em 0.7em;\n top: -8px;\n content: '';\n display: block;\n left: 13em;\n position: absolute;\n z-index: 99;\n width: 1px;\n }\n`;\n\nexport const PopUpItem = styled(LyraH4)`\n width: calc(100% - 10px);\n height: 50px;\n align-items: center;\n display: flex;\n cursor: pointer;\n padding-left: 10px;\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n }\n`;\n\nexport const CoverView = styled.div`\n position: fixed;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n z-index: 99;\n`;\n\nexport const SmallText = styled(LyraParagraph)`\n color: ${({ theme }: PropsTheme): Color => theme.colors.mainColor6};\n line-height: 1.14;\n margin-top: 10px;\n`;\n\nexport const ButtonGroup = styled(LyraFlexbox).attrs({\n justify: 'center',\n align: 'center'\n})`\n width: 100%;\n height: 180px;\n\n & .disabled {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 0.3;\n }\n`;\n\nexport const ModalContainer = styled(FlexColumnView)``;\n\nexport const ConfirmText = styled(LyraH2)`\n color: ${({ theme }: PropsTheme): Color => theme.colors.mainColor1};\n line-height: 1.67;\n margin-top: 20px;\n`;\n\nexport const CommentText = styled(LyraParagraph)`\n margin-top: 20px;\n color: ${({ theme }: PropsTheme): Color => theme.colors.mainColor6};\n line-height: 1.71;\n width: 312px;\n text-align: center;\n`;\n\nexport const ButtonModalWrapper = styled.div`\n margin-top: 40px;\n`;\n\nexport const LyraCommentText = styled(LyraParagraph)`\n color: ${({ theme }: PropsTheme): Color => theme.colors.grayColor1};\n font-weight: bold;\n`;\n\n/* FIXME: Once we use HAInput everywhere, we don't need this styles anymore */\nexport const LyraMainInput = styled.input.attrs((props: InputProps) => ({ ...props.attrs }))`\n width: 100%;\n height: 28px;\n font-family: 'Mukta', sans-serif;\n font-size: 14px;\n line-height: 23px;\n color: ${({\n theme, isValid, isTouched\n }: InputProps): Color =>\n !isValid && isTouched ? theme.colors.mainColor4 : theme.colors.grayColor1};\n border: none;\n border-bottom-width: 1px;\n border-bottom-style: solid;\n border-bottom-color: ${({\n theme, isValid, isTouched\n }: InputProps): Color =>\n !isValid && isTouched ? theme.colors.mainColor4 : theme.colors.grayColor3};\n outline: none;\n padding: 0;\n background: inherit;\n margin-top: 10px;\n box-sizing: border-box;\n transition-duration: 0.2s;\n transition-timing-function: ease-in-out;\n transition-property: border-bottom-color;\n\n &:focus {\n border-bottom-color: ${({\n theme, isValid, isTouched\n }: InputProps): Color =>\n !isValid && isTouched ? theme.colors.mainColor4 : theme.colors.mainColor1};\n border-bottom-width: 2px;\n }\n`;\n\nexport const LyraMainTextarea = styled.textarea.attrs((props: InputProps) => ({\n ...props.attrs\n}))`\n width: 100%;\n font-family: 'Mukta', sans-serif;\n font-size: 14px;\n line-height: 23px;\n color: ${({\n theme, isValid, isTouched\n }: InputProps): Color =>\n !isValid && isTouched ? theme.colors.mainColor4 : theme.colors.grayColor1};\n border: none;\n border-bottom-width: 1px;\n border-bottom-style: solid;\n border-bottom-color: ${({\n theme, isValid, isTouched\n }: InputProps): Color =>\n !isValid && isTouched ? theme.colors.mainColor4 : theme.colors.grayColor3};\n outline: none;\n padding: 0;\n background: inherit;\n margin-top: 10px;\n box-sizing: border-box;\n transition-duration: 0.2s;\n transition-timing-function: ease-in-out;\n transition-property: border-bottom-color;\n\n &:focus {\n border-bottom-color: ${({\n theme, isValid, isTouched\n }: InputProps): Color =>\n !isValid && isTouched ? theme.colors.mainColor4 : theme.colors.mainColor1};\n border-bottom-width: 2px;\n }\n`;\n\nexport const LogoImage = styled.img`\n display: block;\n width: auto;\n height: auto;\n max-height: 250px;\n max-width: 100%;\n border: 1px solid ${({ theme }: PropsTheme): Color => theme.colors.grayColor3};\n border-radius: 4px;\n`;\n\nexport const BoldLink = styled.span`\n color: ${({ theme }: PropsTheme): Color => theme.colors.mainColor1};\n font-weight: bold;\n cursor: pointer;\n margin-top: 15px;\n font-size: 14px;\n`;\n\ntype ErrorMessage = PropsTheme & {\n isShown: boolean;\n};\n\nexport const ErrorMessage = styled.div`\n display: ${({ isShown }: ErrorMessage): string => (isShown ? 'block' : 'none')};\n width: 100%;\n margin: 8px;\n padding: 15px 12px;\n border: solid 1px #ff736e;\n background-color: rgba(255, 115, 110, 0.25);\n border-radius: 0.25rem;\n font-size: 14px;\n line-height: 18px;\n`;\n\nexport const CheckBox = styled(LyraCheckBox.HACheckbox)`\n display: inline-flex;\n`;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100vh;\n max-width: 400px;\n margin: 0 auto;\n`;\n\nexport const Image = styled.img`\n margin-bottom: 32px;\n`;\n\nexport const Text = styled.p`\n font-family: 'Mukta', sans-serif;\n font-size: 16px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: normal;\n letter-spacing: normal;\n text-align: center;\n color: #100E2A;\n margin-bottom: 20px;\n`;\n\nexport const Title = styled(Text)`\n font-size: 24px;\n font-weight: bold;\n`;\n","import type {\n FC, ReactElement\n} from 'react';\nimport React from 'react';\nimport { useHistory } from 'react-router';\nimport {\n Container, Image, Text, Title\n} from './NotFound.styles';\n\ntype NotFoundProps = {\n errorText: string;\n};\n\nconst NotFound: FC = ({ errorText }: NotFoundProps): ReactElement => {\n const history = useHistory();\n return (\n \n \n Oops! Nothing to see here.\n {errorText}\n \n );\n};\n\nexport { NotFound };\n","import type {\n FC, ReactElement\n} from 'react';\nimport React, { useContext } from 'react';\nimport PulseLoader from 'react-spinners/PulseLoader';\nimport styled, { ThemeContext } from 'styled-components';\nimport { EmptyCardWrapper } from '../../components/Common/styles';\n\nconst LoadingContainer = styled.div`\n position: fixed;\n display: flex;\n justify-content: center;\n align-items: center;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n z-index: 100;\n background: rgba(0, 0, 0, 0.5);\n width: 100%;\n height: 100vh;\n`;\n\nexport const EmbeddableLoadingIndicator = (): ReactElement => {\n const theme = useContext(ThemeContext);\n return ;\n};\n\n// eslint-disable-next-line import/no-unused-modules\nexport const EmbeddableLoadingIndicatorWrapper = styled.div`\n //Maybe delete?\n margin: 40px;\n`;\n\ntype LoadingElementProps = {\n loading: boolean;\n children: React.ReactNode;\n};\n\nexport const LoadingCard: FC = ({\n loading, children\n}: LoadingElementProps): ReactElement => {\n const loadingIndicator = (\n \n \n \n );\n return loading ? loadingIndicator : <>{children};\n};\n\nexport const LoadingMask: FC = ({\n loading, children\n}: LoadingElementProps): ReactElement => {\n return loading ? : <>{children};\n};\n\nexport const LoadingIndicator = (): ReactElement => {\n const theme = useContext(ThemeContext);\n return (\n \n \n \n );\n};\n","import type {\n FC, ReactElement, ReactNode\n} from 'react';\nimport React from 'react';\nimport Modal from 'react-modal';\n\nexport const MODAL_PORTAL_ID = 'lyra-host-modal-portal';\n\ntype ModalProps = {\n isOpen: boolean;\n onRequestClose?: () => void;\n children: string | ReactNode;\n contentStyle: React.CSSProperties;\n};\n\nconst ModalWrapper: FC = ({\n isOpen,\n onRequestClose,\n children,\n contentStyle,\n}: ModalProps): ReactElement => {\n return (\n document.getElementById(MODAL_PORTAL_ID) ?? document.body}\n >\n {children}\n \n );\n};\n\nexport { ModalWrapper };\n","import { LyraSideBar } from '@aurorasolar/lyra-ui-kit';\nimport type {\n FC, ReactElement\n} from 'react';\nimport React, { useCallback } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { validRoutes } from '../../config/config';\n\nconst PatternContainer = styled.div`\n width: 100%;\n min-height: 100vh;\n background: url(\"../../assets/bg_2.png\");\n`;\n\nconst SidebarWrapper = styled.div`\n position: fixed;\n`;\n\nconst dashboardRegexp = /dashboard\\/?/;\nconst accountRegexp = /account\\/?/;\n\nconst Sidebar: FC = (): ReactElement => {\n const history = useHistory();\n const { pathname } = history.location;\n\n const routeIsValid = validRoutes.some((route: RegExp) => route.test(history.location.pathname));\n const isValidDashboardRoute = dashboardRegexp.test(pathname) && routeIsValid;\n const isValidAccountdRoute = accountRegexp.test(pathname) && routeIsValid;\n\n const toggleActive = useCallback(\n (item: string) => {\n history.push(item);\n },\n [],\n );\n\n return (\n \n \n toggleActive('/dashboard')}\n >\n DASHBOARD\n \n toggleActive('/account')}\n >\n Account\n \n \n \n \n );\n};\n\nexport { Sidebar };\n","import { lyraDesignToolVersion } from '@aurorasolar/lyra-design-tool';\n\nconst appEnv = process.env.REACT_APP_ENV;\n\nconst environment = {\n design: {\n environment: appEnv,\n name: process.env.LYRA_ENV_DESIGN_TOOL_NAME,\n version: lyraDesignToolVersion\n },\n host: {\n environment: appEnv,\n name: process.env.REACT_APP_NAME, // webpack/utils/plugins\n version: process.env.REACT_APP_VERSION, // webpack/utils/plugins\n updatePaymentUrl: process.env.LYRA_ENV_FEATURE_UPDATE_PAYMENT_LINK\n },\n node: process.env.NODE_ENV\n};\n\n// Lyra API\nconst apiHostUrl = process.env.LYRA_ENV_API_HOST_URL!;\nconst apiDocumentsUrl = process.env.LYRA_ENV_API_DOCUMENTS!;\nconst apiDesignUrl = process.env.LYRA_ENV_API_DESIGN!;\n\nconst api = {\n host: apiHostUrl,\n documents: apiDocumentsUrl,\n design: apiDesignUrl\n};\n\n// Site info\nconst site = {\n // Canonical root url is needed in social media sharing and SEO optimization purposes.\n canonicalRootUrl: process.env.LYRA_ENV_CANONICAL_ROOT_URL ?? ''\n};\n\n// Google Maps\n// Google Maps API key is needed for static map images and address autocomplete.\nconst maps = {\n // Google Maps API\n google: {\n apiKey: `${process.env.LYRA_ENV_GOOGLE_MAPS_API_KEY}`,\n // This is Google Maps URL signing secret\n privateKey: `${process.env.LYRA_ENV_GOOGLE_MAPS_PRIVATE_KEY}`,\n staticUrl: `${process.env.LYRA_ENV_GOOGLE_MAPS_STATIC_URL}`,\n scale: `${process.env.LYRA_ENV_GOOGLE_MAPS_SCALE}`,\n size: `${process.env.LYRA_ENV_MAPS_RESOLUTION_X}x${process.env.LYRA_ENV_MAPS_RESOLUTION_Y}`,\n disableDefaultUI: `${process.env.LYRA_ENV_GOOGLE_MAPS_DISABLE_DEFAULT_UI}`,\n tilt: `${process.env.LYRA_ENV_GOOGLE_MAPS_TILT}`,\n factorHeading: `${process.env.LYRA_ENV_GOOGLE_MAPS_FACTOR_HEADING}`,\n pitch: `${process.env.LYRA_ENV_GOOGLE_MAPS_PITCH}`,\n zoom: Number(process.env.LYRA_ENV_GOOGLE_MAPS_ZOOM)\n }\n};\n\n// Sentry DSN (Data Source Name), a client key for authenticating calls to Sentry\nconst sentryMode = process.env.LYRA_ENV_HOST_APP_SENTRY_ENABLED === 'true';\nconst sentryEnvironment = environment.host.environment;\nconst sentryDsn = process.env.LYRA_ENV_HOST_APP_SENTRY_DSN;\nconst sentryMaxBreadcrumbs = Number(process.env.LYRA_ENV_SENTRY_BREADCRUMBS) || 100;\nconst sentryDebug = process.env.LYRA_ENV_SENTRY_DEBUG === 'true';\nconst sentryLogLevel = process.env.LYRA_ENV_SENTRY_LOG_LEVEL;\nconst sentryAttachStacktrace = process.env.LYRA_ENV_SENTRY_STACKTRACE === 'true';\nconst sentryAutoSessionTracking = process.env.LYRA_ENV_SENTRY_SESSION_TRACKING === 'true';\nconst sentryMaxStoredEvents = Number(process.env.LYRA_ENV_SENTRY_MAX_STORED_EVENTS);\n// Set tracesSampleRate to 1.0 to capture 100%\n// of transactions for performance monitoring.\n// It is recommended to adjust this value in production\nconst sentryErrorDataIntegrationDepth = Number(process.env.LYRA_ENV_SENTRY_DATA_INTEGRATION_DEPTH) || 3;\nconst sentryTraceSampleRate = Number(process.env.LYRA_ENV_SENTRY_TRACE_SAMPLE_RATE) || 1.0;\nconst sentryCaptureConsole = ['error', 'debug']; // defaults to ['log', 'info', 'warn', 'error', 'debug', 'assert']\nconst showSentryDialog = process.env.LYRA_ENV_SHOW_ERROR_DIALOG === 'true';\nconst ignoredSentryCodes = [\n 'csp-violation',\n 'server-side-data-load-failed',\n 'card_declined',\n 'currency-input-invalid-currency',\n 'auth-info-failed',\n 'signup-failed',\n 'fetch-current-user-failed'\n // 'browser-side-render-failed' // catched intl invariant errors,\n];\nconst sentry = {\n enabled: sentryMode,\n dsn: sentryDsn,\n debug: sentryDebug,\n showDialog: showSentryDialog,\n ignoredCodes: ignoredSentryCodes,\n tracesSampleRate: sentryTraceSampleRate,\n dataIntegrationDepth: sentryErrorDataIntegrationDepth,\n environment: sentryEnvironment,\n maxBreadcrumbs: sentryMaxBreadcrumbs,\n logLevel: sentryLogLevel,\n attachStacktrace: sentryAttachStacktrace,\n autoSessionTracking: sentryAutoSessionTracking,\n maxStoredEvents: sentryMaxStoredEvents,\n captureConsole: sentryCaptureConsole\n};\n\n// HubSpot integration\n// See: https://developers.hubspot.com/docs/api/events/tracking-code\n// See: https://developers.hubspot.com/docs/api/conversation/chat-widget-sdk\n//\nconst hubSpotHubId = process.env.LYRA_ENV_HUBSPOT_HUB_ID;\nconst hubSpotEnabled = process.env.LYRA_ENV_HUBSPOT_ENABLED === 'true';\nconst hubSpot = {\n hubId: hubSpotHubId,\n enabled: hubSpotEnabled\n};\n\nconst analytics = {\n enabled: process.env.LYRA_ENV_ANALYTICS_TRACKING === 'true',\n provider: process.env.LYRA_ENV_ANALYTICS_PROVIDER,\n id:\n process.env.LYRA_ENV_ANALYTICS_PROVIDER === 'segment'\n ? process.env.LYRA_ENV_SEGMENT_ID\n : process.env.LYRA_ENV_GOOGLE_ANALYTICS_ID\n};\n\nexport const validRoutes: RegExp[] = [\n /^\\/$/,\n /^\\/index.html\\/?$/,\n /^\\/register\\/?$/,\n /^\\/forgot-password\\/?$/,\n /^\\/projects\\/\\d+\\/?$/,\n /^\\/dashboard\\/?$/,\n /^\\/users\\/?$/,\n /^\\/profile\\/?$/,\n /^\\/account\\/?$/,\n /^\\/account\\/company\\/edit\\/?$/,\n /^\\/account\\/payment\\/edit\\/?$/,\n /^\\/preferences\\/?$/\n];\n\n// NOTE: only expose configuration that should be visible in the client side\nconst config = {\n analytics,\n api,\n environment,\n hubSpot,\n maps,\n sentry,\n site,\n validRoutes\n};\n\nexport default config;\n","// local storage data keys\nexport const ACCESS_TOKEN_KEY = 'LYRA_ACCESS_TOKEN';\nexport const ACCESS_TOKEN_EXP_KEY = 'LYRA_ACCESS_TOKEN_EXP';\nexport const USER_DATA_KEY = 'LYRA_USER_DATA';\nexport const USER_DATA_SECRET = 'LYRA_THE_BEST';\nexport const LEAD_DATA_KEY = 'LYRA_LEAD_DATA';\n\n/**\n * Name of a custom claim within access token that holds info about Lyra Account\n */\nexport const LYRA_ACCOUNT_KEY = 'https://lyrasolar.com/acc';\n","import type { Libraries } from '@react-google-maps/api/dist/utils/make-load-script-url';\n\nexport const DROPDOWN_PORTAL_ID = 'lyra-host-dropdown-portal';\n\nexport const HEADER_ITEM_PREFERENCES: string = 'preferences';\nexport const HEADER_ITEM_PROFILE: string = 'profile';\nexport const HEADER_ITEM_LOGOUT: string = 'logout';\n\nexport const headerItems = [\n {\n key: HEADER_ITEM_PREFERENCES,\n text: 'Preferences',\n icon: 'icon-settings',\n },\n {\n key: HEADER_ITEM_PROFILE,\n text: 'Profile',\n icon: 'icon-user',\n },\n {\n key: HEADER_ITEM_LOGOUT,\n text: 'Logout',\n icon: 'icon-logout',\n }\n];\n\nexport const GOOGLE_MAP_LIBRARIES: Libraries = ['places'];\n\nexport const userRoles = [\n {\n label: 'Super Admin',\n value: 'super-admin'\n },\n {\n label: 'Admin',\n value: 'admin'\n },\n {\n label: 'User',\n value: 'user'\n },\n {\n label: 'Guest',\n value: 'guest'\n }\n];\n\nexport const PRIMARY_USE_OPTIONS = [\n {\n label: 'Permit packages',\n value: 'PERMIT_PACKAGES'\n },\n {\n label: 'Preliminary designs for proposals',\n value: 'PROPOSALS'\n }\n];\n\nexport const ACCOUNT_TYPES = [\n {\n label: 'Installation Company',\n value: 'INSTALLATION_COMPANY'\n },\n {\n label: 'Homeowner',\n value: 'HOMEOWNER'\n },\n];\n\nexport const states = [\n {\n value: 'AK',\n label: 'Alaska'\n },\n {\n value: 'AL',\n label: 'Alabama'\n },\n {\n value: 'AR',\n label: 'Arkansas'\n },\n {\n value: 'AZ',\n label: 'Arizona'\n },\n {\n value: 'CA',\n label: 'California'\n },\n {\n value: 'CO',\n label: 'Colorado'\n },\n {\n value: 'CT',\n label: 'Connecticut'\n },\n {\n value: 'DC',\n label: 'District of Columbia'\n },\n {\n value: 'DE',\n label: 'Delaware'\n },\n {\n value: 'FL',\n label: 'Florida'\n },\n {\n value: 'GA',\n label: 'Georgia'\n },\n {\n value: 'HI',\n label: 'Hawaii'\n },\n {\n value: 'IA',\n label: 'Iowa'\n },\n {\n value: 'ID',\n label: 'Idaho'\n },\n {\n value: 'IL',\n label: 'Illinois'\n },\n {\n value: 'IN',\n label: 'Indiana'\n },\n {\n value: 'KS',\n label: 'Kansas'\n },\n {\n value: 'KY',\n label: 'Kentucky'\n },\n {\n value: 'LA',\n label: 'Louisiana'\n },\n {\n value: 'MA',\n label: 'Massachusetts'\n },\n {\n value: 'MD',\n label: 'Maryland'\n },\n {\n value: 'ME',\n label: 'Maine'\n },\n {\n value: 'MI',\n label: 'Michigan'\n },\n {\n value: 'MN',\n label: 'Minnesota'\n },\n {\n value: 'MO',\n label: 'Missouri'\n },\n {\n value: 'MS',\n label: 'Mississippi'\n },\n {\n value: 'MT',\n label: 'Montana'\n },\n {\n value: 'NC',\n label: 'North Carolina'\n },\n {\n value: 'ND',\n label: 'North Dakota'\n },\n {\n value: 'NE',\n label: 'Nebraska'\n },\n {\n value: 'NH',\n label: 'New Hampshire'\n },\n {\n value: 'NJ',\n label: 'New Jersey'\n },\n {\n value: 'NM',\n label: 'New Mexico'\n },\n {\n value: 'NV',\n label: 'Nevada'\n },\n {\n value: 'NY',\n label: 'New York'\n },\n {\n value: 'OH',\n label: 'Ohio'\n },\n {\n value: 'OK',\n label: 'Oklahoma'\n },\n {\n value: 'OR',\n label: 'Oregon'\n },\n {\n value: 'PA',\n label: 'Pennsylvania'\n },\n {\n value: 'RI',\n label: 'Rhode Island'\n },\n {\n value: 'SC',\n label: 'South Carolina'\n },\n {\n value: 'SD',\n label: 'South Dakota'\n },\n {\n value: 'TN',\n label: 'Tennessee'\n },\n {\n value: 'TX',\n label: 'Texas'\n },\n {\n value: 'UT',\n label: 'Utah'\n },\n {\n value: 'VA',\n label: 'Virginia'\n },\n {\n value: 'VT',\n label: 'Vermont'\n },\n {\n value: 'WA',\n label: 'Washington'\n },\n {\n value: 'WI',\n label: 'Wisconsin'\n },\n {\n value: 'WV',\n label: 'West Virginia'\n },\n {\n value: 'WY',\n label: 'Wyoming'\n }\n];\n\nexport const countries = [\n {\n label: 'United States',\n value: 'US'\n },\n {\n label: 'Canada',\n value: 'CA'\n }\n];\n\nexport const MONTHS = [\n {\n label: 'JANUARY',\n value: '01'\n },\n {\n label: 'FEBRUARY',\n value: '02'\n },\n {\n label: 'MARCH',\n value: '03'\n },\n {\n label: 'APRIL',\n value: '04'\n },\n {\n label: 'MAY',\n value: '05'\n },\n {\n label: 'JUNE',\n value: '06'\n },\n {\n label: 'JULY',\n value: '07'\n },\n {\n label: 'AUGUST',\n value: '08'\n },\n {\n label: 'SEPTEMBER',\n value: '09'\n },\n {\n label: 'OCTOBER',\n value: '10'\n },\n {\n label: 'NOVEMBER',\n value: '11'\n },\n {\n label: 'DECEMBER',\n value: '12'\n }\n];\n\nexport const YEARS = [\n {\n label: '2020',\n value: '2020'\n },\n {\n label: '2021',\n value: '2021'\n },\n {\n label: '2022',\n value: '2022'\n },\n {\n label: '2023',\n value: '2023'\n },\n {\n label: '2024',\n value: '2024'\n },\n {\n label: '2025',\n value: '2025'\n },\n {\n label: '2026',\n value: '2026'\n },\n {\n label: '2027',\n value: '2027'\n },\n {\n label: '2028',\n value: '2028'\n },\n {\n label: '2029',\n value: '2029'\n },\n {\n label: '2030',\n value: '2030'\n },\n {\n label: '2031',\n value: '2031'\n },\n {\n label: '2032',\n value: '2032'\n },\n {\n label: '2033',\n value: '2033'\n },\n {\n label: '2034',\n value: '2034'\n },\n {\n label: '2035',\n value: '2035'\n },\n {\n label: '2035',\n value: '2035'\n }\n];\n\nexport const DEFAULT_DC_TERMINAL_TEMPRATURE_RATING = [\n {\n label: '75°C',\n value: '75'\n },\n {\n label: '60°C',\n value: '60'\n }\n];\n\nexport const DEFAULT_AC_TERMINAL_TEMPERATURE_RATING = [\n {\n label: '75°C',\n value: '75'\n },\n {\n label: '60°C',\n value: '60'\n }\n];\n\nexport const DEFAULT_CONDUCTOR_TYPE = [\n {\n value: 'UL_RHW_2',\n label: 'RHW-2'\n },\n {\n value: 'UL_THWN_2',\n label: 'THWN-2'\n },\n {\n value: 'UL_XHHW_2',\n label: 'XHHW-2'\n }\n];\n\nexport const CONDUIT_TYPE_FOR_INTERIOR_APPLICATIONS = [\n {\n value: 'EMT',\n label: 'EMT'\n },\n {\n value: 'RMC',\n label: 'Rigid Steel'\n },\n {\n value: 'GRC',\n label: 'Galvanized Rigid Steel'\n },\n {\n value: 'FMC',\n label: 'Flexible Steel'\n },\n {\n value: 'LFMC',\n label: 'LFMC'\n }\n];\n\nexport const CONDUIT_TYPE_FOR_EXTERIOR_APPLICATIONS = [\n {\n value: 'EMT',\n label: 'EMT'\n },\n {\n value: 'RMC',\n label: 'Rigid Steel'\n },\n {\n value: 'FMC',\n label: 'Flexible Steel'\n },\n {\n value: 'LFMC',\n label: 'LFMC'\n },\n {\n value: 'LFNC',\n label: 'LFNC'\n },\n {\n value: 'PVC_40',\n label: 'PVC-40'\n },\n {\n value: 'PVC_80',\n label: 'PVC-80'\n }\n];\n\nexport const MIN_CONDUTOR_SIZE_FOR_PV_SOURCE_CIRCUITS = [\n {\n value: 'WG_12_AWG',\n label: '12 AWG'\n },\n {\n value: 'WG_10_AWG',\n label: '10 AWG'\n },\n {\n value: 'WG_8_AWG',\n label: '8 AWG'\n }\n];\n\nexport const MIN_CONDUCTOR_SIZE_FOR_AC_BRANCH_SOURCE_CIRCUITS = [\n {\n value: 'WG_12_AWG',\n label: '12 AWG'\n },\n {\n value: 'WG_10_AWG',\n label: '10 AWG'\n },\n {\n value: 'WG_8_AWG',\n label: '8 AWG'\n }\n];\n\nexport const MIN_OCPD_FOR_PV_SOURCE_CIRCUITS = [\n {\n value: '1',\n label: '1A'\n },\n {\n value: '2',\n label: '2A'\n },\n {\n value: '3',\n label: '3A'\n },\n {\n value: '4',\n label: '4A'\n },\n {\n value: '5',\n label: '5A'\n },\n {\n value: '6',\n label: '6A'\n },\n {\n value: '7',\n label: '7A'\n },\n {\n value: '8',\n label: '8A'\n },\n {\n value: '9',\n label: '9A'\n },\n {\n value: '10',\n label: '10A'\n },\n {\n value: '15',\n label: '15A'\n },\n {\n value: '20',\n label: '20A'\n }\n];\n\nexport const MIN_VOLTAGE_DROP_IN_PERCENT = 0.5;\nexport const MAX_VOLTAGE_DROP_IN_PERCENT = 5;\n\nexport const WATERMARK = [\n {\n value: 'NONE',\n label: 'None'\n },\n {\n value: 'NOT_FOR_CONSTRUCTION',\n label: 'Not For Construction'\n },\n {\n value: 'FOR_QUOTING_ONLY',\n label: 'For Quoting Only'\n },\n {\n value: 'DRAFT_PRINT',\n label: 'Draft Print'\n },\n {\n value: 'PRELIMINARY',\n label: 'Preliminary'\n }\n];\n\nexport const MAP_STYLE = [\n {\n value: 'NONE',\n label: 'None'\n },\n {\n value: 'AERIAL_MAP',\n label: 'Aerial Image'\n },\n {\n value: 'ROAD_MAP',\n label: 'Street Map'\n }\n];\n\nexport const MESSAGE_BACKGROUND_COLOR = {\n success: 'rgba(31, 192, 192, 0.25)',\n error: 'rgba(255, 115, 110, 0.25)',\n warning: 'rgb(255,173,110, 0.25)',\n info: 'rgb(110,163,255, 0.25)'\n};\n\nexport const MESSAGE_BORDER_COLOR = {\n success: '#1fc0c0',\n error: '#ff736e',\n warning: '#ffad6e',\n info: '#6ec5ff'\n};\n","import type { PropsTheme } from 'styled-components';\nimport styled from 'styled-components';\nimport type { Color } from '../../typings';\nimport { LyraFlexbox } from '../Common/LyraComponents';\n\nexport const HeaderContainer = styled.div`\n background: ${({ theme }: PropsTheme): Color => theme.colors.highlight};\n padding-left: 16px;\n padding-right: 16px;\n height: 70px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n`;\n\nexport const AvatarWrapper = styled.div`\n margin-right: 10px;\n`;\n\nexport const HeaderTitle = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n width: 85%;\n height: 100%;\n`;\n\nexport const HeaderContent = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: end;\n width: 15%;\n height: 100%;\n`;\n\nexport const UserIconContainer = styled(LyraFlexbox).attrs({\n justify: 'flex-end',\n align: 'center',\n stretch: 'auto'\n})`\n cursor: pointer;\n`;\n\nexport const Dropdown = styled.div`\n box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);\n background-color: ${({ theme }: PropsTheme): Color => theme.colors.highlight};\n position: absolute;\n top: 60px;\n z-index: 100;\n border-radius: 5px;\n padding: 10px;\n right: 0.5%;\n`;\n\nexport const DropdownItem = styled(LyraFlexbox).attrs({\n justify: 'flex-start',\n align: 'center',\n position: 'absolute'\n})`\n width: 170px;\n height: 50px;\n cursor: pointer;\n &:hover {\n background: rgba(0, 0, 0, 0.1);\n }\n`;\n","import { observer } from 'mobx-react-lite';\nimport type {\n FC, ReactElement\n} from 'react';\nimport React, {\n useEffect, useRef, useState\n} from 'react';\nimport {\n useHistory, useLocation\n} from 'react-router-dom';\nimport Avatar from '../../components/Avatar/Avatar';\nimport {\n HEADER_ITEM_LOGOUT, HEADER_ITEM_PREFERENCES, HEADER_ITEM_PROFILE, headerItems\n} from '../../constants';\nimport { useStore } from '../../stores';\nimport { getTitle } from '../../utils/helper';\nimport {\n LyraH1, LyraH4, LyraIcon\n} from '../Common/LyraComponents';\nimport {\n AvatarWrapper,\n Dropdown,\n DropdownItem,\n HeaderContainer,\n HeaderContent,\n HeaderTitle,\n UserIconContainer\n} from './styles';\n\ntype HeaderPopUpItemProps = {\n key: string;\n text: string;\n icon: string;\n};\n\nconst Header: FC = (): ReactElement => {\n const history = useHistory();\n const location = useLocation();\n const {\n auth, account\n } = useStore();\n const {\n isDesignCompany, user\n } = auth;\n const [modalOpen, setModalOpen] = useState(false);\n const [title, setTitle] = useState('');\n const [filteredHeaderItems, setFilteredHeaderItems] = useState([] as HeaderPopUpItemProps[]);\n\n useEffect((): void => {\n setTitle(getTitle(location.pathname));\n }, [location.pathname]);\n\n const handleClick = (key: string): void => {\n if (key === HEADER_ITEM_PROFILE) {\n setModalOpen(false);\n history.push('/profile');\n } else if (key === HEADER_ITEM_PREFERENCES) {\n setModalOpen(false);\n history.push('/preferences');\n } else if (key === HEADER_ITEM_LOGOUT) {\n auth.logout();\n history.push('/');\n }\n };\n\n const isMenuItemShown = (key: string): boolean => {\n return key != HEADER_ITEM_PREFERENCES || !isDesignCompany;\n };\n\n const userImage = auth.user && auth.user.picture;\n const userFullName = auth.user ? `${auth.user.firstName} ${auth.user.lastName}` : '';\n\n const ref = useRef(null);\n\n useEffect((): (() => void) => {\n const handleClickOutside = (event: MouseEvent): void => {\n if (modalOpen && ref.current && !ref.current.contains(event.target as Node)) {\n setModalOpen(false);\n }\n };\n\n document.addEventListener('click', handleClickOutside);\n\n return (): void => {\n document.removeEventListener('click', handleClickOutside);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [setModalOpen, modalOpen, ref.current]);\n\n useEffect((): void => {\n setFilteredHeaderItems(headerItems.filter((item: HeaderPopUpItemProps): boolean => isMenuItemShown(item.key)));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user]);\n\n return (\n \n \n {title}\n \n \n setModalOpen(!modalOpen)}>\n \n \n \n \n \n {modalOpen && (\n \n {filteredHeaderItems.map((item: HeaderPopUpItemProps) => {\n return (\n handleClick(item.key)}>\n \n {item.text}\n \n );\n })}\n \n )}\n \n \n );\n};\n\nexport default observer(Header);\n","import styled from 'styled-components';\n\nexport const Header = styled.div`\n text-align: center;\n`;\n\nexport const Footer = styled.div`\n text-align: center;\n margin-top: 50px;\n`;\n\nexport const CompanyFormWrapper = styled.div`\n height: 170px;\n flex: 1 0 auto;\n`;\n\nexport const ButtonContainer = styled.div`\n & .disabled {\n cursor: not-allowed;\n & button {\n opacity: 0.5;\n pointer-events: none;\n }\n }\n`;\n","import { DropDownProxy as LyraDropDownProxy } from '@aurorasolar/lyra-ui-kit/lib/components/DropDownProxy/DropDownProxy';\nimport type {\n FC, ReactElement\n} from 'react';\nimport React, {\n useCallback, useState\n} from 'react';\nimport { ButtonStyleType } from '@aurorasolar/lyra-ui-kit/lib/components/Buttons/styles';\nimport {\n ACCOUNT_TYPES, DROPDOWN_PORTAL_ID, PRIMARY_USE_OPTIONS\n} from '../../../../constants';\nimport type { IInitAccountParams } from '../../../../services/AuthService';\nimport { useStore } from '../../../../stores';\nimport { classnames } from '../../../../utils/helper';\nimport { AlertMessage } from '../../../AlertMessage/AlertMessage';\nimport {\n LyraButton, LyraInput\n} from '../../../Common/LyraComponents';\nimport {\n HeaderTitle, PaddingView\n} from '../../../Common/styles';\nimport { ModalWrapper } from '../../index';\nimport {\n ButtonContainer, CompanyFormWrapper, Footer, Header\n} from './AccountSetupModal.styles';\n\ntype AccountSetupModalProps = {\n modalShow: boolean;\n showEmailConfirmed?: boolean;\n emailConfirmedMessage?: string;\n setModalShow: (arg0: boolean) => void;\n};\n\nconst AccountSetupModal: FC = ({\n modalShow,\n setModalShow,\n showEmailConfirmed,\n emailConfirmedMessage,\n}: AccountSetupModalProps): ReactElement => {\n const { auth: authStore } = useStore();\n const [loading, setLoading] = useState(false);\n const [success, setSuccess] = useState(false);\n const [error, setError] = useState(false);\n\n const [accountTypeValue, setAccountTypeValue] = useState('INSTALLATION_COMPANY');\n const [companyName, setCompanyName] = useState('');\n const [primaryUseValue, setPrimaryUseValue] = useState('PERMIT_PACKAGES');\n\n const isInstaller = accountTypeValue === 'INSTALLATION_COMPANY';\n\n const completeSetupButtonHandler = useCallback(async () => {\n try {\n setLoading(true);\n const params: IInitAccountParams = {\n accountType: accountTypeValue\n };\n if (isInstaller) {\n params.companyName = companyName;\n params.primaryUse = primaryUseValue;\n }\n\n await authStore.completeAccountSetup(params);\n\n setLoading(false);\n setError(false);\n setSuccess(true);\n setModalShow(false);\n } catch (err) {\n setLoading(false);\n setError(true);\n }\n }, [authStore, accountTypeValue, isInstaller, companyName, primaryUseValue, setModalShow]);\n\n const onAccountTypeSelect = useCallback((value: string): void => {\n if (value !== accountTypeValue) {\n setCompanyName('');\n setAccountTypeValue(value);\n }\n }, [accountTypeValue]);\n\n const onPrimaryUseSelect = useCallback((value: string): void => {\n setPrimaryUseValue(value);\n }, []);\n\n const modalStyles: React.CSSProperties = {\n top: '20%',\n left: '30%',\n right: '30%',\n bottom: '20%',\n display: 'flex',\n flexDirection: 'column'\n };\n const isAccountTypeEmpty = !accountTypeValue;\n const isCompanyEmpty = accountTypeValue === 'INSTALLATION_COMPANY' && (!companyName || !primaryUseValue);\n\n const buttonClassNames = classnames({\n disabled: isAccountTypeEmpty || isCompanyEmpty,\n });\n\n return (\n \n
\n Set up your Lyra account\n
\n \n\n \n \n \n \n {isInstaller && (\n
\n \n ): void =>\n setCompanyName(event.target.value)\n }\n />\n \n \n \n \n
\n )}\n
\n
\n \n \n GET STARTED!\n \n \n
\n \n );\n};\n\nAccountSetupModal.defaultProps = {\n showEmailConfirmed: false,\n emailConfirmedMessage: ''\n};\n\nexport { AccountSetupModal };\n","import type {\n FC, ReactElement\n} from 'react';\nimport React, {\n useEffect, useState\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { validRoutes } from '../../config/config';\nimport { useStore } from '../../stores';\nimport {\n AppContainer, MainWrapper\n} from '../Common/styles';\nimport { NotFound } from '../Errors/NotFound/NotFound';\nimport Header from '../Header';\nimport { AccountSetupModal } from '../Modal/modals/AccountSetupModal/AccountSetupModal';\nimport { Sidebar } from '../SideBar';\n\ntype ContainerProps = {\n children: React.ReactNode;\n};\n\nconst MainContainer: FC = ({ children }: ContainerProps): ReactElement => {\n const location = useLocation();\n const {\n auth: {\n user, isHomeowner, isDesignCompany\n }\n } = useStore();\n const [modalShow, setModalShow] = useState(false);\n\n const routeIsValid = validRoutes.some((route: RegExp) => route.test(location.pathname));\n const isNotFoundPageIsShownForHomeowner = isHomeowner && /account\\/company\\/edit/.test(location.pathname);\n\n useEffect(() => {\n if (routeIsValid) {\n setModalShow(!user?.account);\n }\n }, [user]);\n\n return (\n \n {routeIsValid && !isNotFoundPageIsShownForHomeowner\n ? <>\n \n \n
\n {children}\n \n \n \n : <>\n \n \n \n \n \n }\n \n );\n};\n\nexport { MainContainer };\n","import { observer } from 'mobx-react-lite';\nimport type {\n ReactElement, ReactNode\n} from 'react';\nimport React from 'react';\nimport type { RouteProps } from 'react-router-dom';\nimport {\n Redirect, Route, useLocation\n} from 'react-router-dom';\nimport { useStore } from '../../stores';\n\ninterface IPrivateRouteProps extends RouteProps {\n component: React.ComponentClass | React.FC;\n}\n\nconst PrivateRoute: React.FC = (props: IPrivateRouteProps): ReactElement => {\n const {\n component: Component, ...rest\n } = props;\n const { auth } = useStore();\n const location = useLocation();\n\n const renderComponent = (routeProps: RouteProps): ReactNode => {\n if (auth.isAuthorized) {\n return ;\n }\n\n // Redirect to Login page\n // if user not authorized;\n return ;\n };\n\n return (\n \n );\n};\n\nexport default observer(PrivateRoute);\n","import config from '../../config/config';\nimport { canUseDOM } from '../../utils/helper';\n\n/**\n * A function that dynamically loads an external HubSpot script\n */\nconst loadHubSpotScriptIfNeeded = (): void => {\n const hubSpotScriptElementId = 'hs-script-loader';\n\n // If HubSpot is not enabled, or we can't use DOM, then no need to do anything\n if (!config.hubSpot.enabled || !canUseDOM()) {\n // eslint-disable-next-line no-console\n console.log(`HubSpot enabled: ${config.hubSpot.enabled}, DOM can be used ${canUseDOM()}`);\n return;\n }\n if (window.document.getElementById(hubSpotScriptElementId)) {\n // eslint-disable-next-line no-console\n console.log('HubSpot script is already present in DOM');\n return;\n }\n\n /*\n * HubSpot docs suggest loading the script like this:\n *\n * \n *\n * We do it the same way, except we create it dynamically, and then insert it next to the other scripts on the page\n */\n const hubSpotLoadingScript = window.document.createElement('script');\n hubSpotLoadingScript.type = 'text/javascript';\n hubSpotLoadingScript.async = true;\n hubSpotLoadingScript.defer = true;\n hubSpotLoadingScript.src = `//js.hs-scripts.com/${config.hubSpot.hubId}.js`;\n\n const firstScript = window.document.getElementsByTagName('script')[0];\n firstScript.parentNode!.insertBefore(hubSpotLoadingScript, firstScript);\n\n // eslint-disable-next-line no-console\n console.log('HubSpot script inserted into DOM');\n};\n\nexport default loadHubSpotScriptIfNeeded;\n","import type {\n FC, ReactElement\n} from 'react';\nimport React, { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nconst titleBasedOnLocation = (path: string): string => {\n if (/account\\/company\\/edit/.test(path)) {\n return 'Company Info - Lyra Solar';\n }\n if (/account\\/payment\\/edit/.test(path)) {\n return 'Payment Info - Lyra Solar';\n }\n if (/account/.test(path)) {\n return 'Account - Lyra Solar';\n }\n if (/dashboard/.test(path)) {\n return 'Dashboard - Lyra Solar';\n }\n if (/forgot-password/.test(path)) {\n return 'Forgot Password - Lyra Solar';\n }\n if (/preferences/.test(path)) {\n return 'Preferences - Lyra Solar';\n }\n if (/profile/.test(path)) {\n return 'Profile - Lyra Solar';\n }\n if (/projects/.test(path)) {\n return '';\n }\n if (/register/.test(path)) {\n return 'Register - Lyra Solar';\n }\n if (/users/.test(path)) {\n return 'Users - Lyra Solar';\n }\n\n return 'Lyra Solar';\n};\n\nconst TitleUpdater: FC = (): ReactElement => {\n const location = useLocation();\n\n useEffect(() => {\n const newTitle = titleBasedOnLocation(location.pathname);\n\n if (newTitle) {\n document.title = newTitle;\n }\n }, [location]);\n\n return <>;\n};\n\nconst thrower = (n?: number): void => {\n throw new Error(n ? 'host app instant error' : 'host app error');\n};\n\nexport const throwWrapper = (n?: number): void => {\n thrower(n);\n};\n\nexport default TitleUpdater;\n","import type {\n FC, ReactElement\n} from 'react';\nimport React, {\n Suspense, lazy, useEffect\n} from 'react';\nimport {\n BrowserRouter as Router, Route, Switch\n} from 'react-router-dom';\nimport { createGlobalStyle } from 'styled-components';\nimport {\n defaultThemeConfig, LyraTheme\n} from '../components/Common/LyraComponents';\nimport { LoadingIndicator } from '../components/LoadingIndicator';\nimport { MainContainer } from '../components/MainContainer';\nimport { MODAL_PORTAL_ID } from '../components/Modal';\nimport PrivateRoute from '../components/Router/PrivateRoute';\nimport { DROPDOWN_PORTAL_ID } from '../constants';\nimport { useStore } from '../stores';\nimport loadHubSpotScriptIfNeeded from '../services/hubspot/hubspot-initial';\nimport TitleUpdater, { throwWrapper } from './TitleUpdater';\n\nconst Account = lazy(() => import('./Account'));\nconst Login = lazy(() => import('./auth/Login'));\nconst Register = lazy(() => import('./auth/Register'));\nconst ForgotPassword = lazy(() => import('./auth/ForgotPassword'));\nconst Dashboard = lazy(() => import('./Dashboard'));\nconst DesignTool = lazy(() => import('./DesignTool/DesignTool'));\nconst EditCompany = lazy(() => import('./EditCompany'));\nconst EditPayment = lazy(() => import('./EditPayment'));\nconst EditUser = lazy(() => import('./EditUser'));\nconst Preferences = lazy(() => import('./Preferences'));\nconst Users = lazy(() => import('./Users'));\n\nconst HostAppGlobalStyles = createGlobalStyle`\n body {\n line-height: 1;\n margin: 0;\n padding: 0;\n min-height: 100vh;\n max-height: 100vh;\n }\n \n #app {\n min-height: 100vh;\n max-height: 100vh;\n }\n`;\n\nconst hostAppThemeConfig = {\n ...defaultThemeConfig,\n colors: {\n ...defaultThemeConfig.colors,\n mainColor1: '#2D80EF',\n searchIconGray: '#cfcfcf',\n alpha1: 'rgba(45, 128, 239, 0.5)',\n alpha2: 'rgba(133, 133, 133, 0.5)'\n },\n fonts: {\n fontFamily: 'Mukta, sans serif'\n }\n};\n\nconst App: FC = (): ReactElement => {\n useEffect(() => {\n // Insert HubSpot Javascript into DOM if HubSpot is enabled\n loadHubSpotScriptIfNeeded();\n }, []);\n\n // Initialize user session in case if user already authorized and checked \"Remember me\" checkmark during login.\n const { auth: authStore } = useStore();\n useEffect(() => {\n try {\n authStore.restoreSession();\n } catch (error) {\n // Sometimes user can accidentally change session data in local storage, and it is not possible\n // to restore the session. In such case, we just fallback to /login, to re-write local storage data.\n // eslint-disable-next-line no-console\n console.error('Session exists, but not possible to restore. Probably session object is broken.', error);\n }\n }, [authStore]);\n\n let CrushButton = <>;\n if (sessionStorage.getItem('sentryTestDrive') === 'on') {\n CrushButton = (\n {\n throwWrapper();\n }}\n >\n Break host app\n \n );\n }\n\n useEffect(() => {\n if (sessionStorage.getItem('sentryTestDrive.host.instant') === 'on') {\n throwWrapper(2);\n }\n }, []);\n\n return (\n <>\n \n \n {CrushButton}\n \n \n }>\n \n \n\n {/* TODO: remove index.html route in favor of htaccess rewrite rule */}\n \n\n \n \n \n\n \n\n {/* TODO: Refactor router to have two different types of the layout */}\n \n \n\n \n \n\n \n \n \n \n \n \n \n\n
\n
\n \n \n \n );\n};\n\nexport default App;\n","import type { IDropDownOption } from '@aurorasolar/lyra-ui-kit/lib/components/DropDownNew';\nimport isEmpty from 'lodash/isEmpty';\nimport {\n action, computed, observable\n} from 'mobx';\nimport type {\n IBillingConfigurationResponse, IInvoiceConfiguration, IPaymentCardSaved\n} from '../models/IBillingConfigurationResponse';\nimport type { IInstaller } from '../models/IInstaller';\nimport type { ITitleBlockOption } from '../models/Preferences';\nimport type { IInstallerOption } from '../services/DesignService';\nimport DesignService from '../services/DesignService';\nimport type { IStripeSetupIntentData } from '../services/DocumentsService';\nimport DocumentsService from '../services/DocumentsService';\nimport type { IMobxStore } from '../typings';\n\nconst addWhitespaceSuffixIfNotEmpty = (input: string): string => {\n if (input.trim()) {\n return `${input} `;\n }\n return '';\n};\n\nconst addComaAndWhitespaceSuffixIfNotEmpty = (input: string): string => {\n if (input.trim()) {\n return `${input}, `;\n }\n return '';\n};\n\nclass AccountStore implements IMobxStore {\n isBillingLoading: boolean = false;\n isInstallerLoading: boolean = false;\n isLogoLoading: boolean = false;\n @observable currentInstaller: IInstaller = {} as IInstaller;\n @observable billingInfo: IBillingConfigurationResponse = {} as IBillingConfigurationResponse;\n @observable isLoading: boolean = false;\n @observable companyInfo: IInstaller = {} as IInstaller;\n @observable isLogoPresent: boolean = false;\n @observable installerOptions: IInstallerOption[];\n @observable titleBlockOptions: IDropDownOption[] = [];\n\n @computed get installerLoaded(): boolean {\n return !isEmpty(this.currentInstaller);\n }\n\n @computed get isBillingInfoFilled(): boolean {\n return !isEmpty(this.billingInfo);\n }\n\n @computed get isCompanyInfoFilled(): boolean {\n return !isEmpty(this.companyInfo);\n }\n\n @computed\n get isAddressPresent(): boolean {\n const { address } = this.companyInfo;\n\n return !!address;\n }\n\n @computed\n get currentInstallerId(): string {\n return this.currentInstaller.id;\n }\n\n @computed\n get fullCompanyAddress(): string {\n const { address } = this.companyInfo;\n\n if (!address) {\n return 'US';\n }\n\n const addressPart =\n addWhitespaceSuffixIfNotEmpty(address.addressOne ?? '')\n + (address.addressTwo ?? '');\n\n const cityPart = address.city ?? '';\n\n const statePart =\n `${addWhitespaceSuffixIfNotEmpty(address.province ?? '')\n + addWhitespaceSuffixIfNotEmpty(address.postalCode ?? '')\n }US`;\n\n return addComaAndWhitespaceSuffixIfNotEmpty(addressPart.trim())\n + addComaAndWhitespaceSuffixIfNotEmpty(cityPart)\n + statePart;\n }\n\n @computed\n get accountSingleInstallerId(): string | undefined {\n if (this.installerOptions?.length === 1) {\n return this.installerOptions[0].id;\n }\n }\n\n @action getInstaller = async (installerId: string): Promise => {\n this.isInstallerLoading = true;\n this.isLoading = true;\n try {\n const response = await DesignService.getInstaller(installerId);\n this.currentInstaller = response;\n // FIXME: remove this after merge:\n this.companyInfo = response;\n\n this.isInstallerLoading = false;\n this.isLoading = this.isBillingLoading || this.isLogoLoading || this.isInstallerLoading;\n } catch (e) {\n this.isInstallerLoading = false;\n this.isLoading = this.isBillingLoading || this.isLogoLoading || this.isInstallerLoading;\n }\n };\n\n @action\n updateCurrentInstaller = async (installerObj: IInstaller): Promise => {\n return DesignService.updateInstaller(installerObj);\n };\n\n @action\n checkIfLogoPresent(accountId: string, installerId: string): void {\n this.isLogoLoading = true;\n this.isLoading = true;\n\n DocumentsService.getLogo(accountId, installerId)\n .then((): void => {\n this.isLogoPresent = true;\n })\n .catch((): void => {\n this.isLogoPresent = false;\n })\n .finally((): void => {\n this.isLogoLoading = false;\n this.isLoading = this.isBillingLoading || this.isLogoLoading || this.isInstallerLoading;\n });\n }\n\n @action updateLogo = async (data: File): Promise => {\n this.isLogoLoading = true;\n this.isLoading = true;\n return DocumentsService.updateLogo(this.currentInstaller.id, data)\n .then((): void => {\n this.isLogoPresent = true;\n this.isLogoLoading = false;\n this.isLoading = this.isBillingLoading || this.isLogoLoading || this.isInstallerLoading;\n });\n };\n\n @action deleteLogo = async (): Promise => {\n return DocumentsService.deleteLogo(this.currentInstaller.id)\n .then((): void => {\n this.isLogoPresent = false;\n });\n };\n\n @action getBillingInfo = (accountId: string): void => {\n this.isBillingLoading = true;\n this.isLoading = true;\n DocumentsService.getBillingInfo(accountId)\n .then((billingInfo: IBillingConfigurationResponse) => {\n this.billingInfo = billingInfo;\n })\n .finally(() => {\n this.isBillingLoading = false;\n this.isLoading = this.isBillingLoading || this.isLogoLoading || this.isInstallerLoading;\n });\n };\n\n @action\n changeInvoiceConfiguration = async (accountId: string, invoiceConfig: IInvoiceConfiguration): Promise => {\n return DocumentsService.changeInvoiceConfiguration(accountId, invoiceConfig);\n };\n\n @action updateCardInfo = (paymentCard: IPaymentCardSaved): void => {\n this.billingInfo.paymentCard = paymentCard;\n };\n\n @action createSetupIntent = async (accountId: string): Promise => {\n return DocumentsService.createSetupIntent(accountId);\n };\n\n @action loadInstallerOptions = async (): Promise => {\n this.installerOptions = await DesignService.getInstallerOptions();\n return this.installerOptions;\n };\n\n @action\n getTitleBlockOptions = async (): Promise => {\n const response = await DesignService.getTitleBlockOptions();\n\n this.titleBlockOptions = response.map((item: ITitleBlockOption): IDropDownOption => ({\n value: item.attributes.value,\n label: item.attributes.name\n }));\n\n return this.titleBlockOptions;\n };\n}\n\nexport default AccountStore;\n","import config from '../config/config';\nimport type {\n ILoginParams, ISessionInfo, ISignUpParams, IUser\n} from '../stores/AuthStore';\nimport type { IHttpServiceParams } from './generic/HttpService';\nimport HttpService from './generic/HttpService';\n\nexport interface IInitAccountParams {\n accountType: string;\n companyName?: string;\n primaryUse?: string;\n}\n\nclass AuthService extends HttpService {\n constructor(params: IHttpServiceParams) {\n super(params);\n }\n\n login = (params: ILoginParams): Promise => {\n return this.post({\n url: '/sessions',\n data: params,\n withAuth: false,\n });\n };\n\n signUp = (params: ISignUpParams): Promise => {\n return this.post({\n url: '/users',\n data: params,\n withAuth: false,\n showErrorsToUser: true,\n });\n };\n\n passwordReset = (email: string): Promise => {\n return this.post({\n url: '/password-reset-requests',\n data: { email },\n withAuth: false,\n });\n };\n\n completeAccountSetup = (params: IInitAccountParams): Promise => {\n return this.put({\n url: '/accounts/current/first-time-settings',\n data: params\n });\n };\n\n getProfile = (): Promise => {\n return this.get<{}, IUser>({\n url: '/users/current/profile-info',\n });\n };\n\n updateProfile = (user: IUser): Promise => {\n return this.put({\n url: '/users/current/profile-info',\n data: user\n });\n };\n}\n\nexport default new AuthService({\n baseURL: config.api.host\n});\n","import {\n action, computed, observable\n} from 'mobx';\nimport {\n ACCESS_TOKEN_EXP_KEY, ACCESS_TOKEN_KEY, USER_DATA_KEY\n} from '../constants/auth';\nimport analytics from '../services/analytics';\nimport type { IInitAccountParams } from '../services/AuthService';\nimport AuthService from '../services/AuthService';\nimport SessionService from '../services/generic/SessionService';\nimport type RootStore from '../stores/RootStore';\nimport type { IMobxStore } from '../typings';\nimport { CrmIdentityProperties } from '../utils/analytics';\nimport {\n cookies, secureStorage\n} from '../utils/storage';\nimport {\n AccountSetupCompletedEvent,\n LoggedInEvent,\n LoggedOutEvent,\n PasswordResetRequestedEvent,\n SignedUpEvent,\n UserProfileUpdatedEvent\n} from '../services/analytics/AnalyticsEvents';\nimport liveChatService from '../services/live-chat/LiveChatService';\n\nexport type TPrimaryUse = 'PERMIT_PACKAGES' | 'PROPOSALS';\nexport type TAccountType = 'INSTALLATION_COMPANY' | 'HOMEOWNER' | 'DESIGN_COMPANY';\n\nexport interface IUser {\n id: string;\n account?: IAccount;\n firstName: string;\n lastName: string;\n picture: string;\n email: string;\n phoneNumber?: string;\n primaryUse?: TPrimaryUse;\n accountAdmin?: boolean;\n applicationAdmin?: boolean;\n}\n\ninterface IAccount {\n id: string;\n type?: TAccountType;\n installer?: string;\n}\n\nexport interface IAccessToken {\n value: string;\n expiration: number;\n}\n\nexport interface ISessionInfo {\n accessToken: IAccessToken;\n user: IUser;\n /**\n * No account field present in session response indicates the user has not yet passed initial account setup\n */\n account?: IAccount;\n}\n\nexport interface ILoginParams {\n email: string;\n password: string;\n rememberMe?: boolean;\n}\n\nexport interface ISignUpParams extends ILoginParams {\n firstName: string;\n lastName: string;\n}\n\nclass AuthStore implements IMobxStore {\n @observable user: IUser = {} as IUser;\n @observable accessTokenExp: number = 0;\n @observable loginError: string | null = null;\n @observable signUpError: string | null = null;\n @observable resetError: string | null = null;\n @observable updateAccountError: string | null = null;\n @observable passResetError: string | null = null;\n @observable passResetDone: boolean = false;\n @observable isLoading: boolean = false;\n\n private readonly rootStore: RootStore;\n\n constructor(rootStore: RootStore) {\n this.rootStore = rootStore;\n window.addEventListener('LyraConfirmModalClosed', () => {\n this.passResetDone = false;\n });\n }\n\n @computed\n get tokenIsValid(): boolean {\n const currentTimeStamp = Math.round(Date.now() / 1000);\n return this.accessTokenExp > currentTimeStamp;\n }\n\n @computed\n get isAuthorized(): boolean {\n const tokenExist = !!SessionService.accessToken && !!this.accessTokenExp;\n return tokenExist && this.tokenIsValid;\n }\n\n @computed\n get isApplicationAdmin(): boolean {\n return this.user?.applicationAdmin === true;\n }\n\n @computed\n get isInstallationCompany(): boolean {\n return this.user?.account?.type === 'INSTALLATION_COMPANY';\n }\n\n @computed\n get isHomeowner(): boolean {\n return this.user?.account?.type === 'HOMEOWNER';\n }\n\n @computed\n get isDesignCompany(): boolean {\n return this.user?.account?.type === 'DESIGN_COMPANY';\n }\n\n @computed\n get accountId(): string {\n return this.user?.account?.id || '';\n }\n\n /**\n * This method is called once on app start, to check if user is already authenticated or not.\n */\n @action\n restoreSession = (): void => {\n // eslint-disable-next-line no-console\n console.log('Attempting to restore session');\n const accessToken = secureStorage.get(ACCESS_TOKEN_KEY);\n const accessTokenExpStr = secureStorage.get(ACCESS_TOKEN_EXP_KEY);\n const user = secureStorage.get(USER_DATA_KEY) || cookies.get(USER_DATA_KEY);\n if (accessToken && accessTokenExpStr && user) {\n this.accessTokenExp = parseInt(accessTokenExpStr, 10);\n const {\n account: accountData, ...userWithoutAccountData\n } = user;\n const sessionData = {\n user: userWithoutAccountData,\n account: accountData,\n accessToken: {\n value: accessToken,\n expiration: accessTokenExpStr\n }\n };\n\n if (this.tokenIsValid) {\n this.handleSessionData(sessionData, true);\n this.rootStore.account.loadInstallerOptions();\n } else {\n this.resetTokenState();\n }\n } else if (user) {\n this.user = user;\n // Identify who is visiting/returning without an accessToken\n const identifyCrmId = analytics.analyticsSessionId() || user?.id;\n analytics.identify(CrmIdentityProperties(user, identifyCrmId));\n } else {\n // Here we call analyticsSessionId to check for valid CRM id, then we make\n // an empty identify() call in case there is a valid CRM user being synced\n analytics.analyticsSessionId();\n analytics.identify();\n }\n // Initialize live chat widget\n if (this.tokenIsValid && this.user.email) {\n liveChatService.setUpChatWidgetForAuthenticatedUser(this.user.email);\n } else {\n liveChatService.setUpChatWidgetForAnonymousVisitor();\n }\n };\n\n @action\n login = async (params: ILoginParams): Promise => {\n const {\n rememberMe, ...otherParams\n } = params;\n try {\n const sessionInfo: ISessionInfo = await AuthService.login(otherParams);\n const identifyCrmId = analytics.analyticsSessionId() || this.user.id;\n // adding user email to the response for easier use later\n sessionInfo.user.email = params.email;\n this.handleSessionData(sessionInfo, rememberMe);\n this.rootStore.account.loadInstallerOptions();\n analytics.trackEvent(new LoggedInEvent(sessionInfo.user, identifyCrmId));\n liveChatService.setUpChatWidgetForAuthenticatedUser(params.email);\n } catch (e) {\n this.signUpError = (e as Error).message;\n }\n };\n\n @action\n signUp = async (params: ISignUpParams): Promise => {\n try {\n const signedUpUserSessionInfo: ISessionInfo = await AuthService.signUp(params);\n const identifyCrmId = analytics.analyticsSessionId() || signedUpUserSessionInfo.user.id;\n analytics.identify(CrmIdentityProperties(signedUpUserSessionInfo.user, identifyCrmId));\n analytics.trackEvent(new SignedUpEvent(signedUpUserSessionInfo.user, identifyCrmId));\n this.rootStore.lead.convertLead(signedUpUserSessionInfo.user, identifyCrmId);\n } catch (e) {\n this.signUpError = (e as Error).message;\n throw e;\n }\n };\n\n @action\n passwordReset = async (email: string): Promise => {\n try {\n await AuthService.passwordReset(email);\n this.passResetDone = true;\n analytics.trackEvent(new PasswordResetRequestedEvent(email));\n } catch (e) {\n this.resetError = (e as Error).message;\n }\n };\n\n @action\n logout = (): void => {\n const identifyCrmId = analytics.analyticsSessionId() || this.user.id;\n analytics.trackEvent(new LoggedOutEvent(this.user, identifyCrmId));\n this.resetTokenState();\n this.resetUserState();\n liveChatService.setUpChatWidgetForAnonymousVisitor();\n };\n\n /**\n * Reset access token state only to it's default values\n */\n @action\n private resetTokenState = (): void => {\n SessionService.updateToken(null, SessionService.rememberMe);\n this.accessTokenExp = 0;\n\n secureStorage.remove(ACCESS_TOKEN_KEY);\n secureStorage.remove(ACCESS_TOKEN_EXP_KEY);\n };\n\n /**\n * Reset all the the state to it's default values\n */\n @action\n private resetUserState = (): void => {\n this.user = {} as IUser;\n secureStorage.remove(USER_DATA_KEY);\n this.loginError = null;\n this.signUpError = null;\n this.resetError = null;\n analytics.reset();\n };\n\n @action\n completeAccountSetup = (params: IInitAccountParams): void => {\n AuthService.completeAccountSetup(params).then((sessionInfo: ISessionInfo) => {\n this.handleSessionData(sessionInfo, true);\n this.rootStore.account.loadInstallerOptions();\n const identifyCrmId = analytics.analyticsSessionId() || this.user.id;\n analytics.trackEvent(new AccountSetupCompletedEvent(this.user, identifyCrmId));\n this.rootStore.lead.resetLeadState();\n if (sessionInfo.account?.installer) {\n analytics.group(sessionInfo.account.id, { name: params.companyName });\n }\n });\n };\n\n @action\n private handleSessionData = (data: ISessionInfo, rememberMe = false): void => {\n const {\n accessToken, user, account\n } = data;\n const identifyCrmId = analytics.analyticsSessionId() || user.id;\n\n this.accessTokenExp = accessToken.expiration;\n\n // Store info about Account on User object for easier access\n this.user = {\n ...user,\n account\n };\n\n SessionService.updateToken(accessToken, rememberMe);\n SessionService.initSessionTimeout(this.accessTokenExp);\n SessionService.setUser(this.user);\n\n // This is used when user logs in first time.\n // But when user already logged in, we don't need to save token anymore.\n if (rememberMe) {\n secureStorage.set(USER_DATA_KEY, this.user);\n localStorage.setItem('_crm_id', identifyCrmId);\n cookies.set(\n USER_DATA_KEY,\n {\n ...user,\n account\n },\n {\n path: '/',\n sameSite: 'lax',\n maxAge: 60 * 60 * 24 * 90, // expires in 90 days,\n secure: true\n }\n );\n }\n\n // eslint-disable-next-line no-console\n console.log('analytics.identify if user.id', user.id);\n if (user.id) {\n analytics.identify(CrmIdentityProperties(this.user, identifyCrmId));\n }\n };\n\n @action\n refreshAccessToken = (): Promise => {\n return SessionService.refreshSession().then((session: ISessionInfo) => {\n this.handleSessionData(session);\n return session.accessToken.value;\n });\n };\n\n @action\n getProfile = (): Promise => {\n this.isLoading = true;\n return AuthService.getProfile()\n .then((user: IUser) => {\n this.user = {\n ...this.user,\n ...user\n };\n const identifyCrmId = analytics.analyticsSessionId() || this.user?.id;\n secureStorage.set(USER_DATA_KEY, this.user);\n localStorage.setItem('_crm_id', identifyCrmId);\n cookies.set(USER_DATA_KEY, user, {\n path: '/',\n sameSite: 'lax',\n maxAge: 60 * 60 * 24 * 90, // expires in 90 days in seconds,\n secure: true\n });\n })\n .finally(() => {\n this.isLoading = false;\n });\n };\n\n @action\n updateProfile = (userUpdateRequest: IUser): Promise => {\n // Merge current values with new values and always pass all user fields to BE, because it has strict validations\n const params = {\n primaryUse: this.user.primaryUse,\n ...userUpdateRequest\n };\n return AuthService.updateProfile(params)\n .then((userUpdateResponse: IUser) => {\n this.updateAccountError = '';\n // Note: User update response is not a full `IUser` object - it only has the profile fields\n const fullUpdatedUserObject = {\n ...this.user,\n ...userUpdateResponse\n };\n const identifyCrmId = analytics.analyticsSessionId() || fullUpdatedUserObject.id;\n analytics.identify(CrmIdentityProperties(fullUpdatedUserObject, identifyCrmId));\n analytics.trackEvent(new UserProfileUpdatedEvent(fullUpdatedUserObject, identifyCrmId));\n return userUpdateResponse;\n })\n .catch((e: Error) => {\n this.updateAccountError = e.message;\n });\n };\n}\n\nexport default AuthStore;\n","import {\n action, computed, observable\n} from 'mobx';\nimport type {\n ICustomerFullName,\n IOrderedProduct,\n IOrderedProductsResponse,\n IProject,\n IProjectsData,\n IProjectsResponse,\n IPurchasesData,\n ISearchParams,\n ProjectAddress\n} from '../models';\nimport DocumentsService from '../services/DocumentsService';\nimport type { ProjectCreationRequest } from '../services/HostAppService';\nimport HostAppService from '../services/HostAppService';\nimport type { IMobxStore } from '../typings';\nimport type RootStore from './RootStore';\n\nexport interface IEditProject {\n id?: string;\n internalReferenceId: string;\n customer?: ICustomerFullName;\n imagery?: {\n provider: string;\n zoomLevel: number;\n };\n address?: ProjectAddress;\n}\n\nclass DashboardStore implements IMobxStore {\n @observable projectsData: IProjectsData = {\n isLoading: false,\n more: false,\n page: -1,\n projects : {}\n };\n @observable purchasesData: IPurchasesData = {\n isLoading: false,\n more: false,\n page: -1,\n purchases : []\n };\n\n @observable searchAccountId: string = '';\n @observable searchQuery: string = '';\n @observable searchStartDate: Date | null = null;\n @observable searchEndDate: Date | null = null;\n @observable filter: string = '';\n @observable isLoading: boolean = false;\n @observable error: string | null = null;\n private rootStore: RootStore;\n\n constructor(rootStore: RootStore) {\n this.rootStore = rootStore;\n }\n\n /**\n * Determines the Account ID to be used when loading projects.\n */\n @computed get effectiveAccountId(): string {\n if (this.rootStore.auth.isApplicationAdmin\n && this.searchAccountId?.match(/^([0-9a-f]{8})-(([0-9a-f]{4}\\-){3})([0-9a-f]{12})$/i)\n ) {\n return this.searchAccountId;\n }\n return this.rootStore.auth.accountId;\n }\n\n @computed\n get isEmptyFilter(): boolean {\n return this.filter === ''\n && this.searchStartDate === null\n && this.searchEndDate === null;\n }\n\n @computed get userHasProjects(): boolean {\n return !!Object.keys(this.projectsData.projects).length;\n }\n\n @computed get userHasPurchases(): boolean {\n return !!this.purchasesData.purchases.length;\n }\n\n @computed get isProjectsListLoading(): boolean {\n return this.isLoading || this.projectsData.isLoading;\n }\n\n @computed get isPurchasesListLoading(): boolean {\n return this.isLoading || this.purchasesData.isLoading;\n }\n\n @action setFilter = (newFilter: string): void => {\n this.filter = newFilter;\n };\n\n @action checkIfDashboardLoading = (): void => {\n this.setIsDashboardDataLoading(this.projectsData.isLoading || this.purchasesData.isLoading);\n };\n\n @action setIsDashboardDataLoading = (flag: boolean): void => {\n this.isLoading = flag;\n };\n\n @action setIsProjectsDataLoading = (flag: boolean): void => {\n this.projectsData.isLoading = flag;\n };\n\n @action setIsPurchasesDataLoading = (flag: boolean): void => {\n this.purchasesData.isLoading = flag;\n };\n\n @action createProject = (project: ProjectCreationRequest): Promise => {\n return HostAppService.createProject(project);\n };\n\n @action editProject = (project: IEditProject): Promise => {\n return HostAppService.editProject(project);\n };\n\n @action deleteProject = (projectId: string): Promise => {\n return HostAppService.deleteProject(projectId);\n };\n\n @action resetDashboardData = (): void => {\n this.isLoading = false;\n this.projectsData = {\n isLoading: false,\n more: false,\n page: -1,\n projects : {}\n };\n this.purchasesData = {\n isLoading: false,\n more: false,\n page: -1,\n purchases: []\n };\n };\n\n @action refreshDashboardData = (): void => {\n this.resetDashboardData();\n this.setIsDashboardDataLoading(true);\n this.loadMoreProjectsData(true);\n this.loadMorePurchasesData(true);\n };\n\n @action loadMoreProjectsData = (isDashboardLoading?: boolean): void => {\n this.setIsProjectsDataLoading(true);\n this.projectsData.page = this.projectsData.page + 1;\n const params: ISearchParams = this.getSearchParameters(this.projectsData.page);\n this.filter = params.query || '';\n\n HostAppService.getProjectsData(this.effectiveAccountId, params)\n .then(this.normalizeProjectsResponse.bind(this))\n .finally(() => {\n this.setIsProjectsDataLoading(false);\n if (isDashboardLoading) {\n this.checkIfDashboardLoading();\n }\n });\n };\n\n @action loadMorePurchasesData = (isDashboardLoading?: boolean): void => {\n this.setIsPurchasesDataLoading(true);\n this.purchasesData.page = this.purchasesData.page + 1;\n const params: ISearchParams = this.getSearchParameters(this.purchasesData.page);\n this.filter = params.query || '';\n\n DocumentsService.getOrderedProductsData(this.effectiveAccountId, params)\n .then(this.loadPurchasesFromOrderedProductsResponse.bind(this))\n .finally(() => {\n this.setIsPurchasesDataLoading(false);\n if (isDashboardLoading) {\n this.checkIfDashboardLoading();\n }\n });\n };\n\n private normalizeProjectsResponse = (response: IProjectsResponse): void => {\n response.projects.forEach(\n (project: IProject) => this.projectsData.projects[project.id as string] = project\n );\n this.projectsData.more = response.more;\n };\n\n private loadPurchasesFromOrderedProductsResponse = (response: IOrderedProductsResponse): void => {\n response.orderedProducts.forEach(\n (orderedProduct: IOrderedProduct) => {\n this.purchasesData.purchases.push({\n id: orderedProduct.productId,\n name: orderedProduct.description[1],\n billingAddress: orderedProduct.description[0],\n date: new Date(orderedProduct?.timestamp).toLocaleDateString(),\n price: orderedProduct?.value ? `$${orderedProduct?.value}` : '',\n });\n }\n );\n this.purchasesData.more = response.more;\n };\n\n private getSearchParameters = (selectedPage: number): ISearchParams => {\n const params: ISearchParams = {\n query: this.searchQuery,\n from: this.searchStartDate?.getTime() ?? 0,\n to: this.searchEndDate?.getTime() ?? (new Date().getTime() + 60_000), // 1 minute is added here to account for clock skew\n page: selectedPage\n };\n return params;\n };\n}\n\nexport default DashboardStore;\n","import {\n action, computed, observable\n} from 'mobx';\nimport analytics from '../services/analytics';\nimport { LEAD_DATA_KEY } from '../constants/auth';\nimport type { IMobxStore } from '../typings';\nimport { secureStorage } from '../utils/storage';\nimport { LeadConvertedToUserEvent } from '../services/analytics/AnalyticsEvents';\nimport type { IUser } from './AuthStore';\n\nexport interface ILead {\n email?: string;\n name?: string;\n firstName?: string;\n lastName?: string;\n company?: string;\n source?: string;\n user_id?: string;\n web_key?: string;\n}\n\nclass LeadStore implements IMobxStore {\n @observable lead: ILead = {} as ILead;\n @observable isLoading: boolean = false;\n\n getLeadData(): ILead | undefined {\n if (Object.keys(this.lead).length > 1) {\n return this.lead;\n }\n\n const leadData = secureStorage.get(LEAD_DATA_KEY);\n if (!leadData) {\n return;\n }\n\n try {\n return JSON.parse(leadData);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Could not parse LEAD_DATA_KEY data.', error);\n }\n }\n @computed\n get isOnboarding(): boolean {\n const validSource = this.lead?.source?.match(/^(hubspot|website|article|campaign)$/);\n return !!(this.lead?.email && this.lead?.user_id && !!validSource);\n }\n @computed\n get isWebLogin(): boolean {\n const validSource = this.lead?.source === 'web_nav';\n const validWebKeyRegExp = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\n const webKey = this.lead?.web_key;\n const validWebKey = webKey && validWebKeyRegExp.test(webKey);\n return !!(validWebKey && validSource);\n }\n @action startOnboarding = (lead: ILead): void => {\n const sessionLead: ILead | undefined = this.getLeadData();\n const validNewLead = lead?.user_id ? lead : null;\n const validSessionLead = sessionLead?.user_id ? sessionLead : null;\n const validLead = validNewLead || validSessionLead;\n if (validLead) {\n this.lead = validLead;\n secureStorage.set(LEAD_DATA_KEY, JSON.stringify(validLead));\n localStorage.setItem('_crm_id', lead?.user_id || analytics.analyticsSessionId());\n }\n };\n @action getCurrentLead = (): ILead | undefined => {\n const sessionLead: ILead | undefined = this.getLeadData();\n if (sessionLead) {\n this.lead = sessionLead;\n }\n return sessionLead;\n };\n @action getLeadSession = () => {\n return analytics.analyticsSessionId();\n };\n @action convertLead = (user: IUser, identfiedCrmId: string): void => {\n const identifyCrmId = identfiedCrmId || analytics.analyticsSessionId();\n analytics.trackEvent(new LeadConvertedToUserEvent(user, identifyCrmId, this.lead));\n this.resetLeadState();\n };\n @action resetLeadState = (): void => {\n secureStorage.remove(LEAD_DATA_KEY);\n this.lead = {};\n };\n}\n\nexport default LeadStore;\n","/* eslint-disable */\n/**\n * Error logging\n *\n * Can be used to log errors to console or and external\n * error logging system, like Sentry.\n *\n */\nimport * as Sentry from '@sentry/react';\nimport {\n reportingObserverIntegration,\n extraErrorDataIntegration,\n captureConsoleIntegration\n} from '@sentry/integrations';\nimport config from '../config/config';\n\nconst arr = new Array();\nexport interface ApiError {\n error: string;\n exception: string;\n message: string;\n path: string;\n status: number;\n timestamp: number;\n code: string;\n length: number;\n meta: typeof arr;\n key: string;\n data: {\n errors: typeof arr;\n };\n}\ninterface ISignUpErrorResponse {\n error: string;\n exception: string;\n message: string;\n path: string;\n status: number;\n timestamp: number;\n}\n\nconst sentry = config.sentry;\nconst environment = config.environment;\nconst showErrorDialog = (code: ApiError['code']) => sentry.showDialog && !sentry.ignoredCodes.includes(code);\n\n/**\n * Set up error handling. If a Sentry DSN is\n * provided a Sentry client will be installed.\n */\nexport const SentrySetup = (): void => {\n if (sentry.enabled && sentry.dsn) {\n // Configures the Sentry client. Adds a handler for\n // any uncaught exception.\n Sentry.init({\n dsn: sentry.dsn,\n environment: sentry.environment,\n release: environment.host.version,\n autoSessionTracking: sentry.autoSessionTracking,\n maxBreadcrumbs: sentry.maxBreadcrumbs,\n attachStacktrace: sentry.attachStacktrace,\n tracesSampleRate: sentry.tracesSampleRate,\n transport: Sentry.makeBrowserOfflineTransport(Sentry.makeFetchTransport),\n transportOptions: {\n // limit how many events will be saved locally. Defaults to 30.\n maxQueueSize: sentry.maxStoredEvents\n },\n integrations: [\n new Sentry.BrowserTracing(),\n reportingObserverIntegration(),\n extraErrorDataIntegration({\n // limit of how deep the object serializer should go. Anything deeper than limit will\n // be replaced with standard Node.js REPL notation of [Object], [Array], [Function] or\n // a primitive value. Defaults to 3.\n depth: sentry.dataIntegrationDepth\n }),\n captureConsoleIntegration({\n // array of methods that should be captured\n // defaults to ['log', 'info', 'warn', 'error', 'debug', 'assert']\n levels: ['error', 'warn', 'debug']\n })\n ],\n /*\n * Note: Sentry will instrument matching requests and will add extra `sentry-trace` and `baggage` HTTP headers.\n * Matching patterns can be either regular expressions, or strings (the URL must contain given string).\n * By default it included 'localhost' string, and it caused issues when trying to load HubSpot chat widget,\n * because request URL included a query parameter with `localhost` in it. We don't want to trace such requests, so\n * it was replaced with a regex that expects `localhost` at the start of the URL.\n * See: https://docs.sentry.io/platforms/javascript/performance/instrumentation/automatic-instrumentation/#tracepropagationtargets\n */\n tracePropagationTargets: [/^http:\\/\\/localhost/, config.site.canonicalRootUrl, /^\\//]\n });\n console.log(`Sentry has been loaded for Lyra Host version ${environment.host.version}`);\n }\n};\n\n/**\n * Set user ID for the logger so that it\n * can be attached to Sentry issues.\n *\n * @param {String} userId ID of current user\n */\nexport const SentrySetUserId = (userId: string) => {\n Sentry.getCurrentScope().setUser({ id: userId });\n};\n\n/**\n * Clears the user ID.\n */\nexport const SentryClearUserId = () => {\n Sentry.getCurrentScope().setUser(null);\n};\n\n/**\n * Logs a front end execption. If Sentry is configured\n * sends the error information there. Otherwise\n * prints the error to the console.\n *\n * @param {Error} e Error that occurred\n * @param {String} message Error that occurred\n */\nexport const SentryException = (message: string, e: Error | ISignUpErrorResponse) => {\n const scope = new Sentry.Scope();\n scope.setTag('message', message);\n if (sentry.enabled && sentry.dsn) {\n Sentry.captureException(e, () => scope);\n if (e && sentry.showDialog) {\n Sentry.showReportDialog({ eventId: e.message });\n }\n console.error(message, e);\n } else {\n console.error(message, e);\n }\n};\n\n/**\n * Logs a full API exception. If Sentry is configured\n * sends the error information there. Otherwise\n * prints the error to the console.\n *\n * @param {Error} e Error that occurred\n * @param {String} code Error code\n * @param {Object} data Additional data to be sent to Sentry\n */\n","import { ErrorBoundary } from '@sentry/react';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport HostApp from './pages/App';\nimport { StoreProvider } from './stores';\nimport RootStore from './stores/RootStore';\nimport { SentrySetup } from './utils/log';\n\nconst appNode = document.getElementById('app');\nconst store = new RootStore();\n\n// set up logger with Sentry DSN client key and environment\nSentrySetup();\n\nReactDOM.render(\n An error has occurred.

}>\n \n \n \n
,\n appNode\n);\n","import AccountStore from './AccountStore';\nimport AuthStore from './AuthStore';\nimport DashboardStore from './DashboardStore';\nimport LeadStore from './LeadStore';\n\nexport default class RootStore {\n account = new AccountStore();\n auth = new AuthStore(this);\n dashboard = new DashboardStore(this);\n lead = new LeadStore();\n}\n","import config from '../config/config';\nimport type { IInstaller } from '../models/IInstaller';\nimport type { ITitleBlockOption } from '../models/Preferences';\nimport type { IHttpServiceParams } from './generic/HttpService';\nimport HttpService from './generic/HttpService';\n\nexport interface IInstallerOption {\n readonly id: string;\n readonly name: string;\n}\n\nclass DesignService extends HttpService {\n constructor(params: IHttpServiceParams) {\n super(params);\n }\n\n getInstaller = (installerId: string): Promise => {\n return this.get({\n url: `/installers/${installerId}`\n });\n };\n\n updateInstaller = (installerObject: IInstaller): Promise => {\n return this.put({\n url: `/installers/${installerObject.id}`,\n data: installerObject\n });\n };\n\n getInstallerOptions = (): Promise => {\n return this.get({\n url: '/accounts/current/installers'\n });\n };\n\n getTitleBlockOptions = (): Promise => {\n return this.get({\n url: '/selection-options/preferences/documents/title-block'\n });\n };\n}\n\nexport default new DesignService({\n baseURL: config.api.design\n});\n","import config from '../config/config';\nimport type {\n IOrderedProductsResponse, ISearchParams\n} from '../models';\nimport type {\n IBillingConfigurationResponse, IInvoiceConfiguration\n} from '../models/IBillingConfigurationResponse';\nimport type { IHttpServiceParams } from './generic/HttpService';\nimport HttpService from './generic/HttpService';\n\nconst baseURL = config.api.documents;\n\nexport interface IStripeSetupIntentData {\n readonly clientSecret: string;\n}\n\nclass DocumentsService extends HttpService {\n constructor(params: IHttpServiceParams) {\n super(params);\n }\n\n getBillingInfo = (accountId: string): Promise => {\n return this.get({\n url: `/accounts/${accountId}/billing/configuration`\n });\n };\n\n changeInvoiceConfiguration = (accountId: string, invoiceConfiguration: IInvoiceConfiguration): Promise => {\n return this.put({\n url: `/accounts/${accountId}/billing/configuration/invoice`,\n data: invoiceConfiguration\n });\n };\n\n getOrderedProductsData = (accountId: string, params: ISearchParams): Promise => {\n return this.get({\n url: `/accounts/${accountId}/billing/ordered-products`,\n data: params\n });\n };\n\n createSetupIntent = (accountId: string): Promise => {\n return this.post({\n url: `/accounts/${accountId}/billing/configuration/stripe/setup-intent`\n });\n };\n\n updateLogo = (accountId: string, data: File): Promise => {\n return this.put({\n url: `/installers/${accountId}/logo`,\n data,\n config: {\n baseURL,\n headers: {\n 'Content-Type': data.type,\n }\n }\n });\n };\n\n deleteLogo = (accountId: string): Promise => {\n return this.delete({\n url: `/installers/${accountId}/logo`,\n });\n };\n\n getInstallerLogoUrl = (accountId: string, installerId: string): string => {\n return `${baseURL}${this.getRelativeInstallerLogoUrl(accountId, installerId)}`;\n };\n\n getLogo = (accountId: string, installerId: string): Promise => {\n return this.get({\n url: this.getRelativeInstallerLogoUrl(accountId, installerId),\n config: {\n baseURL,\n headers: {\n Accept: 'image/*',\n }\n },\n showErrorsToUser: false\n });\n };\n\n private getRelativeInstallerLogoUrl = (accountId: string, installerId: string): string => {\n // LYRA-5628: Despite backend sending Cache-Control: no-store header, some browsers (at least Firefox)\n // still load the cached version for tags (from short-lived in-memory cache).\n // A workaround for this is to always add a changing query parameter\n const cacheBuster = `c=${Date.now()}`;\n return `/accounts/${accountId}/installers/${installerId}/logo?${cacheBuster}`;\n };\n}\n\nexport default new DocumentsService({\n baseURL,\n});\n","import config from '../config/config';\nimport type {\n IProject, IProjectsResponse, ISearchParams\n} from '../models';\nimport type { IEditProject } from '../stores/DashboardStore';\nimport type { IHttpServiceParams } from './generic/HttpService';\nimport HttpService from './generic/HttpService';\n\nexport type ProjectCreationRequest = Readonly> & {\n readonly account: string;\n readonly installer: string;\n};\n\nclass HostAppService extends HttpService {\n constructor(params: IHttpServiceParams) {\n super(params);\n }\n\n /**\n * Generates a HubSpot Conversations identity verification token for a currently logged in user.\n *\n * See https://developers.hubspot.com/docs/api/conversation/visitor-identification\n */\n getHubSpotIdentityVerificationToken = async (): Promise => {\n return this.get({\n url: '/sessions/current/hubspot-conversations',\n config: {\n baseURL: config.api.host!,\n headers: { Accept: 'text/plain' }\n }\n });\n };\n\n createProject = async (data: ProjectCreationRequest): Promise => {\n const project = await this.post({\n url: '/projects',\n data\n });\n window.dispatchEvent(new CustomEvent('LyraProjectCreated'));\n return project;\n };\n\n editProject = (project: IEditProject): Promise => {\n const {\n id, ...rest\n } = project;\n if (rest.customer && rest.customer.firstName === '') {\n delete rest.customer.firstName;\n }\n return this.patch({\n url: `/projects/${id}`,\n data: rest\n });\n };\n\n deleteProject = (projectId: string): Promise => {\n return this.delete({\n url: `/projects/${projectId}`,\n });\n };\n\n getProject = (projectId: string, showErrorsToUser: boolean = true): Promise => {\n return this.get({\n url: `/projects/${projectId}`,\n showErrorsToUser\n });\n };\n\n getProjectsData = (accountId: string, params: ISearchParams): Promise => {\n return this.get({\n url: `/accounts/${accountId}/projects`,\n data: params\n });\n };\n}\n\nexport default new HostAppService({\n baseURL: config.api.host\n});\n","import { AnalyticsEvent } from '@aurorasolar/lyra-design-tool';\nimport type { IProject } from '../../models';\nimport type { IInstaller } from '../../models/IInstaller';\nimport type { IUser } from '../../stores/AuthStore';\nimport type { ILead } from '../../stores/LeadStore';\nimport { CrmIdentityProperties } from '../../utils/analytics';\n\n/**\n * All events reported from Lyra Host App should extend this event.\n */\nabstract class HostAppAnalyticsEvent extends AnalyticsEvent {\n override readonly source: string = 'LYRA_HOST_APP';\n}\n\nexport class RegistrationAttemptedEvent extends HostAppAnalyticsEvent {\n override readonly name: string = 'Submitted registration form';\n\n constructor(email: string, firstName: string, lastName: string) {\n super({\n email,\n firstName,\n lastName\n });\n }\n}\n\nabstract class EventWithGenericCrmIdentityProperties extends HostAppAnalyticsEvent {\n constructor(user?: IUser, crmId?: string, lead?: ILead) {\n // Note: probably most of the properties are not really used, but we keep them for backwards-compatibility\n super(CrmIdentityProperties(user, crmId, lead));\n }\n}\n\nexport class SignedUpEvent extends EventWithGenericCrmIdentityProperties {\n override readonly name: string = 'Signed up';\n}\n\nexport class LeadConvertedToUserEvent extends EventWithGenericCrmIdentityProperties {\n override readonly name: string = 'Converted lead to user';\n}\n\nexport class PasswordResetRequestedEvent extends HostAppAnalyticsEvent {\n override readonly name: string = 'Reset password';\n\n constructor(email: string) {\n super({\n email\n });\n }\n}\n\nexport class LoginAttemptedEvent extends HostAppAnalyticsEvent {\n override readonly name: string = 'Submitted login form';\n\n constructor(email: string) {\n super({\n email\n });\n }\n}\n\nexport class LoggedInEvent extends EventWithGenericCrmIdentityProperties {\n override readonly name: string = 'Logged in';\n}\n\nexport class LoggedOutEvent extends EventWithGenericCrmIdentityProperties {\n override readonly name: string = 'Logged out';\n}\n\nexport class AccountSetupCompletedEvent extends EventWithGenericCrmIdentityProperties {\n override readonly name: string = 'Completed first-time account setup';\n}\n\nexport class UserProfileUpdatedEvent extends EventWithGenericCrmIdentityProperties {\n override readonly name: string = 'Updated profile';\n}\n\n/**\n * Note: this only covers Project creation from within the Host App.\n * Projects created via Design Tool are not tracked here.\n */\nexport class ProjectCreatedEvent extends HostAppAnalyticsEvent {\n override readonly name: string = 'Project Created';\n\n constructor(data: IProject, account: string) {\n super({\n projectId: data.id,\n account: `lyra:${account}`,\n address_state: data.address.province,\n address_city: data.address.city,\n address_postalCode: data.address.postalCode,\n source: 'HOST_APP'\n });\n }\n}\n\nabstract class ProjectEvent extends HostAppAnalyticsEvent {\n constructor(projectId: string) {\n super({\n id: projectId\n });\n }\n}\n\nexport class ProjectUpdatedEvent extends ProjectEvent {\n override readonly name: string = 'Updated project details';\n}\n\nexport class ProjectDeletedEvent extends ProjectEvent {\n override readonly name: string = 'Deleted project';\n}\n\nexport class InstallerUpdatedEvent extends HostAppAnalyticsEvent {\n override readonly name: string = 'Updated installer details';\n\n constructor(data: IInstaller) {\n super({\n id: data.id,\n type: data.type,\n name: data.name\n });\n }\n}\n\nabstract class EventWithNoProperties extends HostAppAnalyticsEvent {\n constructor() {\n super({});\n }\n}\n\nexport class BillingPaymentDetailsUpdatedEvent extends EventWithNoProperties {\n override readonly name: string = 'Updated billing payment details';\n}\n\nexport class BillingDetailsUpdatedEvent extends EventWithNoProperties {\n override readonly name: string = 'Updated billing details';\n}\n\nexport class PreferencesForDesignUpdatedEvent extends EventWithNoProperties {\n override readonly name: string = 'Updated design preferences';\n}\n\nexport class PreferencesForDocumentsUpdatedEvent extends EventWithNoProperties {\n override readonly name: string = 'Updated document preferences';\n}\n","import config from '../../config/config';\n\nconst segmentEnabled = config.analytics.enabled && config.analytics.provider === 'segment';\nif (segmentEnabled) {\n const SEGMENT_WRITE_KEY = config.analytics.id;\n /*\n * Note: this snippet is copied from Segment web UI:\n * ( Workspace -> Connections -> Sources -> Lyra App (client) -> Add Segment to your site )\n * and then modified in the following way:\n * - SEGMENT_WRITE_KEY is used instead of hardcoded key\n * - analytics.page(); call is removed (we expect each page to call it on its own)\n *\n * Also note: NPM package is also available: https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/quickstart/#step-2b-install-segment-as-a-npm-package\n * If we switch to it, we could remove this script and also `devDependency` on `@types/segment-analytics`\n */\n !function (){\n var i='analytics',analytics=window[i]=window[i]||[];if (!analytics.initialize) {\n if (analytics.invoked){\n window.console&&console.error&&console.error('Segment snippet included twice.');\n } else {\n analytics.invoked=!0;analytics.methods=['trackSubmit','trackClick','trackLink','trackForm','pageview','identify','reset','group','track','ready','alias','debug','page','screen','once','off','on','addSourceMiddleware','addIntegrationMiddleware','setAnonymousId','addDestinationMiddleware','register'];analytics.factory=function (e){\n return function (){\n if (window[i].initialized) {\n return window[i][e].apply(window[i],arguments);\n } var n=Array.prototype.slice.call(arguments);if (['track','screen','alias','group','page','identify'].indexOf(e)>-1){\n var c=document.querySelector('link[rel=\\'canonical\\']');n.push({\n __t:'bpc',\n c:c&&c.getAttribute('href')||void 0,\n p:location.pathname,\n u:location.href,\n s:location.search,\n t:document.title,\n r:document.referrer\n });\n }n.unshift(e);analytics.push(n);return analytics;\n };\n };for (var n=0;n => {\n const email = data?.email;\n if (!email) {\n // HubSpot does not support identifying anonymous visitors, therefore we delay identification until email is known\n return;\n }\n // Note: This mapping is also implemented in Segment. It is duplicated here for when Segment is blocked/disabled.\n // Note: `pickBy` removes properties with `undefined` values, because HubSpot treats them as 'undefined' strings\n const hubSpotCustomProfileAttributes = pickBy(\n {\n auth0_id: data.auth0_id,\n account_id: data.account_id,\n firstname: data.firstName,\n lastname: data.lastName,\n full_name: data.name,\n phone: data.phoneNumber\n },\n (value: unknown): boolean => value !== undefined\n );\n this.trackingEventQueue.push([\n 'identify',\n {\n // Email is the primary means of identification on HubSpot, so it is essential\n email: data.email,\n // HubSpot also allows updating custom contact attributes by passing them as additional attributes\n ...hubSpotCustomProfileAttributes\n }\n ]);\n };\n\n // This is a custom method to ensure HubSpot and the messenger are tied to the best available CRM record\n // https://knowledge.hubspot.com/privacy-and-consent/what-cookies-does-hubspot-set-in-a-visitor-s-browser\n analyticsSessionId(leadStore?: LeadStore): string {\n // Look to see if we are manually syncing a crm user who is not fully onboarding\n const params = new URLSearchParams(location.search);\n const providedUid = params.get('uid') || params.get('message');\n const user = secureStorage.get(USER_DATA_KEY) as IUser;\n const validUid = providedUid || user?.id;\n\n // Return and thus, correctly identify, app user and crm account - reducing duplicates even when multiple\n // emails used along a unified journey\n // Priority 1 - A valid crm user_id has been passed in the url to sync the messenger to a specific crm\n // user (overriding)\n if (validUid) {\n localStorage.setItem('_crm_id', validUid);\n localStorage.setItem('ajs_anonymous_id', validUid);\n localStorage.setItem('ajs_user_id', validUid);\n cookies.set('ajs_user_id', validUid);\n return validUid;\n }\n // Priority 2 - already started onboarding in previous session\n const crmId = localStorage.getItem('_crm_id');\n if (crmId) {\n return crmId;\n }\n // Priority 3 - A valid lead is onboarding with active crm user_id\n const onboardingLeadCrmUserId: string | undefined =\n leadStore?.lead?.user_id || leadStore?.getCurrentLead()?.user_id;\n if (leadStore?.isOnboarding && onboardingLeadCrmUserId) {\n localStorage.setItem('_crm_id', onboardingLeadCrmUserId);\n localStorage.setItem('ajs_anonymous_id', onboardingLeadCrmUserId);\n localStorage.setItem('ajs_user_id', onboardingLeadCrmUserId);\n cookies.set('ajs_user_id', validUid);\n return onboardingLeadCrmUserId;\n }\n // Priority 4 - HubSpot has recognized a CRM user and set a cross domain cookie\n // set by HubSpot script - typically the same as segmentUserCookie\n const crmUserToken = this.analyticsUserToken();\n if (crmUserToken) {\n return crmUserToken;\n }\n const crmVisitorCookie = cookies.get('visitor');\n if (crmVisitorCookie) {\n return crmVisitorCookie;\n }\n // Priority 5 - HubSpot has not yet recognized a CRM user but Segment has identified a user\n // Set by analytics script when identified (defaults to ajs_anonymous_id)\n const segmentUserCookie = cookies.get('ajs_user_id');\n if (segmentUserCookie) {\n return segmentUserCookie;\n }\n // Priority 6 - Neither Segment nor HubSpot has recognized a user, use Segment's auto-generated anonymousId\n const segmentAnonCookie = cookies.get('ajs_anonymous_id'); // set by analytics script, aka anonymousId\n return segmentAnonCookie;\n }\n\n /**\n * Returns a HubSpot user token\n */\n analyticsUserToken() {\n // More about cookies:\n // https://knowledge.hubspot.com/privacy-and-consent/what-cookies-does-hubspot-set-in-a-visitor-s-browser\n\n // `hubspotutk` is the main cookie holding visitor's identity (an opaque HubSpot-generated GUID)\n const hubspotutk = cookies.get('hubspotutk');\n if (hubspotutk) {\n return hubspotutk;\n }\n /*\n * `__hstc` is the main cookie for tracking visitors, which also includes `hubspotutk` value.\n * It contains: domain, hubspotutk, initial timestamp, last timestamp, current timestamp, session number\n *\n * For example, in `181257784.8c353f051155bc162f109d785a153210.1714074631865.1715929719184.1715937895980.12`\n * `8c353f051155bc162f109d785a153210` would be the `hubspotutk` value\n */\n return cookies.get('__hstc')?.split('.')?.[1];\n }\n\n track = async (event: string, additionalData?: object) => {\n this.trackingEventQueue.push([\n 'trackCustomBehavioralEvent',\n {\n name: event,\n properties: {\n ...additionalData\n }\n }\n ]);\n };\n\n page = () => {\n this.trackingEventQueue.push(['trackPageView']);\n };\n}\n\nexport default new HubSpotTracking();\n","import type {\n AnalyticsEvent, IAnalytics\n} from '@aurorasolar/lyra-design-tool';\nimport config from '../../config/config';\nimport hubSpot from '../hubspot/HubSpotTracking';\nimport { canUseDOM } from '../../utils/helper';\nimport { cookies } from '../../utils/storage';\nimport type { CrmIdentityExpanded } from '../../utils/analytics';\nimport AnalyticsJS = SegmentAnalytics.AnalyticsJS;\n\nconst segmentSession = !!cookies.get('ajs_anonymous_id') || !!localStorage.getItem('ajs_anonymous_id');\nconst isSegmentActive = (): boolean => {\n return config.analytics.enabled && config.analytics.provider === 'segment' && canUseDOM() && !!window.analytics;\n};\n\ndeclare global {\n interface Window {\n analytics: AnalyticsJS;\n }\n}\n\nwindow.analytics = window.analytics || {};\n\nclass AnalyticsService implements IAnalytics {\n /**\n * See Segment: https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/\n */\n identify(traits?: CrmIdentityExpanded): void {\n if (isSegmentActive() && segmentSession) {\n window.analytics.identify(traits);\n } else {\n // Identify with HubSpot directly if Segment is not active (e.g., it is blocked by browser's tracking protection)\n hubSpot.identify(traits);\n }\n }\n\n group(groupId: string, traits?: object): void {\n if (isSegmentActive()) {\n window.analytics.group(groupId, traits);\n }\n }\n\n /**\n * This method is used to track events from both Host App (via direct calls)\n * and from Design Tool (via IAnalytics interface).\n *\n * See Segment: https://segment.com/docs/connections/spec/track/\n */\n trackEvent(event: AnalyticsEvent): void {\n if (isSegmentActive()) {\n window.analytics.track(event.name, event.properties);\n } else {\n hubSpot.track(event.name, event.properties);\n }\n }\n\n /*\n Default page properties:\n {\n title: 'Page title',\n url: 'https://example.com/example',\n path: '/example',\n referrer: 'https://example.com/example-referrer'\n }\n See: https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/#default-page-properties\n */\n page(category: string, name: string, properties?: object): void {\n if (isSegmentActive()) {\n window.analytics.page(category, name, properties);\n } else {\n hubSpot.page();\n }\n }\n\n reset(): void {\n if (isSegmentActive()) {\n window.analytics.reset();\n }\n }\n\n /*\n * Note: the actual type of `leadStore` is always `LeadStore`.\n * `any` was used here to avoid pre-commit hook failure due to dependency cycle, when there was no time to fix it\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n analyticsSessionId(leadStore?: any): string {\n return hubSpot.analyticsSessionId(leadStore);\n }\n\n analyticsUserToken(): string | undefined {\n return config.hubSpot.enabled ? hubSpot.analyticsUserToken() : undefined;\n }\n}\n\nconst AnalyticsServiceInstance = new AnalyticsService();\n\nexport default AnalyticsServiceInstance;\n","// Import the desired analytics libs\nimport './segment-initial.js';\n\nimport AnalyticsService from './AnalyticsService';\n\nexport default AnalyticsService;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n ApiResponse, ApisauceConfig, HEADERS\n} from 'apisauce';\nimport { create } from 'apisauce';\nimport type { AxiosHeaders } from 'axios';\nimport type { JwtPayload } from 'jwt-decode';\nimport decodeJwt from 'jwt-decode';\nimport { showErrorToUser } from '../../utils/errors';\nimport SessionService from './SessionService';\n\nfunction isTokenInNeedsOfRefresh(jwtToken: string): boolean {\n if (localStorage.developmentFlagToForceRefreshAccessTokenForHostApp) {\n delete localStorage.developmentFlagToForceRefreshAccessTokenForHostApp;\n return true;\n }\n const creationTimeInSeconds = decodeJwt(jwtToken).iat!;\n const expirationTimeInSeconds = decodeJwt(jwtToken).exp!;\n const currentTimeInSeconds = Math.floor(Date.now() / 1000);\n const secondsUntilTokenExpires = expirationTimeInSeconds - currentTimeInSeconds;\n const halfSessionTimeInSeconds = (expirationTimeInSeconds - creationTimeInSeconds) / 2;\n return secondsUntilTokenExpires < halfSessionTimeInSeconds;\n}\n\nfunction isTokenExpired(jwtToken: string): boolean {\n const expirationTimeInSeconds = decodeJwt(jwtToken).exp!;\n const currentTimeInSeconds = Math.floor(Date.now() / 1000);\n return currentTimeInSeconds >= expirationTimeInSeconds;\n}\n\ninterface IRequestConfig {\n url: string;\n data?: T;\n config?: ApisauceConfig;\n withAuth?: boolean;\n showErrorsToUser?: boolean;\n throwErrors?: boolean;\n refreshAccessToken?: boolean;\n}\n\nexport interface IHttpServiceParams {\n baseURL: string;\n}\n\nconst isSpecialUrl = (url: string, method: string): boolean => {\n return url.split('/')[1] === 'projects' && method === 'delete';\n};\n\nfunction getRandomHex(): string {\n return Math.round(Math.random() * 15).toString(16);\n}\n\nconst generateSpecialErrorMessage = (response: ApiResponse, method: string, url: string): string => {\n const context = url.split('/')[1];\n\n if (context === 'sessions' && method === 'post') {\n return 'Login error occurred';\n }\n\n if (context === 'users' && method === 'post') {\n return 'Signup error occurred';\n }\n\n if (context === 'password-reset-requests' && method === 'post') {\n return 'Password reset error occurred';\n }\n\n return 'server error';\n};\n\nconst logErrorToConsole = (response: ApiResponse, method: string, url: string): void => {\n if (method === 'get' && (url.endsWith('/logo') || url.includes('/logo?c='))) { // See DocumentsService#getInstallerLogoUrl\n return;\n }\n // eslint-disable-next-line no-console\n console.error(new Error(`${method} ${url} failed with status ${response.status}, body: ${JSON.stringify(response.data)}`));\n};\n\nconst handleResponseProblem = (response: ApiResponse, method: string, url: string, showErrorsToUser: boolean, throwErrors: boolean): void => {\n logErrorToConsole(response, method, url);\n\n if (showErrorsToUser) {\n const userErrorMessages: string[] = [];\n\n if (response.data?.messages) {\n response.data.messages.forEach((messageObject: any): void => {\n userErrorMessages.push(messageObject.message);\n });\n } else if (!response.data || isSpecialUrl(method, url)) {\n userErrorMessages.push(generateSpecialErrorMessage(response, method, url));\n } else {\n userErrorMessages.push(response.data.message === 'No message available'\n ? response.data.error\n : response.data.message);\n }\n\n userErrorMessages.forEach((userErrorMessage: string): void => {\n showErrorToUser(userErrorMessage);\n });\n }\n\n if (throwErrors) {\n throw new Error(response.data?.message);\n }\n};\n\nclass HttpService {\n /**\n * `trace-id` part of the request tracing header is a 32 hex digit string.\n * First 14 digits - session, next 2 digits - instance/tab/window, last 16 digits - random.\n */\n static requestTracingSessionId: string = '';\n /**\n * Idea for a future improvement: check for collisions with old (but recent) sessions.\n */\n static requestTracingInstanceId: string = '';\n private api: any;\n private baseURL: string;\n\n get: ({\n url, data, config, withAuth, showErrorsToUser, throwErrors\n }: IRequestConfig

) => Promise;\n post: ({\n url, data, config, withAuth, showErrorsToUser, throwErrors\n }: IRequestConfig

) => Promise;\n put: ({\n url, data, config, withAuth, showErrorsToUser, throwErrors\n }: IRequestConfig

) => Promise;\n patch: ({\n url, data, config, withAuth, showErrorsToUser, throwErrors\n }: IRequestConfig

) => Promise;\n delete: ({\n url, data, config, withAuth, showErrorsToUser, throwErrors\n }: IRequestConfig

) => Promise;\n\n constructor({ baseURL }: IHttpServiceParams) {\n this.baseURL = baseURL;\n this.api = create({ baseURL: this.baseURL });\n this.get = this.handleRequest('get');\n this.post = this.handleRequest('post');\n this.put = this.handleRequest('put');\n this.patch = this.handleRequest('patch');\n this.delete = this.handleRequest('delete');\n\n SessionService.addOnAccessTokenUpdatedEventListener((jwtToken: string): void => {\n let storedTracingSessionJwtToken = '';\n let storedTracingSessionId = '';\n let storedTracingInstanceId: string | undefined;\n\n // Wrap in try in case of localStorage.requestTracingData absence\n try {\n if (localStorage.requestTracingData) {\n const requestTracingData = JSON.parse(localStorage.requestTracingData);\n storedTracingSessionJwtToken = requestTracingData.jwtToken;\n storedTracingSessionId = requestTracingData.requestTracingSessionId;\n storedTracingInstanceId = requestTracingData.requestTracingInstanceId;\n }\n } catch (error) {}\n\n HttpService.requestTracingInstanceId = storedTracingInstanceId ?? new Array(2).fill(0)\n .map(getRandomHex)\n .join('');\n\n if (storedTracingSessionJwtToken === jwtToken) {\n HttpService.requestTracingSessionId = storedTracingSessionId;\n } else {\n HttpService.requestTracingSessionId = new Array(14).fill(0)\n .map(getRandomHex)\n .join('');\n localStorage.requestTracingData = JSON.stringify({\n jwtToken,\n requestTracingSessionId: HttpService.requestTracingSessionId,\n requestTracingInstanceId: HttpService.requestTracingInstanceId\n });\n }\n });\n }\n\n getHeaders = async (config: ApisauceConfig, withAuth?: boolean): Promise => {\n const headers = { ...config.headers } as AxiosHeaders;\n if (withAuth) {\n const { accessToken } = await SessionService.getSession();\n headers.Authorization = `Bearer ${accessToken.value}`;\n }\n\n // This is going to be a random 16 hex characters string\n const requestTracingSpanId = new Array(16).fill(0)\n .map(getRandomHex)\n .join('');\n const requestTracingRequestId = new Array(16).fill(0)\n .map(getRandomHex)\n .join('');\n // `trace-id` part of the request tracing header is a 32 hex digit string.\n // For convenience, we'll use part of the `trace-id` to track user sessions\n // We'll use part of the `trace-id` header value to help debugging by tracking\n // user sessions and tabs/instances. The convention we'll use:\n // First 14 digits - session, next 2 digits - instance/tab/window, last 16 digits - random.\n const requestTracingTraceId =\n `${HttpService.requestTracingSessionId}${HttpService.requestTracingInstanceId}${requestTracingRequestId}`;\n\n if (requestTracingTraceId.length === 32 && requestTracingSpanId.length === 16) {\n // `traceparent` header value has to comply with these rules -\n // https://www.w3.org/TR/trace-context/#traceparent-header\n headers.traceparent = `00-${requestTracingTraceId}-${requestTracingSpanId}-01`;\n }\n\n return headers;\n };\n\n getConfig = async (config?: ApisauceConfig | {}, withAuth?: boolean): Promise => {\n const baseConfig = {\n baseURL: this.baseURL,\n headers: {},\n ...config\n };\n\n const customHeaders = await this.getHeaders(baseConfig, withAuth);\n\n return {\n ...baseConfig,\n headers: customHeaders\n };\n };\n\n private handleRequest = (method: string) =>\n async (\n {\n url,\n data,\n config,\n withAuth = true,\n showErrorsToUser = true,\n throwErrors = true,\n refreshAccessToken = true\n }: IRequestConfig

\n ): Promise => {\n const { accessToken } = await SessionService.getSession();\n if (withAuth && refreshAccessToken && accessToken && isTokenExpired(accessToken.value)) {\n // Reload to navigate to the login page.\n window.location.reload();\n }\n if (withAuth && refreshAccessToken && accessToken && isTokenInNeedsOfRefresh(accessToken.value)) {\n await SessionService.refreshSession();\n }\n const configObject = await this.getConfig(config, withAuth);\n\n const response = await this.api[method](url, data, configObject);\n if (response.problem) {\n handleResponseProblem(response, method, url, showErrorsToUser, throwErrors);\n }\n return response.data as R;\n };\n}\n\nexport default HttpService;\n","import type {\n ApiResponse, ApisauceInstance\n} from 'apisauce';\nimport { create } from 'apisauce';\nimport {\n action, observable\n} from 'mobx';\nimport config from '../../config/config';\nimport {\n ACCESS_TOKEN_EXP_KEY, ACCESS_TOKEN_KEY, USER_DATA_KEY\n} from '../../constants/auth';\nimport type {\n IAccessToken, ISessionInfo, IUser\n} from '../../stores/AuthStore';\nimport { secureStorage } from '../../utils/storage';\nimport type { IHttpServiceParams } from './HttpService';\n\nclass SessionService {\n @observable\n accessToken: string | null = null;\n accessTokenExp: number | null = null;\n\n rememberMe: boolean = false;\n private sessionTimeout: null | ReturnType = null;\n private sessionLoading: boolean = false;\n private user: IUser;\n private api: ApisauceInstance;\n private addOnAccessTokenUpdated?: (token: string) => void;\n\n constructor({ baseURL }: IHttpServiceParams) {\n this.api = create({ baseURL });\n }\n\n addOnAccessTokenUpdatedEventListener(handler: (token: string) => void): void {\n this.addOnAccessTokenUpdated = handler;\n }\n\n initSessionTimeout = (accessTokenExp: number): void => {\n const currentTimestampInSeconds = Math.round(Date.now() / 1000);\n const accessTokenValidForNextSeconds = accessTokenExp - currentTimestampInSeconds;\n const scheduleRefreshAfterSeconds = accessTokenValidForNextSeconds - 5 * 60; // refresh 5 mins before expiration\n\n // eslint-disable-next-line no-console\n console.info('Session valid for the next ', (accessTokenValidForNextSeconds / 60 / 60).toFixed(2), ' hours');\n if (this.sessionTimeout) {\n clearTimeout(this.sessionTimeout);\n }\n this.sessionTimeout = setTimeout(() => {\n // eslint-disable-next-line no-console\n console.log('Session is about to expire - refreshing');\n this.refreshSession();\n }, scheduleRefreshAfterSeconds * 1000);\n };\n\n @action\n setUser = (user: IUser): void => {\n this.user = user;\n };\n\n getSession = (): Promise => new Promise((resolve: (info: ISessionInfo) => void): void => {\n if (!this.sessionLoading) {\n resolve(this.readSession());\n } else {\n setTimeout(async (): Promise => {\n // eslint-disable-next-line no-console\n console.log('Waiting for session to be refreshed');\n resolve(await this.getSession());\n }, 1000);\n }\n });\n\n @action\n refreshSession = async (): Promise => {\n const { accessToken } = this.readSession();\n const requestConfig = {\n headers: { Authorization: `Bearer ${accessToken.value}` },\n refreshAccessToken: false, // to avoid infinite recursion\n };\n this.sessionLoading = true;\n\n return this.api.post('/sessions/current', undefined, requestConfig)\n .then((response: ApiResponse) => {\n if (response.ok && response.data) {\n this.sessionLoading = false;\n this.updateToken(response.data.accessToken, this.rememberMe);\n } else if (response.problem) {\n // eslint-disable-next-line no-console\n console.error(\n 'Failed to refresh current session. Problem code: '\n + `${response.problem}; ${response.originalError.code} ${response.originalError.response?.statusText}`\n );\n throw new Error('Failed to refresh current session');\n }\n return response.data as ISessionInfo;\n });\n };\n\n updateToken(token: IAccessToken | null, rememberMe: boolean): void {\n this.accessToken = token?.value ?? null;\n try { // Wrap in try in case of corrupted (request tracing) localStorage data\n this.addOnAccessTokenUpdated?.(this.accessToken ?? '');\n } catch (error) {}\n this.accessTokenExp = token?.expiration ?? null;\n this.rememberMe = rememberMe;\n if (rememberMe) {\n secureStorage.set(ACCESS_TOKEN_KEY, this.accessToken);\n secureStorage.set(ACCESS_TOKEN_EXP_KEY, this.accessTokenExp?.toString() ?? null);\n }\n }\n\n /**\n * Reads session info from local storage, or if not available, then from current in-memory state\n */\n @action\n private readSession = (): ISessionInfo => {\n const accessToken = secureStorage.get(ACCESS_TOKEN_KEY) || this.accessToken;\n try { // Wrap in try in case of corrupted (request tracing) localStorage data\n this.addOnAccessTokenUpdated?.(accessToken);\n } catch (error) {}\n const accessTokenExp = secureStorage.get(ACCESS_TOKEN_EXP_KEY) || this.accessTokenExp;\n const user = secureStorage.get(USER_DATA_KEY) as IUser || this.user;\n const account = user?.account;\n return {\n accessToken: {\n value: accessToken,\n expiration: accessTokenExp\n },\n user,\n account\n };\n };\n}\n\nexport default new SessionService({\n baseURL: config.api.host\n});\n","/* eslint-disable no-console */\nimport hostAppService from '../HostAppService';\n\ndeclare global {\n interface Window {\n /**\n * Settings that can be set (note: the type definition is not complete)\n * See: https://developers.hubspot.com/docs/api/conversation/chat-widget-sdk#configure-conversations-settings\n */\n hsConversationsSettings?: {\n loadImmediately?: boolean;\n identificationEmail?: string;\n identificationToken?: string;\n };\n /**\n * Array where callback functions can be set that get invoked once `HubSpotConversations` become available\n */\n hsConversationsOnReady: unknown[];\n /**\n * Main HubSpot Conversations API object (note: the type definition is not complete)\n */\n HubSpotConversations?: {\n resetAndReloadWidget: () => void;\n widget: {\n load: () => void;\n status: () => { loaded: boolean };\n open: () => void;\n };\n };\n }\n}\n\nwindow.hsConversationsSettings = {\n // We disable loading immediately, because user identity information has to be set before loading the chat widget\n loadImmediately: false\n};\n\n/**\n * An object providing a convenient higher-level API for working with HubSpot Conversations (live chat product)\n * See: https://developers.hubspot.com/docs/api/conversation/chat-widget-sdk\n */\nexport class HubSpotChat {\n /**\n * Property specifying whether the HubSpotConversations object is available (i.e. HubSpot script is loaded).\n */\n private isChatApiAvailable: boolean = false;\n /**\n * Identity of the current user. It can have one of three values:\n * - an email string - meaning chat is used by an authenticated user\n * - null - meaning chat is used by an anonymous visitor\n * - undefined - meaning it is not yet set\n */\n private authenticatedUserEmail: string | null | undefined = undefined;\n\n constructor() {\n if (window.HubSpotConversations) {\n this.isChatApiAvailable = true;\n } else {\n window.hsConversationsOnReady = [\n (): void => {\n // Clearing the list of callbacks, because loading the widget triggers them again\n window.hsConversationsOnReady = [];\n this.isChatApiAvailable = true;\n if (this.authenticatedUserEmail !== undefined) {\n // If chat widget is already configured, load it immediately\n this.loadWidget();\n }\n }\n ];\n }\n }\n\n /**\n * Configures and loads the chat widget for an anonymous visitor\n */\n loadWidgetForAnonymousVisitor(): void {\n this.configureAndLoadWidget(null);\n }\n\n /**\n * Configures the chat widget for an identified user and loads either immediately or ASAP\n */\n loadWidgetForAuthenticatedUser(userEmail: string): void {\n this.configureAndLoadWidget(userEmail);\n }\n\n private configureAndLoadWidget(userEmailOrNull: string | null): void {\n this.authenticatedUserEmail = userEmailOrNull;\n // If chat API is not yet available, the widget will get loaded in `hsConversationsOnReady` callback\n if (this.isChatApiAvailable) {\n this.loadWidget();\n }\n }\n\n /**\n * Loads or reloads the HubSpot Conversations widget configured for the current user or anonymous visitor.\n */\n private async loadWidget(): Promise {\n if (!this.isChatApiAvailable) {\n console.error('Attempted to load HubSpot chat widget before HubSpotConversations API is available');\n return;\n }\n if (this.authenticatedUserEmail === undefined) {\n console.error('Attempted to load HubSpot chat widget before configuration is complete');\n return;\n }\n if (this.authenticatedUserEmail === null) {\n // Loading chat widget for an anonymous visitor\n delete window.hsConversationsSettings!.identificationEmail;\n delete window.hsConversationsSettings!.identificationToken;\n console.info('Loading HubSpot chat widget for anonymous visitor');\n } else {\n // Loading chat widget for an authenticated user\n window.hsConversationsSettings!.identificationEmail = this.authenticatedUserEmail;\n window.hsConversationsSettings!.identificationToken = await hostAppService.getHubSpotIdentityVerificationToken();\n console.info('Loading HubSpot chat widget for authenticated user');\n }\n if (this.isChatWidgetLoaded) {\n window.hsConversationsSettings!.loadImmediately = true;\n window.HubSpotConversations!.resetAndReloadWidget();\n } else {\n window.HubSpotConversations!.widget.load();\n }\n }\n\n /**\n * Is the chat widget iframe loaded? It has to be loaded before it can be opened.\n */\n private get isChatWidgetLoaded(): boolean {\n return this.isChatApiAvailable && (window.HubSpotConversations?.widget.status().loaded ?? false);\n }\n\n /**\n * Opens live chat widget\n */\n openChatWidget(): void {\n if (!this.isChatWidgetLoaded) {\n console.error('Attempted to show HubSpot chat widget when it is either not enabled or not yet loaded');\n return;\n }\n window.HubSpotConversations!.widget.open();\n }\n}\n","import { HubSpotChat } from '../hubspot/HubSpotConversations';\nimport config from '../../config/config';\n\n/**\n * This is an abstraction of a live-chat functionality provided by a third-party (e.g., HubSpot).\n */\nclass LiveChatService {\n private readonly hubSpotChat?: HubSpotChat;\n\n constructor() {\n if (config.hubSpot.enabled) {\n this.hubSpotChat = new HubSpotChat();\n }\n }\n\n /**\n * Configures the live chat widget (for an anonymous visitor) in a collapsed state (a bubble in the corner)\n */\n setUpChatWidgetForAnonymousVisitor(): void {\n this.hubSpotChat?.loadWidgetForAnonymousVisitor();\n }\n\n /**\n * Configures the live chat widget (for an identified user) in a collapsed state (a bubble in the corner)\n */\n setUpChatWidgetForAuthenticatedUser(userEmail: string): void {\n this.hubSpotChat?.loadWidgetForAuthenticatedUser(userEmail);\n }\n\n showChat(): void {\n if (this.hubSpotChat) {\n this.hubSpotChat.openChatWidget();\n } else {\n // eslint-disable-next-line no-console\n console.info('None of the live chat implementations are enabled');\n }\n }\n}\n\nexport default new LiveChatService();\n","import type {\n FC, PropsWithChildren, ReactElement\n} from 'react';\nimport React from 'react';\nimport type RootStore from './RootStore';\n\ninterface IProviderProps {\n store: RootStore;\n}\n\nconst StoreContext = React.createContext({});\n\n// StoreProvider to inject root store using react context\nexport const StoreProvider: FC = (props: PropsWithChildren): ReactElement => {\n const {\n children, store\n } = props;\n return (\n \n {children}\n \n );\n};\n\n// Hook to use store in any functional component\nexport const useStore = (): RootStore => {\n return React.useContext(StoreContext) as RootStore;\n};\n","import type {\n IUser, TAccountType, TPrimaryUse\n} from '../stores/AuthStore';\nimport type AuthStore from '../stores/AuthStore';\nimport type { ILead } from '../stores/LeadStore';\nimport type LeadStore from '../stores/LeadStore';\nimport analytics from '../services/analytics';\nimport config from '../config/config';\n\n// Analytics session/page and event tracking model - HubSpot CRM and Amplitude mapped\ntype PageTrackingExpanded = {\n userId: string;\n accountId: string;\n user_id: string;\n hostEnvironment?: string;\n hostName?: string;\n hostVersion?: string;\n designToolEnvironment?: string;\n designToolName?: string;\n designToolVersion?: string;\n isAdmin?: boolean;\n isAuthorized?: boolean;\n isInstallationCompany?: boolean;\n isLoading?: boolean;\n passResetDone?: boolean;\n signUpError?: string | null;\n updateAccountError?: string | null;\n};\n\n// HubSpot and Analytics user identity model\nexport type CrmIdentityExpanded = {\n usertoken?: string; // HubSpot usertoken\n userId?: string; // Segment default userId - maps to HubSpot UserID and other tools.\n id?: string; // custom attribute - mapped to Lyra (Auth0) User ID\n account_id?: string; // custom attribute - mapped to Lyra Account ID\n auth0_id?: string; // custom attribute - mapped to (Auth0) IUser ID\n user_id?: string; // custom attribute - mapped to initial HubSpot UserID (same as original MessengerId) then (Auth0) IUser id on account creation - keeps user in sync across browsers/devices\n name?: string;\n firstName?: string;\n lastName?: string;\n picture?: string;\n email?: string;\n phoneNumber?: string;\n primaryUse?: TPrimaryUse;\n accountAdmin?: boolean;\n applicationAdmin?: boolean;\n installer?: string;\n type?: TAccountType;\n source?: string; // the source of the lead or user\n 'Lead Source'?: string; // the source of the lead, not always same as source\n 'Company Name'?: string; // HubSpot primary attribute\n};\n\n/**\n * A standard set of proprties reported for page view events\n */\nexport const PageTrackingProperties = (authStore: AuthStore, leadStore: LeadStore): PageTrackingExpanded => {\n const crmId = analytics.analyticsSessionId(leadStore);\n return {\n userId: authStore.user.id, // Lyra user (Auth0) ID\n accountId: authStore.accountId, // Lyra account ID\n user_id: crmId,\n hostEnvironment: config.environment.host.environment,\n hostName: config.environment.host.name,\n hostVersion: config.environment.host.version,\n designToolEnvironment: config.environment.design.environment,\n designToolName: config.environment.design.name,\n designToolVersion: config.environment.design.version,\n isAdmin: authStore.isApplicationAdmin,\n isAuthorized: authStore.isAuthorized,\n isInstallationCompany: authStore.isInstallationCompany,\n isLoading: authStore.isLoading,\n passResetDone: authStore.passResetDone,\n signUpError: authStore.signUpError,\n updateAccountError: authStore.updateAccountError\n };\n};\n\n// Segment identify() options - HubSpot CRM mapped - accepts a lead or user and custom maps into CRM model\n// https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/#identify\nexport const CrmIdentityProperties = (user?: IUser, crmId?: string, lead?: ILead): CrmIdentityExpanded => {\n const combinedName =\n (user?.firstName || lead?.firstName) && `${user?.firstName || lead?.firstName} ${user?.lastName || lead?.lastName}`;\n return {\n usertoken: analytics.analyticsUserToken(),\n userId: lead?.user_id || crmId || user?.id, // Segment user ID, maps to HubSpot User ID (and user_id)\n id: user?.id, // Lyra User (Auth0) ID\n account_id: user?.account?.id, // Lyra user (Auth0) ID\n auth0_id: user?.id, // Lyra user (Auth0) ID\n user_id: crmId, // HubSpot User ID (and user_id)\n name: combinedName,\n firstName: user?.firstName || lead?.firstName,\n lastName: user?.lastName || lead?.lastName,\n picture: user?.picture,\n email: user?.email || lead?.email,\n phoneNumber: user?.phoneNumber,\n primaryUse: user?.primaryUse,\n accountAdmin: user?.accountAdmin,\n applicationAdmin: user?.applicationAdmin,\n installer: user?.account?.installer,\n type: user?.account?.type,\n source: lead?.source,\n 'Lead Source': lead?.source,\n 'Company Name': lead?.company\n };\n};\n","import { toast } from 'react-toastify';\n\nexport function showErrorToUser(errorMessage: string): void {\n toast(errorMessage, {\n position: 'top-right',\n autoClose: 5000,\n hideProgressBar: false,\n closeOnClick: true,\n pauseOnHover: true,\n draggable: true,\n progress: undefined,\n type: 'error'\n });\n}\n","import type {\n IProject,\n ProjectAddress\n} from '../models';\n\nexport const getTitle = (routerName: string): string => {\n let title = '';\n let convertedTitle = '';\n if (routerName.startsWith('/access_token')) {\n convertedTitle = '';\n } else {\n if (routerName.includes('/company/edit')) {\n convertedTitle = 'Company Info';\n } else if (routerName.includes('/payment/edit')) {\n convertedTitle = 'Payment Info';\n } else if (routerName.includes('/profile')) {\n convertedTitle = 'Profile';\n } else {\n convertedTitle = routerName.replace(/\\//g, '');\n }\n }\n\n title = convertedTitle.charAt(0).toUpperCase() + convertedTitle.slice(1);\n return title;\n};\n\nexport const getProjectName = (project: IProject): string => {\n const {\n address: {\n addressOne, city, province, postalCode\n },\n internalReferenceId,\n customer\n } = project;\n\n let projectName = `${addressOne} ${city} ${province} ${postalCode}`;\n\n if (internalReferenceId) {\n projectName += `ID #${internalReferenceId}`;\n }\n if (customer) {\n const {\n firstName, lastName\n } = customer;\n projectName += `- ${firstName ? `${firstName} ` : ''}${lastName}`;\n }\n return projectName;\n};\n\nexport const getRefText = (project: IProject): string => {\n const { internalReferenceId } = project;\n\n return `ID # ${internalReferenceId}`;\n};\n\nexport const getCustomerNameText = (project: IProject): string => {\n const { customer } = project;\n return customer ? `${customer.firstName ? `${customer.firstName} ` : ''}${customer.lastName}` : '';\n};\n\nexport const getAddressText = (project: IProject): string => {\n const {\n address: {\n city, addressOne, province, postalCode\n },\n } = project;\n\n return `${addressOne} ${city} ${province} ${postalCode}`;\n};\n\nexport const getAddressObject = (placeObject: google.maps.places.PlaceResult): ProjectAddress => {\n let numb = '';\n let street = '';\n let city = '';\n let province = '';\n let postalCode = '';\n let subLocality = '';\n let neighborhood = '';\n let country = '';\n\n const latitude = placeObject.geometry?.location?.lat() ?? 0;\n const longitude = placeObject.geometry?.location?.lng() ?? 0;\n\n placeObject.address_components?.forEach(\n (component: google.maps.GeocoderAddressComponent) => {\n if (component.types.includes('street_number')) {\n numb = component.short_name;\n }\n if (component.types.includes('route')) {\n street = component.short_name;\n }\n if (component.types.includes('locality')) {\n city = component.long_name;\n }\n if (!city && component.types.includes('administrative_area_level_3')) {\n city = component.long_name;\n }\n if (component.types.includes('administrative_area_level_1')) {\n province = component.short_name;\n }\n if (component.types.includes('postal_code')) {\n postalCode = component.short_name;\n }\n if (component.types.includes('sublocality') || component.types.includes('sublocality_level_1')) {\n subLocality = component.short_name;\n }\n if (component.types.includes('neighborhood')) {\n neighborhood = component.short_name;\n }\n if (component.types.includes('country')) {\n country = component.short_name;\n }\n }\n );\n\n // Special cases if no values for city found.\n if (!city && subLocality) {\n city = subLocality;\n }\n if (!city && neighborhood) {\n city = neighborhood;\n }\n\n return {\n city,\n province: country === 'PR' ? 'PR' : province, // Special case when GoogleMaps has PuertoRico as different country.\n postalCode,\n coordinates: {\n latitude,\n longitude,\n zoom: 20 // FIXME: update default zoom level\n },\n addressOne: `${numb} ${street}`,\n };\n};\n\nexport const getStatusText = (statusIndex: number): string => {\n if (statusIndex === 0) {\n return 'active';\n } else if (statusIndex === 1) {\n return 'inactive';\n } else {\n return 'pending';\n }\n};\n\ntype ClassnameToFlag = {\n [key: string]: boolean;\n};\n\nexport const classnames = (classnameToFlagMap: ClassnameToFlag): string =>\n Object.keys(classnameToFlagMap).reduce((result, key) => {\n return `${result} ${classnameToFlagMap[key] ? key : ''}`;\n }, '');\n\nexport const formatNumberWithCommas = (number: number): string => {\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\nexport const canUseDOM = (): boolean => (!!window.document && !!window.document.createElement);\n\nexport const isLyraUserId = (s: string): boolean => {\n const auth0 = s.includes('auth0|');\n const uuid = s.match(\n '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'\n ); // uuid v1-5 regex\n return auth0 || !!uuid?.length;\n};\n","import SecureLS from 'secure-ls';\nimport { Cookies } from 'react-cookie';\nimport { USER_DATA_SECRET } from '../constants/auth';\n\nexport const cookies = new Cookies();\n\nexport const secureStorage = new SecureLS({\n encodingType: 'aes',\n encryptionSecret: USER_DATA_SECRET\n});\n"],"names":["AlertMessageBox","isMessageVisible","type","AlertMessage","message","defaultProps","Container","size","Image","props","name","image","userInitials","setUserInitials","useState","useEffect","initials","initialsString","Array","isArray","join","src","alt","Buttons","TabBar","LyraButtons","CardList","LyraCardList","DataTable","LyraDataTable","DropDownNew","LyraDropDownNew","H1","H2","H3","H4","Paragraph","Link","LyraFontFamily","HAInput","HADropdown","HACheckBox","HAToggle","LyraFormElementsHostApp","Icon","LyraIcon","Flexbox","LyraLayout","SideBar","LyraSideBar","Theme","defaultTheme","LyraTheme","Tag","LyraTag","FlexColumnView","attrs","justify","align","dir","AppContainer","ErrorLabel","MainWrapper","theme","colors","grayColor11","ContentWrapper","AuthFormContainer","CenterRow","Row","EndRow","SpacedRow","FormContainer","FormOverContainer","ResetContainer","Grid","PanelHeaderText","mainColor1","WarningSection","PanelSubHeaderText","grayColor1","ActionContainer","BlueParagraph","InputContainer","PaddingView","HeightParagraph","RightCol","Col","LeftCol","ButtonContainer","ButtonWrapper","CommentContainer","CommentLink","iconBg2","InputHeaderText","SearchWrapper","SearchInput","grayColor3","SearchIcon","HeaderTitle","EmptyCardWrapper","highlight","PopUpContainer","PopUpItem","CoverView","ButtonGroup","mainColor6","ModalContainer","ConfirmText","CommentText","ButtonModalWrapper","LyraCommentText","LyraMainInput","isValid","isTouched","mainColor4","LyraMainTextarea","LogoImage","BoldLink","ErrorMessage","isShown","CheckBox","Text","Title","NotFound","errorText","LoadingContainer","EmbeddableLoadingIndicator","useContext","ThemeContext","color","loading","LoadingCard","children","loadingIndicator","LoadingMask","LoadingIndicator","MODAL_PORTAL_ID","ModalWrapper","isOpen","onRequestClose","contentStyle","style","overlay","position","top","left","right","bottom","backgroundColor","zIndex","content","border","background","overflow","WebkitOverflowScrolling","borderRadius","outline","padding","ariaHideApp","parentSelector","document","getElementById","body","PatternContainer","SidebarWrapper","dashboardRegexp","accountRegexp","Sidebar","history","pathname","location","routeIsValid","route","test","isValidDashboardRoute","isValidAccountdRoute","toggleActive","useCallback","item","push","className","icon","active","onClick","appEnv","environment","design","version","lyraDesignToolVersion","host","updatePaymentUrl","node","api","documents","site","canonicalRootUrl","maps","google","apiKey","privateKey","staticUrl","scale","disableDefaultUI","tilt","factorHeading","pitch","zoom","Number","sentryEnvironment","sentryMaxBreadcrumbs","sentryMaxStoredEvents","sentryErrorDataIntegrationDepth","sentryTraceSampleRate","validRoutes","config","analytics","enabled","provider","id","hubSpot","hubId","sentry","dsn","debug","showDialog","ignoredCodes","tracesSampleRate","dataIntegrationDepth","maxBreadcrumbs","logLevel","attachStacktrace","autoSessionTracking","maxStoredEvents","captureConsole","ACCESS_TOKEN_KEY","ACCESS_TOKEN_EXP_KEY","USER_DATA_KEY","USER_DATA_SECRET","LEAD_DATA_KEY","DROPDOWN_PORTAL_ID","HEADER_ITEM_PREFERENCES","HEADER_ITEM_PROFILE","HEADER_ITEM_LOGOUT","headerItems","key","text","GOOGLE_MAP_LIBRARIES","PRIMARY_USE_OPTIONS","label","value","ACCOUNT_TYPES","states","DEFAULT_DC_TERMINAL_TEMPRATURE_RATING","DEFAULT_AC_TERMINAL_TEMPERATURE_RATING","DEFAULT_CONDUCTOR_TYPE","CONDUIT_TYPE_FOR_INTERIOR_APPLICATIONS","CONDUIT_TYPE_FOR_EXTERIOR_APPLICATIONS","MIN_CONDUTOR_SIZE_FOR_PV_SOURCE_CIRCUITS","MIN_CONDUCTOR_SIZE_FOR_AC_BRANCH_SOURCE_CIRCUITS","MIN_OCPD_FOR_PV_SOURCE_CIRCUITS","MIN_VOLTAGE_DROP_IN_PERCENT","MAX_VOLTAGE_DROP_IN_PERCENT","WATERMARK","MAP_STYLE","MESSAGE_BACKGROUND_COLOR","success","error","warning","info","MESSAGE_BORDER_COLOR","HeaderContainer","AvatarWrapper","HeaderContent","UserIconContainer","stretch","Dropdown","DropdownItem","observer","auth","account","isDesignCompany","user","modalOpen","setModalOpen","title","setTitle","filteredHeaderItems","setFilteredHeaderItems","userImage","picture","userFullName","firstName","lastName","ref","useRef","handleClickOutside","event","current","contains","target","addEventListener","removeEventListener","Avatar","width","height","map","logout","marginLeft","marginRight","Footer","CompanyFormWrapper","AccountSetupModal","modalShow","setModalShow","showEmailConfirmed","emailConfirmedMessage","authStore","setLoading","setSuccess","setError","accountTypeValue","setAccountTypeValue","companyName","setCompanyName","primaryUseValue","setPrimaryUseValue","isInstaller","completeSetupButtonHandler","params","accountType","primaryUse","completeAccountSetup","err","onAccountTypeSelect","onPrimaryUseSelect","isAccountTypeEmpty","isCompanyEmpty","buttonClassNames","disabled","Modal","display","flexDirection","placeholder","items","onSelect","menuPortalTarget","onChange","styleType","ButtonStyleType","MainContainer","isHomeowner","isNotFoundPageIsShownForHomeowner","component","Component","rest","render","routeProps","isAuthorized","to","state","from","search","console","log","window","hubSpotLoadingScript","createElement","async","defer","firstScript","getElementsByTagName","parentNode","insertBefore","throwWrapper","n","Error","thrower","newTitle","path","Account","lazy","Login","Register","ForgotPassword","Dashboard","DesignTool","EditCompany","EditPayment","EditUser","Preferences","Users","HostAppGlobalStyles","createGlobalStyle","hostAppThemeConfig","searchIconGray","alpha1","alpha2","fonts","fontFamily","restoreSession","CrushButton","sessionStorage","getItem","Suspense","fallback","exact","addWhitespaceSuffixIfNotEmpty","input","trim","addComaAndWhitespaceSuffixIfNotEmpty","AccountStore","isBillingLoading","isInstallerLoading","isLogoLoading","currentInstaller","billingInfo","isLoading","companyInfo","isLogoPresent","titleBlockOptions","getInstaller","installerId","this","response","DesignService","e","updateCurrentInstaller","installerObj","updateLogo","data","DocumentsService","then","deleteLogo","getBillingInfo","accountId","finally","changeInvoiceConfiguration","invoiceConfig","updateCardInfo","paymentCard","createSetupIntent","loadInstallerOptions","installerOptions","getTitleBlockOptions","attributes","installerLoaded","isBillingInfoFilled","isCompanyInfoFilled","isAddressPresent","address","currentInstallerId","fullCompanyAddress","addressPart","addressOne","addressTwo","cityPart","city","statePart","province","postalCode","accountSingleInstallerId","length","checkIfLogoPresent","catch","observable","computed","action","AuthService","HttpService","constructor","super","login","post","url","withAuth","signUp","showErrorsToUser","passwordReset","email","put","getProfile","get","updateProfile","baseURL","AuthStore","rootStore","accessTokenExp","loginError","signUpError","resetError","updateAccountError","passResetError","passResetDone","accessToken","accessTokenExpStr","parseInt","accountData","sessionData","expiration","tokenIsValid","handleSessionData","resetTokenState","identifyCrmId","rememberMe","otherParams","sessionInfo","signedUpUserSessionInfo","lead","convertLead","resetUserState","SessionService","resetLeadState","installer","localStorage","setItem","sameSite","maxAge","secure","refreshAccessToken","session","userUpdateRequest","userUpdateResponse","fullUpdatedUserObject","currentTimeStamp","Math","round","Date","now","isApplicationAdmin","applicationAdmin","isInstallationCompany","DashboardStore","projectsData","more","page","projects","purchasesData","purchases","searchAccountId","searchQuery","searchStartDate","searchEndDate","filter","setFilter","newFilter","checkIfDashboardLoading","setIsDashboardDataLoading","flag","setIsProjectsDataLoading","setIsPurchasesDataLoading","createProject","project","HostAppService","editProject","deleteProject","projectId","resetDashboardData","refreshDashboardData","loadMoreProjectsData","loadMorePurchasesData","isDashboardLoading","getSearchParameters","query","effectiveAccountId","normalizeProjectsResponse","bind","loadPurchasesFromOrderedProductsResponse","forEach","orderedProducts","orderedProduct","productId","description","billingAddress","date","timestamp","toLocaleDateString","price","selectedPage","getTime","match","isEmptyFilter","userHasProjects","Object","keys","userHasPurchases","isProjectsListLoading","isPurchasesListLoading","LeadStore","startOnboarding","sessionLead","getLeadData","validNewLead","user_id","validSessionLead","validLead","JSON","stringify","getCurrentLead","getLeadSession","identfiedCrmId","leadData","parse","isOnboarding","validSource","source","isWebLogin","webKey","web_key","appNode","store","dashboard","S","release","transport","transportOptions","maxQueueSize","integrations","depth","levels","tracePropagationTargets","updateInstaller","installerObject","getInstallerOptions","invoiceConfiguration","getOrderedProductsData","headers","delete","getInstallerLogoUrl","getRelativeInstallerLogoUrl","getLogo","Accept","getHubSpotIdentityVerificationToken","dispatchEvent","CustomEvent","customer","patch","getProject","getProjectsData","HostAppAnalyticsEvent","AnalyticsEvent","RegistrationAttemptedEvent","EventWithGenericCrmIdentityProperties","crmId","SignedUpEvent","LeadConvertedToUserEvent","PasswordResetRequestedEvent","LoginAttemptedEvent","LoggedInEvent","LoggedOutEvent","AccountSetupCompletedEvent","UserProfileUpdatedEvent","ProjectCreatedEvent","address_state","address_city","address_postalCode","ProjectEvent","ProjectUpdatedEvent","ProjectDeletedEvent","InstallerUpdatedEvent","EventWithNoProperties","BillingPaymentDetailsUpdatedEvent","BillingDetailsUpdatedEvent","PreferencesForDesignUpdatedEvent","PreferencesForDocumentsUpdatedEvent","SEGMENT_WRITE_KEY","i","initialize","invoked","methods","factory","initialized","apply","arguments","prototype","slice","call","indexOf","c","querySelector","__t","getAttribute","p","u","href","s","t","r","referrer","unshift","load","setAttribute","_loadOptions","_writeKey","SNIPPET_VERSION","identify","hubSpotCustomProfileAttributes","auth0_id","account_id","firstname","lastname","full_name","phone","phoneNumber","undefined","trackingEventQueue","track","additionalData","properties","_hsq","analyticsSessionId","leadStore","URLSearchParams","providedUid","validUid","onboardingLeadCrmUserId","crmUserToken","analyticsUserToken","crmVisitorCookie","segmentUserCookie","hubspotutk","split","segmentSession","isSegmentActive","traits","group","groupId","trackEvent","category","reset","getRandomHex","random","toString","handleResponseProblem","method","throwErrors","endsWith","includes","status","logErrorToConsole","userErrorMessages","messages","messageObject","isSpecialUrl","context","generateSpecialErrorMessage","userErrorMessage","getHeaders","Authorization","requestTracingSpanId","fill","requestTracingRequestId","requestTracingTraceId","requestTracingSessionId","requestTracingInstanceId","traceparent","getConfig","baseConfig","customHeaders","handleRequest","jwtToken","expirationTimeInSeconds","exp","floor","isTokenExpired","reload","developmentFlagToForceRefreshAccessTokenForHostApp","creationTimeInSeconds","iat","isTokenInNeedsOfRefresh","configObject","problem","storedTracingInstanceId","storedTracingSessionJwtToken","storedTracingSessionId","requestTracingData","sessionTimeout","sessionLoading","initSessionTimeout","accessTokenValidForNextSeconds","scheduleRefreshAfterSeconds","toFixed","clearTimeout","setTimeout","refreshSession","setUser","getSession","Promise","resolve","readSession","requestConfig","ok","updateToken","originalError","code","statusText","addOnAccessTokenUpdated","addOnAccessTokenUpdatedEventListener","handler","token","hsConversationsSettings","loadImmediately","HubSpotChat","isChatApiAvailable","authenticatedUserEmail","HubSpotConversations","hsConversationsOnReady","loadWidget","loadWidgetForAnonymousVisitor","configureAndLoadWidget","loadWidgetForAuthenticatedUser","userEmail","userEmailOrNull","identificationEmail","identificationToken","isChatWidgetLoaded","resetAndReloadWidget","widget","loaded","openChatWidget","open","hubSpotChat","setUpChatWidgetForAnonymousVisitor","setUpChatWidgetForAuthenticatedUser","showChat","StoreContext","StoreProvider","Provider","useStore","PageTrackingProperties","userId","hostEnvironment","hostName","hostVersion","designToolEnvironment","designToolName","designToolVersion","isAdmin","CrmIdentityProperties","combinedName","usertoken","accountAdmin","company","showErrorToUser","errorMessage","toast","autoClose","hideProgressBar","closeOnClick","pauseOnHover","draggable","progress","getTitle","routerName","convertedTitle","startsWith","replace","charAt","toUpperCase","getProjectName","internalReferenceId","projectName","getRefText","getCustomerNameText","getAddressText","getAddressObject","placeObject","numb","street","subLocality","neighborhood","country","latitude","geometry","lat","longitude","lng","address_components","types","short_name","long_name","coordinates","getStatusText","statusIndex","classnames","classnameToFlagMap","reduce","result","formatNumberWithCommas","number","canUseDOM","isLyraUserId","auth0","uuid","cookies","secureStorage","encodingType","encryptionSecret"],"sourceRoot":""}