{"version":3,"sources":["utils/storage.ts","components/About/About.tsx","settings.ts","utils/i18n.ts","contexts/UserProfileContext.ts","types/Permission.ts","types/TwoFactorAuthMode.ts","types/IrMap.ts","contexts/AuthStateContext.ts","utils/request.ts","services/fetchService.ts","hooks/useData.ts","hooks/useLocale.ts","hooks/useDialogModes.ts","components/UserProfileDetails/Dialogs/ValidationFunctions.ts","components/UserProfileDetails/Dialogs/UserProfileIntroDialog/UserProfileIntroDialogDetails.tsx","utils/dateFunctions.ts","utils/normalizationSchemas.ts","utils/fetchImageWithAccessToken.ts","utils/PatchDelta.ts","components/UserProfileDetails/Dialogs/UserProfileIntroDialog/UserProfileIntroDialogLocale.tsx","utils/jsonEqual.ts","components/UserProfileDetails/Dialogs/Tabs.tsx","components/UserProfileDetails/Dialogs/UserProfileIntroDialog/UserProfileIntroDialog.tsx","components/UserProfileDetails/UserProfileIntro.tsx","components/UserProfileDetails/Dialogs/UserProfileSecurityDialog/UserProfileSecurityDialogPassword.tsx","components/UserProfileDetails/Dialogs/UserProfileSecurityDialog/UserProfileSecurityDialogAccessCode.tsx","components/UserProfileDetails/Dialogs/UserProfileSecurityDialog/UserProfileSecurityDialogTwoFactor.tsx","components/UserProfileDetails/Dialogs/UserProfileSecurityDialog/UserProfileSecurityDialog.tsx","components/UserProfileDetails/UserProfileSecurity.tsx","components/UserProfileDetails/UserProfileDetails.tsx","components/App.tsx","hooks/useSiteList.ts","contexts/GlobalSearchContext.ts","entities/AlarmZoneType.tsx","entities/EventAssessmentClass.ts","entities/EventClassification.ts","components/dashboard/Dashboard.tsx","components/dashboard/siteExceptions/ScheduleExceptionsTable.tsx","components/dashboard/siteExceptions/siteExceptionsUtils.ts","components/Core/AuthenticatedRoute.tsx","components/Core/Link.tsx","components/Core/LinkTab.tsx","components/Core/ListItemLink.tsx","components/Core/OkCancelDialog.tsx","components/Core/PropsRoute.tsx","components/Core/RedirectRoute.tsx","services/scheduleExceptionService.ts","hooks/useScheduleExceptions.ts","components/dashboard/siteExceptions/SiteExceptions.tsx","img/logos/irisity_logo_header.png","components/Login.tsx","components/NavBar.tsx","components/LazyLoadImage/LazyLoadImage.tsx","components/LogoAnimation/irisity-logo-animation.mp4","components/LogoAnimation/irisity-logo-animation.ogv","components/LogoAnimation/irisity-logo-animation.png","components/LogoAnimation/irisity-logo-animation.webm","components/LogoAnimation/LogoAnimation.tsx","components/SiteDetails/SiteAlarms/AlarmVideo.tsx","hooks/useAlarms.ts","components/SiteDetails/SiteAlarms/AlarmOverlayVideo.tsx","components/SiteDetails/SiteAlarms/AlarmThumbnail.tsx","components/SiteDetails/SiteAlarms/AlarmDetails.tsx","components/SiteDetails/SiteAlarms/AlarmsGridList.tsx","components/SiteDetails/SiteAlarms/SiteAlarms.tsx","hooks/useSiteDetails.ts","components/SiteDetails/SiteOverview/SiteOverviewVideoStream.tsx","components/SiteDetails/SiteOverview/Schedule.tsx","components/SiteDetails/SiteOverview/Instructions.tsx","components/SiteDetails/SiteOverview/SiteOverviewConfigurationGroup.tsx","components/SiteDetails/SiteOverview/SiteOverview.tsx","components/SiteDetails/SiteDetails.tsx","serviceWorker.ts","services/userProfileService.ts","contexts/AuthStateContextProvider.tsx","hooks/useDebounce.tsx","contexts/GlobalSearchContextProvider.tsx","styles/theme.ts","contexts/UserProfileContextProvider.tsx","index.tsx"],"names":["irStore","About","t","useTranslation","className","Container","maxWidth","to","apiUrl","process","getIrStore","REACT_APP_API_KEY","store","namespace","getUserLanguage","language","get","getBrowserLanguage","length","substr","getUserLocale","storeUserLanguage","set","storeUserLocale","locale","getToken","token","moment","isAfter","accessTokenExpiresAt","remove","undefined","getUserLastKnownRoute","storeUserProfile","profile","languageKey","key","i18n","changeLanguage","storeToken","i","nav","window","navigator","browserLanguagePropertyKeys","Array","isArray","languages","UserProfileContext","createContext","useUserProfile","useContext","Permission","TwoFactorAuthMode","IrMap","AuthStateContext","useAuth","getApiRequestHeaders","headers","Authorization","accessToken","dataApiRequestHeaders","makeApiUrl","path","params","Object","keys","filter","map","encodeURI","join","queryParams","fetchWithIntercept","url","method","logout","body","abortController","anonymousRequest","requestInit","JSON","stringify","signal","fetch","then","response","ok","includes","status","useData","useState","data","setData","isLoading","setIsLoading","hasError","setHasError","AbortController","fetchData","_url","a","json","jsonResponse","Error","error","useEffect","catch","abort","refreshData","useLocales","setLanguages","timeZones","setTimeZones","locales","setLocales","getLocalizationStatus","setGetLocalizationStatus","languagesResponse","languagesIsLoading","languagesHasError","useLanguages","timeZonesResponse","timeZonesIsLoading","timeZonesHasError","useTimeZones","localesResponse","localesIsLoading","localesHasError","useLocalesInternal","timeZonesDictionary","forEach","tz","translatedTz","push","value","useDialogModes","fullscreen","useMediaQuery","isValidPhoneNumber","match","UserProfileIntroDialogDetails","props","fullName","displayName","email","phoneNumber","smsNumber","originalProfile","setOriginalProfile","isDirty","setIsDirty","saveSuccessful","setSaveSuccessful","setFullName","fullNameValid","setFullNameValid","setDisplayName","setEmail","setPhoneNumber","phoneNumberValid","setPhoneNumberValid","setSmsNumber","smsNumberValid","setSmsNumberValid","isDataLoading","saveProfileStatus","showRevertInformation","handleIsDirty","result","validateFullName","valid","isValidName","validatePhoneNumber","validateSmsNumber","isDirtyResult","onChange","CircularProgress","data-testid","IconButton","color","size","onClick","icon","faUndoAltRegular","fixedWidth","faExclamationTriangleSolid","faCheckSolid","htmlFor","TextField","inputProps","id","required","fullWidth","variant","type","autoComplete","disabled","helperText","e","target","Button","validateForm","updatedProfile","updateUser","formatDateTime","dateTime","timeZone","format","partnerSchemaDef","schema","Entity","companySchema","idAttribute","partner","company","fetchImageWithAccessToken","ajax","responseType","pipe","imageGetResponse","blob","Blob","xhr","getResponseHeader","URL","createObjectURL","catchError","of","PatchDelta","original","changed","diff","changedCopy","cloneDeep","forOwn","isEqual","UserProfileIntroDialogLocale","name","timeZoneName","setTimeZoneName","timeZoneNameValid","setTimeZoneNameValid","setLanguageKey","languageKeyValid","setLanguageKeyValid","setLocale","localeValid","setLocaleValid","validateTimeZone","handleChangeTimeZone","selectedTimeZone","find","b","validateLanguage","validateLocale","select","sort","MenuItem","handleChangeLanguage","lang","handleChangeLocale","loc","validateLocaleForm","Tabs","initialValue","titles","disableSwitching","handleChangeTab","children","activeTab","setActiveTab","tab","cx","faChevronRight","UserProfileIntroDialog","initialTab","setShowRevertInformation","TabTitles","DetailsTab","LocaleTab","handleOnChange","isFormDirty","faExclamationTriangle","edge","onClose","faArrowLeft","currentTab","UserProfileIntro","introDialogIsOpen","setIntroDialogIsOpen","introDialogInitialTab","setIntroDialogInitialTab","introDialogFormDirty","setIntroDialogFormDirty","handleEditIntroButtonClick","handleIntroDialogClose","event","reason","faUser","faPen","faGlobe","faLanguage","Dialog","open","fullScreen","UserProfileSecurityDialogPassword","twoFactorAuthentication","showTwoFactorCodeField","showNewPassword","setShowNewPassword","showCurrentPassword","setShowCurrentPassword","showNewPasswordValidation","setShowNewPasswordValidation","newPassword","setNewPassword","newPasswordValid","setNewPasswordValid","newPasswordMatchesCurrentPassword","setNewPasswordMatchesCurrentPassword","confirmPassword","setConfirmPassword","confirmPasswordValid","setConfirmPasswordValid","currentPassword","setCurrentPassword","twoFactorAuthCode","setTwoFactorAuthCode","validateNewPassword","checkIfNewPasswordMatchesCurrentPassword","passwordValidationIcon","handleShowNewPassword","handleMouseDownPasswordInput","preventDefault","validateConfirmPassword","errorMessage","FormControl","OutlinedInput","margin","onBlur","endAdornment","InputAdornment","position","aria-label","onMouseDown","faEyeSlashLight","faEyeLight","FormHelperText","validateNewPasswordAtLeastSevenCharacters","validateNewPasswordAtLeastOneNumber","validateNewPasswordAtLeastOneSpecialCharacter","newProfile","UserProfileSecurityDialogAccessCode","showAccessCodeValidation","setShowAccessCodeValidation","accessCode","setAccessCode","accessCodeLengthValid","setAccessCodeLengthValid","accessCodeContentValid","setAccessCodeContentValid","validateAccessCodeLength","validateAccessCodeContent","UserProfileSecurityDialogTwoFactor","showEnableTwoFactorHint","setShowEnableTwoFactorHint","setShowTwoFactorCodeField","enableTwoFactorAuth","setEnableTwoFactorAuth","FormControlLabel","control","Checkbox","checked","label","labelPlacement","faInfoCircleSolid","GoogleAuthenticator","UserProfileSecurityDialog","ChangePassword","ChangeAccessCode","ChangeTwoFactor","UserProfileSecurity","securityDialogIsOpen","setSecurityDialogIsOpen","securityDialogInitialTab","setSecurityDialogInitialTab","securityDialogFormDirty","setSecurityDialogFormDirty","handleSecurityDialogClose","faKey","isUserVerified","faCheck","hasAccessCode","Fragment","autoLogoutMinutes","UserProfileDetails","userProfile","updateUserProfile","renderComponents","useCallback","Skeleton","height","style","marginBottom","App","redirectRoute","component","Dashboard","SiteDetails","Login","redirectIfLoggedIn","getSorterForProperty","property","site","toLowerCase","useSiteList","sortProperty","setSortProperty","sortDirection","setSortDirection","sites","setSites","siteListIsLoading","setSiteListIsLoading","sitesList","sitesLoading","sitesHasError","useSites","siteStatistics","siteStatisticsLoading","siteStatisticsHasError","useSiteStatistics","useMemo","mappedSites","siteState","statistics","stat","_orderBy","orderedSites","sortSites","GlobalSearchContext","useGlobalSearch","AlarmZoneType","EventAssessmentClass","EventClassification","SkeletonCell","TableCell","colSpan","Fade","in","timeout","enter","exit","SkeletonRow","TableRow","width","globalSearchTerm","history","useHistory","exceptionDialogOpen","setExceptionDialogOpen","menuSite","setMenuSite","menuAnchorElement","setMenuAnchorElement","menuAvailable","setMenuAvailable","siteLinkEnabled","setSiteLinkEnabled","filteredSites","s","hasSiteScheduleExceptionsPermissions","userPermissions","partnerPermissions","sitePermissions","hasSiteInformationPermissions","LinearProgress","Paper","Menu","keepMounted","anchorEl","Icon","Table","stickyHeader","TableHead","align","Typography","sitesShown","sitesTotal","TableSortLabel","active","direction","TableBody","hover","siteId","Avatar","Box","textOverflow","xs","sm","md","noWrap","eventsLastWeek","eventsLastDay","stopPropagation","faEllipsisV","ScheduleExceptionsTable","analysisEnabledCaption","removeButtonCaption","removeRequestLoading","scheduleExceptions","disableRemoveButton","clicked","setClicked","ex","appliesTo","isFullSiteException","configurationGroups","cg","isOnType","faEye","faEyeSlash","faLowVision","dtStart","dtStop","title","onRemove","handleRemove","startIcon","faCircleNotch","spin","faTimes","hasDatesInPast","start","end","utcNow","isBefore","hasInvalidEndDate","isSameOrBefore","hasCollisions","ret","isSameOrAfter","AuthenticatedRoute","route","location","pathname","RouterLinkComponent","React","forwardRef","ref","innerRef","Link","this","Component","InternalLinkTab","Tab","LinkTab","ListItemLink","renderLink","itemProps","ListItem","button","OkCancelDialog","okButtonText","handleCancel","disableBackdropClick","disablePortal","DialogTitle","DialogContent","dividers","DialogActions","autoFocus","PropsRoute","WrappedComponent","withProps","routeProps","render","childProps","RedirectRoute","addScheduleException","scheduleException","updateScheduleException","useScheduleExceptions","scheduleExceptionsPostIsLoading","setScheduleExceptionsPostIsLoading","scheduleExceptionsPostHasError","setScheduleExceptionsPostHasError","scheduleExceptionsDeleteIsLoading","setScheduleExceptionsDeleteIsLoading","scheduleExceptionsDeleteHasError","setScheduleExceptionsDeleteHasError","setScheduleExceptions","scheduleExceptionsList","scheduleExceptionsIsLoading","scheduleExceptionsHasError","refreshScheduleExceptions","values","utc","useScheduleExceptionsInternal","postException","deleteException","SiteExceptions","duration","setDuration","exceptionEnabled","setExceptionEnabled","advancedMode","setAdvancedMode","showHistorical","setShowHistorical","setDtStart","add","setDtStop","showErrorMessage","setShowErrorMessage","setErrorMessage","showOverlapConfirmation","setShowOverlapConfirmation","scheduleExceptionsOngoing","setScheduleExceptionsOngoing","scheduleExceptionsUpcoming","setScheduleExceptionsUpcoming","scheduleExceptionsHistorical","setScheduleExceptionsHistorical","handleEndOrRemoveExceptionClick","submitData","scheduleExceptionId","onApply","allowOverride","clone","durationSeconds","asSeconds","collisions","datesInPast","invalidEndDate","overrideExistingExceptions","handleOverrideDialogClosed","okClicked","now","ongoing","isBetween","upcoming","historical","setScheduleExceptionArrays","Snackbar","message","autoHideDuration","gutterBottom","ButtonGroup","utils","MomentUtils","mx","DateTimePicker","ampm","clearable","disablePast","onError","InputLabel","Select","labelId","count","exception","Switch","Divider","faInfoCircle","authError","isLoggedIn","requiresTwoFactorAuth","twoFactorStatusError","checkTwoFactorStatus","login","username","setUsername","password","setPassword","submitForm","noValidate","onSubmit","src","irisityLogo","alt","mt","p","NavBar","auth","clearGlobalSearchTerm","debounceTerm","setGlobalSearchTerm","useLocation","menuIsOpen","setMenuIsOpen","drawerIsOpen","setDrawerIsOpen","toggleDrawerOpen","handleMenuClose","AppBar","Toolbar","logo","faSearch","InputBase","placeholder","classes","root","input","faBars","anchorOrigin","vertical","horizontal","transformOrigin","SwipeableDrawer","anchor","onOpen","role","onKeyDown","List","ListItemIcon","faHome","ListItemText","primary","faDoorClosed","LazyLoadImage","imageSrc","setImageSrc","inViewport","setInViewport","wrapperRef","useRef","sub","subscribe","unsubscribe","observer","didCancel","current","IntersectionObserver","entries","entry","intersectionRatio","isIntersecting","unobserve","intersectionNode","threshold","rootMargin","observe","onLoad","complete","classList","LogoAnimation","objectPosition","overflow","autoPlay","poster","posterImage","animationWebm","animationMp4","animationOgv","AlarmVideoInternal","handleLoadedMetaData","onLoadedMetadata","handleLoadedData","onLoadedData","handleLoadStart","onLoadStart","state","video","controls","pt","AlarmVideo","withTranslation","withStyles","createStyles","withTheme","useAlarms","_siteId","_from","_to","from","setFrom","setTo","fromDate","toDate","offset","generateVideoUrl","generateOverlayUrl","alarmsResponse","alarmsIsLoading","alarmsHasError","useAlarmsInternal","alarms","events","changeDates","__from","__to","AlarmOverlayVideoInternal","handleLoadedMetadata","setState","videoWidth","videoHeight","videoDataLoaded","renderOverlay","overlay","relativeToSvg","x","y","X","Y","absoluteToSvg","alarmZonePaths","paths","alarmZones","flatMap","alarmZone","alarmZoneIndex","coords","polygon","vertex","vertexIndex","points","startsWith","vectorEffect","d","triggeredAlarmZonePath","triggeredAlarmZone","getBoundingBoxCoords","resized","blobHistoryPath","blobPositionHistory","boundingBoxPaths","boundingBoxes","bbox","index","dropShadows","blobHistory","dropShadowPaths","MotionDetection","ViolentBehaviorDetection","FallDetection","viewBox","xmlns","LoiteringDetection","AlarmOverlayVideo","AlarmThumbnailInternal","animate","frame","forceUpdate","handleVideoLoadingError","videoLoadingError","loading","subscription","interval","imageUrl","fetchImage","prevProps","alarm","friendlyId","paddingBottom","image","hidden","backgroundImage","backgroundPosition","AlarmThumbnail","AlarmDetails","findInfoString","isTranslatable","strings","videoUrl","siteEquipmentName","functionalityName","dtEvent","eventAssessmentClass","Unknown","eventClassification","L2HumanActivityNo","L2HumanActivityUncertain","L2HumanActivityYes","FlameNo","FlameYes","LoiteringHumanActivityNo","LoiteringHumanActivityYes","Human","ViolentBehaviorNo","ViolentBehaviorYes","FallNo","FallYes","RailDefenderNo","RailDefenderYes","UnattendedObjectNo","UnattendedObjectYes","getClassificationInfo","NoAssessmentNeeded","NoClassificationNeeded","decisionMakingDetails","split","infoString","getEvaluationInfo","MeasureTaken","measureTakingDetails","getMeasureInfo","AlarmsGridListInternal","gridRef","createRef","GridList","gridList","cols","cellHeight","spacing","GridListTile","gridListTile","tile","gridListTileInner","selectedAlarmId","GridListTileBar","subtitle","AlarmsGridList","theme","simpleScroll","display","flexWrap","justifyContent","borderRadius","backgroundColor","cursor","border","backgroundRepeat","backgroundSize","withRouter","SiteAlarms","initialTo","endOf","initialFrom","startOf","siteAlarmsUrl","alarmsPeriod","setAlarmsPeriod","setSelectedAlarmId","selectedAlarm","setSelectedAlarm","updateSelectedAlarm","fetchOverlay","overlayUrl","overlayResponse","overlayJson","alarmOverlay","overlayError","console","log","alarmId","substring","_alarm","_alarmId","alarmResponse","alarmJson","loadSingleAlarm","alarmError","Card","CardContent","mb","newFrom","newTo","newPeriod","subtract","useSiteDetails","siteIsLoading","siteHasError","useSite","videoStreamList","videoStreamsIsLoading","videoStreamsHasError","videoStreams","videoStream","dtLastImageUpdate","periodicImageUploadStatus","images","latestImageUpdateStatus","dtCreated","dtLastState","useVideoStreams","configurations","configurationsIsLoading","configurationsHasError","useConfigurations","siteDetails","siteDetailsIsLoading","siteDetailsHasError","SiteOverviewVideoStream","ratio","latest","paddingTop","hexColor","configurationGroup","polyIndex","fill","fillOpacity","stroke","strokeOpacity","strokeWidth","Schedule","schedule","weeklySchedule","daySchedules","dayType","scheduleTimePeriods","period","timePeriodIndex","startTime","stopTime","Instructions","instruction","text","SiteOverviewConfigurationGroup","expanded","setExpanded","faChevronDown","SiteOverviewInternal","dense","disablePadding","disableGutters","siteOverviewListPrimary","siteOverviewListSpacer","siteOverviewListSecondary","functionalities","SiteOverview","palette","secondary","background","divider","setSite","currentUrl","getActiveRoute","activeRoute","setActiveRoute","light","exact","test","Boolean","hostname","patchDelta","errors","activate2fa","twoFactorUrl","twoFactorResponse","userRequiresTwoFactor","fetchUserProfile","profileResponse","fetchToken","credentials","tokenResponse","rawToken","jwtDecode","unix","exp","AuthStateContextProvider","setAuth","setAuthError","setIsLoggedIn","setRequiresTwoFactorAuth","setTwoFactorError","clear","clearStorage","replace","twoFactorStatus","Provider","useDebounce","userLanguage","delay","debouncedValue","setDebouncedValue","handler","setTimeout","clearTimeout","GlobalSearchContextProvider","term","setTerm","setDebounceTerm","debouncedSearch","toLocaleLowerCase","createMuiTheme","default","Colors","paper","overrides","MuiAppBar","colorPrimary","darken","MuiPaper","UserProfileContextProvider","setUserProfile","setSaveProfileStatus","fetchAndSetUser","difference","isEmpty","use","initReactI18next","Backend","init","lng","keySeparator","interpolation","escapeValue","backend","loadPath","createBrowserHistory","ReactDOM","StylesProvider","injectFirst","CssBaseline","fallback","document","getElementById","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.86092a47.chunk.js","sourcesContent":["import store, { StoreAPI } from \"store2\";\nimport moment from \"moment-timezone\";\nimport { LoginDetails } from \"src/types\";\nimport { UserProfile } from \"../entities\";\n// import { LoginDetails } from \"../actions\";\nimport { changeLanguage } from \"./i18n\";\n\nlet irStore: StoreAPI | undefined;\nexport const getIrStore = (): StoreAPI => {\n if (!irStore) {\n irStore = store.namespace(\"ir\");\n }\n return irStore;\n};\n\nexport const getUserLanguage = () => {\n let language: string = getIrStore().get(\"language\") || getBrowserLanguage();\n if (language && language.length > 2) {\n language = language.substr(0, 2);\n }\n return language;\n};\nexport const getUserLocale = () => getIrStore().get(\"locale\") || getBrowserLanguage();\nexport const getUserProfile = () => getIrStore().get(\"profile\");\nconst storeUserLanguage = (language: string) => {\n getIrStore().set(\"language\", language);\n};\nconst storeUserLocale = (locale: string) => {\n getIrStore().set(\"locale\", locale);\n};\nexport const removeToken = () => getIrStore().remove(\"token\");\nexport const removeUserProfile = () => getIrStore().remove(\"profile\");\n\nexport const clearStorage = () => {\n const language = getUserLanguage();\n const locale = getUserLocale();\n getIrStore().clear();\n if (language) {\n storeUserLanguage(language);\n }\n if (locale) {\n storeUserLocale(locale);\n }\n};\n\nexport const getToken: () => LoginDetails | undefined = () => {\n let token: LoginDetails | undefined = getIrStore().get(\"token\") as LoginDetails;\n if (token) {\n if (moment().isAfter(token.accessTokenExpiresAt)) {\n removeToken();\n token = undefined;\n }\n }\n return token;\n};\n\nexport const getUserLastKnownRoute = () => {\n return getIrStore().get(\"lastKnownRoute\");\n};\n\nexport const setUserLastKnownRoute = (route: string) => {\n getIrStore().set(\"lastKnownRoute\", route);\n};\n\nexport const clearUserLastKnownRoute = () => {\n getIrStore().remove(\"lastKnownRoute\");\n};\n\nexport const storeUserProfile = (profile: UserProfile) => {\n getIrStore().set(\"profile\", profile);\n if (profile.locale && profile.language) {\n moment.locale(profile.locale);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n changeLanguage(profile.language.key);\n storeUserLanguage(profile.language.key);\n storeUserLocale(profile.locale);\n }\n};\n\nexport const storeToken = (token: LoginDetails) => {\n getIrStore().set(\"token\", token);\n};\n\nfunction getBrowserLanguage(): string {\n const nav = window.navigator as any;\n const browserLanguagePropertyKeys = [\"language\", \"browserLanguage\", \"systemLanguage\", \"userLanguage\"];\n let i: number;\n let language: string;\n\n // support for HTML 5.1 \"navigator.languages\"\n if (Array.isArray(nav.languages)) {\n for (i = 0; i < nav.languages.length; i++) {\n language = nav.languages[i];\n if (language && language.length) {\n return language;\n }\n }\n }\n\n // support for other well known properties in browsers\n for (i = 0; i < browserLanguagePropertyKeys.length; i++) {\n language = nav[browserLanguagePropertyKeys[i]];\n if (language && language.length) {\n return language;\n }\n }\n return \"en\";\n}\n","import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Container } from \"@material-ui/core/\";\nimport { Link, LogoAnimation } from \"src/components\";\n\nimport \"./About.scss\";\nimport \"../Login.scss\";\n\nexport const About = () => {\n const { t } = useTranslation();\n return (\n
\n
\n
\n
\n
\n \n \n
\n
\n Meet the smartest, most curious, most exact\n
trouble spotter in the surveillance business.\n
(Yes, it’s a machine, a very intelligent machine.)\n
\n\n

\n How many times have you heard people blaming ‘the human factor?’ To err is human, as\n they say. But in the security business, the goal is a zero fail rate, something\n nobody comes closer to than Irisity.\n

\n\n
\n

\n Basic problem: data overload. The poor humans whose job it is to monitor a\n typical large CCTV system are exposed to 4,000,000,000,000! pixels over 24\n hours. Four trillion!\n

\n\n

\n How on earth do you spot all human activity, i.e. all the bad guys, in that\n information torrent? And only the bad guys, so you don’t sound a false alarm\n because of shadows or moving curtains or animals or what have you?\n

\n\n

\n This is the problem Irisity has solved. And the solution is based on Artificial\n Intelligence and Machine Learning coupled with vigilant human input.\n

\n\n

\n With Irisity, nobody sits and stares day-long at a screen where nothing is\n happening. But when a camera does detect movement, an eight-second sequence is\n shown to the operator. He or she then decides whether it’s human activity or\n not, and let’s the system know. And sounds the alarm, if called for.\n

\n\n

\n Too simplistic? Let’s get back to Artificial Intelligence and Machine Learning.\n The “thinking part” of our system comprises nine patented algorithms (with four\n more pending). So far we’ve invested sixty million SEK into these algorithms,\n and the work continues.\n

\n\n

\n Every single time an operator determines that there’s human activity in the\n camera sequence, these specific pixel combinations are also added to the\n knowledge bank. Thus, the system simply keeps getting smarter and smarter and\n learns to detect and pass on only what’s interesting in any given picture. Which\n means the operator only has to deal with truly confirmed human activity.\n

\n\n

\n Irisity has been doing this in Scandinavia for ten years. For more than 350\n companies. The information that has been processed by our algorithms to date and\n incorporated into our proprietary knowledge bank is vast. And while you read\n this, it grew yet another bit.\n

\n
\n
\n\n \n \n {t(\"BeforeLogin.About.BackToLoginPage\")}\n \n
\n
\n
\n
\n
\n );\n};\n","export const apiUrl = process.env.REACT_APP_API_ENDPOINT || \"\";\nexport const apiKey = process.env.REACT_APP_API_KEY || \"\";\n","import i18n from \"i18next\";\nimport Backend from \"i18next-xhr-backend\";\nimport { initReactI18next } from \"react-i18next\";\nimport { apiUrl } from \"../settings\";\n\nexport const initLanguageHandling = (userLanguage: string) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n i18n.use(initReactI18next)\n .use(Backend)\n .init({\n lng: userLanguage,\n keySeparator: false,\n interpolation: {\n escapeValue: false,\n },\n backend: {\n loadPath: `${apiUrl}/translations?lang={{lng}}`,\n },\n // debug: true,\n });\n};\n\nexport const changeLanguage = (languageKey: string) => {\n return i18n.changeLanguage(languageKey);\n};\n","import { createContext, useContext } from \"react\";\nimport { Profile, SaveDataTransferStatus } from \"src/types\";\n\nexport type UserProfileContextType = {\n saveProfileStatus: SaveDataTransferStatus;\n userProfile: Profile | undefined;\n updateUserProfile: (updatedProfile: Profile) => Promise;\n};\n\nexport const UserProfileContext = createContext>({});\n\nexport function useUserProfile() {\n return useContext(UserProfileContext) as UserProfileContextType;\n}\n","export enum Permission {\n DevelopmentTesting = 999,\n\n GlobalSysAdmin = 1,\n GlobalMonitoring = 2,\n\n PartnerSettings = 101,\n PartnerOperations = 102,\n PartnerMonitoring = 103,\n\n SiteBilling = 3,\n SiteInformation = 6,\n SiteConfiguration = 7,\n SiteFunctionalConfiguration = 8,\n SiteScheduleExceptions = 9,\n\n AlarmHandling = 10,\n}\n","export enum TwoFactorAuthMode {\n None = \"None\",\n GoogleAuthenticator = \"GoogleAuthenticator\",\n}\n","import type { IrKvp } from \"./IrKvp\";\n\nexport class IrMap extends Array> {}\n","import { createContext, useContext } from \"react\";\nimport { LoginDetails, LoginRequest } from \"src/types\";\n\ntype Credentials = Omit;\n\nexport type AuthStateContextType = {\n auth: LoginDetails | undefined;\n authError: boolean;\n isLoggedIn: boolean;\n requiresTwoFactorAuth: boolean;\n twoFactorStatusError: boolean;\n checkTwoFactorStatus: (email: string) => void;\n login: (credentials: Credentials) => Promise;\n logout: () => void;\n};\n\nexport const AuthStateContext = createContext>({});\n\nexport function useAuth() {\n return useContext(AuthStateContext) as AuthStateContextType;\n}\n","import { apiUrl } from \"../settings\";\nimport { getToken } from \"./storage\";\n\nexport const getApiRequestHeaders = () => {\n const token = getToken();\n\n return {\n headers: {\n Authorization: `Bearer ${token ? token.accessToken : \"\"}`,\n },\n };\n};\n\nexport const dataApiRequestHeaders = () => {\n const token = getToken();\n\n return {\n headers: {\n Authorization: `Bearer ${token?.accessToken ?? \"\"}`,\n \"Content-Type\": \"application/json\",\n },\n };\n};\n\ntype QueryParams = { [key: string]: string | number | boolean };\n/**\n * Builds a query string from an object\n * @param params object to convert into query string\n * @returns query string without ?\n */\nexport const queryParams = (params: QueryParams): string =>\n Object.keys(params)\n .filter((key) => params[key])\n .map((key) => `${key}=${encodeURI(params[key] as string)}`)\n .join(\"&\");\n\nexport const makeApiUrl = (path: string, params?: QueryParams): string =>\n params ? `${apiUrl}${path}?${queryParams(params)}` : `${apiUrl}${path}`;\n\nexport const getSensorImageUrl = (sensorId: string) =>\n makeApiUrl(\"/sensorImage\", {\n sensorId: encodeURI(sensorId),\n });\n\nexport const getImageUrl = (path: string) => makeApiUrl(path);\n","import { dataApiRequestHeaders, getApiRequestHeaders } from \"src/utils/request\";\n\nexport const fetchWithIntercept = (\n url: string,\n method: string,\n logout: () => void,\n body?: any,\n abortController?: AbortController,\n anonymousRequest = false,\n) => {\n let requestInit: RequestInit = anonymousRequest ? { method } : { method, ...getApiRequestHeaders() };\n\n if (body) {\n requestInit = { ...requestInit, ...dataApiRequestHeaders() };\n requestInit.body = JSON.stringify(body);\n }\n\n if (abortController) {\n requestInit = { ...requestInit, signal: abortController.signal };\n }\n\n return fetch(url, requestInit).then((response) => {\n if (!response.ok) {\n if ([401, 403].includes(response.status)) {\n // auto logout if 401 Unauthorized or 403 Forbidden response returned from api\n logout();\n }\n }\n\n return response;\n });\n};\n","import { useState, useEffect } from \"react\";\nimport { useAuth } from \"src/contexts/AuthStateContext\";\nimport { fetchWithIntercept } from \"src/services/fetchService\";\n\nexport const useData = (url: string | undefined) => {\n const { logout } = useAuth();\n const [data, setData] = useState();\n const [isLoading, setIsLoading] = useState(false);\n const [hasError, setHasError] = useState(false);\n\n const abortController = new AbortController();\n\n const fetchData = async (_url: string) => {\n try {\n setHasError(false);\n setIsLoading(true);\n\n const response = await fetchWithIntercept(_url, \"GET\", logout, undefined, abortController);\n const jsonResponse = await response.json();\n\n if (!response.ok) {\n throw new Error(jsonResponse.error);\n }\n\n setData(jsonResponse as T);\n setIsLoading(false);\n } catch (err) {\n setHasError(true);\n }\n };\n\n const refreshData = () => {\n if (url) {\n fetchData(url).catch(() => {\n setHasError(true);\n });\n }\n };\n\n useEffect(() => {\n if (url) {\n fetchData(url).catch(() => {\n setHasError(true);\n });\n }\n\n return () => {\n if (abortController) {\n abortController.abort();\n }\n };\n }, [url]);\n\n return { data, isLoading, hasError, refreshData };\n};\n","import { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { apiUrl } from \"src/settings\";\nimport { GetDataTransferStatus, IrMap, Language } from \"src/types\";\nimport { useData } from \"./useData\";\n\nconst useLanguages = () => {\n const url = `${apiUrl}/profile/languages`;\n const { data: languagesResponse, isLoading: languagesIsLoading, hasError: languagesHasError } = useData(\n url,\n );\n return { languagesResponse, languagesIsLoading, languagesHasError };\n};\n\nconst useTimeZones = () => {\n const url = `${apiUrl}/timeZones`;\n const { data: timeZonesResponse, isLoading: timeZonesIsLoading, hasError: timeZonesHasError } = useData(\n url,\n );\n return { timeZonesResponse, timeZonesIsLoading, timeZonesHasError };\n};\n\nconst useLocalesInternal = () => {\n const url = `${apiUrl}/locales`;\n const { data: localesResponse, isLoading: localesIsLoading, hasError: localesHasError } = useData(url);\n return { localesResponse, localesIsLoading, localesHasError };\n};\n\nexport const useLocales = () => {\n const [languages, setLanguages] = useState();\n const [timeZones, setTimeZones] = useState>();\n const [locales, setLocales] = useState();\n const [getLocalizationStatus, setGetLocalizationStatus] = useState({\n isLoading: true,\n hasError: false,\n });\n\n const { t } = useTranslation();\n const { languagesResponse, languagesHasError } = useLanguages();\n const { timeZonesResponse, timeZonesHasError } = useTimeZones();\n const { localesResponse, localesHasError } = useLocalesInternal();\n\n useEffect(() => {\n if (languagesResponse) {\n setLanguages(languagesResponse);\n }\n }, [languagesResponse]);\n\n useEffect(() => {\n if (timeZonesResponse) {\n const timeZonesDictionary = new IrMap();\n\n timeZonesResponse.forEach((tz: string) => {\n const translatedTz = t(`Entities.TimeZone.${tz}`);\n timeZonesDictionary.push({ key: tz, value: translatedTz });\n });\n\n setTimeZones(timeZonesDictionary);\n }\n }, [timeZonesResponse]);\n\n useEffect(() => {\n if (localesResponse) {\n setLocales(localesResponse);\n }\n }, [localesResponse]);\n\n useEffect(() => {\n if (languages && timeZones && locales) {\n setGetLocalizationStatus({\n isLoading: false,\n hasError: false,\n });\n } else if (languagesHasError || timeZonesHasError || localesHasError) {\n setGetLocalizationStatus({\n isLoading: false,\n hasError: true,\n });\n }\n }, [languages, timeZones, locales]);\n\n return { languages, timeZones, locales, getLocalizationStatus };\n};\n","import { useMediaQuery } from \"@material-ui/core\";\n\nexport const useDialogModes = () => {\n const fullscreen = useMediaQuery(\"(max-width:600px)\");\n return { fullscreen };\n};\n","export const isValidName = (value: string | undefined) => {\n if (value) {\n return true;\n }\n return false;\n};\n\nexport const isValidPhoneNumber = (value: string | undefined) => {\n if (value && value.match(/^\\+(?:[(]?([0-9])[)]?[- ]?){6,14}[0-9]$/)) {\n return true;\n }\n return false;\n};\n\nexport const isValidPassword = (value: string) => {\n if (value && value.length >= 6) {\n return true;\n }\n return false;\n};\n\nexport const isValidAccessCodeLength = (value: string) => {\n if (value && value.length === 6) {\n return true;\n }\n return false;\n};\n\nexport const isAlphanumerical = (value: string) => {\n if (value && value.match(/^[a-zA-Z0-9]*$/)) {\n return true;\n }\n return false;\n};\n","import React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Button, CircularProgress, IconButton, TextField } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUndoAlt as faUndoAltRegular } from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCheck as faCheckSolid,\n faExclamationTriangle as faExclamationTriangleSolid,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { Profile, SaveDataTransferStatus } from \"src/types\";\nimport { isValidPhoneNumber, isValidName } from \"../ValidationFunctions\";\n\ntype UserProfileIntroDialogDetailsProps = {\n profile: Profile;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n onChange: (isDirty: boolean) => void;\n isDataLoading: boolean;\n showRevertInformation: boolean;\n};\n\nexport const UserProfileIntroDialogDetails = (props: UserProfileIntroDialogDetailsProps) => {\n const [originalProfile, setOriginalProfile] = useState({\n fullName: props.profile.fullName,\n displayName: props.profile.displayName,\n email: props.profile.email,\n phoneNumber: props.profile.phoneNumber || \"\",\n smsNumber: props.profile.smsNumber || \"\",\n });\n const [isDirty, setIsDirty] = useState(false);\n const [saveSuccessful, setSaveSuccessful] = useState(false);\n const [fullName, setFullName] = useState(props.profile.fullName || undefined);\n const [fullNameValid, setFullNameValid] = useState(true);\n const [displayName, setDisplayName] = useState(props.profile.displayName || undefined);\n const [email, setEmail] = useState(props.profile.email || undefined);\n const [phoneNumber, setPhoneNumber] = useState(props.profile.phoneNumber || \"\");\n const [phoneNumberValid, setPhoneNumberValid] = useState(true);\n const [smsNumber, setSmsNumber] = useState(props.profile.smsNumber || \"\");\n const [smsNumberValid, setSmsNumberValid] = useState(true);\n\n const { isDataLoading, saveProfileStatus, showRevertInformation } = props;\n\n const { t } = useTranslation();\n\n const handleIsDirty = () => {\n let result = false;\n\n if (\n originalProfile.fullName !== fullName ||\n originalProfile.displayName !== displayName ||\n originalProfile.email !== email ||\n originalProfile.phoneNumber !== phoneNumber ||\n originalProfile.smsNumber !== smsNumber\n ) {\n result = true;\n }\n\n setIsDirty(result);\n return result;\n };\n\n const handleRevertChanges = () => {\n setFullName(originalProfile.fullName);\n setDisplayName(originalProfile.displayName);\n setEmail(originalProfile.email);\n setPhoneNumber(originalProfile.phoneNumber);\n setSmsNumber(originalProfile.smsNumber);\n };\n\n const validateFullName = (value: string | undefined) => {\n const valid = isValidName(value);\n setFullNameValid(valid);\n return valid;\n };\n\n const validatePhoneNumber = (value: string | undefined) => {\n const valid = !value || isValidPhoneNumber(value);\n setPhoneNumberValid(valid);\n return valid;\n };\n\n const validateSmsNumber = (value: string | undefined) => {\n const valid = !value || isValidPhoneNumber(value);\n setSmsNumberValid(valid);\n return valid;\n };\n\n const validateForm = () => {\n let valid = true;\n if (!validateFullName(fullName) || !validatePhoneNumber(phoneNumber) || !validateSmsNumber(smsNumber)) {\n valid = false;\n }\n\n return valid;\n };\n\n const saveProfile = () => {\n if (validateForm()) {\n const updatedProfile = {\n fullName,\n displayName,\n email,\n phoneNumber: phoneNumber || null,\n smsNumber: smsNumber || null,\n } as Profile;\n\n props\n .updateUser(updatedProfile)\n .then(() => {\n setSaveSuccessful(true);\n })\n .catch(() => {\n setSaveSuccessful(false);\n });\n }\n };\n\n useEffect(() => {\n setOriginalProfile({\n fullName: props.profile.fullName,\n displayName: props.profile.displayName,\n email: props.profile.email,\n phoneNumber: props.profile.phoneNumber || \"\",\n smsNumber: props.profile.smsNumber || \"\",\n });\n }, [props.profile]);\n\n useEffect(() => {\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [originalProfile]);\n\n useEffect(() => {\n const isDirtyResult = handleIsDirty();\n if (isDirtyResult) setSaveSuccessful(false);\n props.onChange(isDirtyResult);\n }, [fullName, displayName, email, phoneNumber, smsNumber]);\n\n return (\n <>\n
\n

{t(\"Gui.Common.UserProfileIntroDialog.DetailsTabHeader\")}

\n {isDataLoading ? (\n \n ) : null}\n
\n {showRevertInformation ? (\n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesSwitchTabsWarning\")}\n

\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesRevert\")}\n \n \n \n

\n
\n
\n
\n ) : null}\n {saveProfileStatus.hasError ? (\n
\n
\n \n

{t(\"Error.ErrorSaving\")}

\n
\n
\n ) : null}\n {!saveProfileStatus.hasError && !saveProfileStatus.isLoading && saveSuccessful ? (\n
\n
\n \n

{t(\"Gui.Common.UserProfileIntroDialog.DetailsSavedSuccessfully\")}

\n
\n
\n ) : null}\n \n
\n \n ) => {\n setFullName(e.target.value);\n validateFullName(e.target.value);\n }}\n />\n
\n
\n \n ) => {\n setDisplayName(e.target.value);\n }}\n />\n
\n
\n \n \n
\n
\n \n ) => {\n setPhoneNumber(e.target.value);\n validatePhoneNumber(e.target.value);\n }}\n />\n
\n
\n \n ) => {\n setSmsNumber(e.target.value);\n validateSmsNumber(e.target.value);\n }}\n />\n
\n
\n \n {t(\"Gui.Buttons.SaveChanges\")}\n \n
\n \n \n );\n};\n","import { Moment } from \"moment-timezone\";\n\nconst defaultDateTimeFormat = \"L LT\";\n\nexport const formatDateTime = (dateTime: Moment, timeZone: string) =>\n dateTime?.tz(timeZone)?.format(defaultDateTimeFormat);\n","import { schema } from \"normalizr\";\n\nconst partnerSchemaDef = new schema.Entity(\"partners\", {});\n\nexport const alarmSchema = new schema.Entity(\"alarms\", {}, { idAttribute: \"friendlyId\" });\nexport const companySchema = new schema.Entity(\"companies\", { partner: partnerSchemaDef });\nexport const configurationGroupSchema = new schema.Entity(\"configurationGroup\", {});\nexport const partnerSchema = partnerSchemaDef;\nexport const scheduleExceptionsSchema = new schema.Entity(\"scheduleExceptions\", {});\nexport const siteSchema = new schema.Entity(\"sites\", { company: companySchema, partner: partnerSchemaDef });\nexport const siteStatisticsSchema = new schema.Entity(\"siteStatistics\", {});\nexport const videoStreamSchema = new schema.Entity(\"videoStream\", {});\n","import { Observable, of } from \"rxjs\";\nimport { map, catchError } from \"rxjs/operators\";\nimport { ajax } from \"rxjs/ajax\";\n\nimport { getIrStore } from \"./storage\";\n\nexport const fetchImageWithAccessToken = (url: string): Observable<{ url: string; error: boolean }> => {\n const { accessToken } = getIrStore().get(\"token\");\n return ajax({\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n url,\n responseType: \"arraybuffer\",\n }).pipe(\n map((imageGetResponse) => {\n const blob = new Blob([imageGetResponse.response], {\n type: imageGetResponse.xhr.getResponseHeader(\"content-type\") || undefined,\n });\n return { url: URL.createObjectURL(blob), error: false };\n }),\n catchError(() => {\n return of({ url: \"\", error: true });\n }),\n );\n};\n","import { cloneDeep, forOwn, isEqual } from \"lodash\";\n\nexport class PatchDelta {\n public static difference(original: T, changed: T): T {\n const diff: any = {};\n\n const changedCopy = cloneDeep(changed);\n\n forOwn(changedCopy, (value, key) => {\n if (!isEqual((original as any)[key], value)) {\n diff[key] = value;\n }\n });\n\n return diff as T;\n }\n}\n","import React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Button, CircularProgress, IconButton, MenuItem, TextField } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUndoAlt as faUndoAltRegular } from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCheck as faCheckSolid,\n faExclamationTriangle as faExclamationTriangleSolid,\n} from \"@fortawesome/pro-solid-svg-icons\";\n\nimport { GetDataTransferStatus, IrMap, Language, Profile, SaveDataTransferStatus } from \"src/types\";\nimport { jsonEqual } from \"src/utils\";\n\ntype UserProfileIntroDialogLocaleProps = {\n profile: Profile;\n languages: Language[];\n locales: string[];\n timeZones: IrMap;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n getLocalizationStatus: GetDataTransferStatus;\n onChange: (isDirty: boolean) => void;\n showRevertInformation: boolean;\n};\n\nexport const UserProfileIntroDialogLocale = (props: UserProfileIntroDialogLocaleProps) => {\n const [originalProfile, setOriginalProfile] = useState(props.profile);\n const [isDirty, setIsDirty] = useState(false);\n const [saveSuccessful, setSaveSuccessful] = useState(false);\n const [timeZoneName, setTimeZoneName] = useState(props.profile.timeZone.name);\n const [timeZoneNameValid, setTimeZoneNameValid] = useState(true);\n const [languageKey, setLanguageKey] = useState(props.profile.language.key);\n const [languageKeyValid, setLanguageKeyValid] = useState(true);\n const [locale, setLocale] = useState(props.profile.locale);\n const [localeValid, setLocaleValid] = useState(true);\n\n const { getLocalizationStatus, saveProfileStatus, showRevertInformation } = props;\n\n const { t } = useTranslation();\n\n const handleIsDirty = () => {\n let result = false;\n\n if (\n originalProfile.timeZone.name !== timeZoneName ||\n originalProfile.language.key !== languageKey ||\n originalProfile.locale !== locale\n ) {\n result = true;\n }\n\n setIsDirty(result);\n return result;\n };\n\n const handleRevertChanges = () => {\n setTimeZoneName(originalProfile.timeZone.name);\n setLanguageKey(originalProfile.language.key);\n setLocale(originalProfile.locale);\n };\n\n const validateTimeZone = (value: string | undefined) => {\n let valid = true;\n if (!value) {\n valid = false;\n }\n setTimeZoneNameValid(valid);\n return valid;\n };\n\n const handleChangeTimeZone = (e: React.ChangeEvent) => {\n const selectedTimeZone = props.timeZones.find((tz) => jsonEqual(tz.key, e.target.value));\n if (selectedTimeZone) {\n setTimeZoneName(selectedTimeZone.key);\n }\n };\n\n const validateLanguage = (value: string | undefined) => {\n let valid = true;\n if (!value) {\n valid = false;\n }\n setLanguageKeyValid(valid);\n return valid;\n };\n\n const handleChangeLanguage = (e: React.ChangeEvent) => {\n setLanguageKey(e.target.value);\n };\n\n const validateLocale = (value: string | undefined) => {\n let valid = true;\n if (!value) {\n valid = false;\n }\n setLocaleValid(valid);\n return valid;\n };\n\n const handleChangeLocale = (e: React.ChangeEvent) => {\n setLocale(e.target.value);\n };\n\n const validateLocaleForm = () => {\n let valid = true;\n if (!validateTimeZone(timeZoneName) || !validateLanguage(languageKey) || !validateLocale(locale)) {\n valid = false;\n }\n\n return valid;\n };\n\n const saveLocaleTab = () => {\n if (originalProfile !== undefined && validateLocaleForm()) {\n const language = props.languages?.find((lang) => lang.key === languageKey) as Language;\n\n const updatedProfile = {\n ...originalProfile,\n timeZone: { id: originalProfile.timeZone.id, name: timeZoneName },\n language,\n locale,\n };\n\n props\n .updateUser(updatedProfile)\n .then(() => {\n // setOriginalProfile(props.profile);\n setSaveSuccessful(true);\n })\n .catch(() => {\n setSaveSuccessful(false);\n });\n }\n };\n\n useEffect(() => {\n setOriginalProfile(props.profile);\n }, [props.profile]);\n\n useEffect(() => {\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [originalProfile]);\n\n useEffect(() => {\n const isDirtyResult = handleIsDirty();\n if (isDirtyResult) setSaveSuccessful(false);\n props.onChange(isDirtyResult);\n }, [timeZoneName, languageKey, locale]);\n\n return (\n <>\n
\n

{t(\"Gui.Common.UserProfileIntroDialog.LocaleTabHeader\")}

\n {getLocalizationStatus.isLoading ? (\n \n ) : null}\n
\n {showRevertInformation ? (\n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesSwitchTabsWarning\")}\n

\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesRevert\")}\n \n \n \n

\n
\n
\n
\n ) : null}\n {saveProfileStatus.hasError ? (\n
\n
\n \n

{t(\"Error.ErrorSaving\")}

\n
\n
\n ) : null}\n {!saveProfileStatus.hasError && !saveProfileStatus.isLoading && saveSuccessful ? (\n
\n
\n \n

\n {t(\"Gui.Common.UserProfileIntroDialog.LocalizationSavedSuccessfully\")}\n

\n
\n
\n ) : null}\n \n
\n \n ) => {\n handleChangeTimeZone(e);\n validateTimeZone(e.target.value);\n }}\n >\n {!props.timeZones ? (\n \n ) : (\n props.timeZones\n .sort((a, b) => {\n if (a.value < b.value) {\n return -1;\n }\n if (a.value > b.value) {\n return 1;\n }\n return 0;\n })\n .map((tz) => (\n \n {t(`Entities.TimeZone.${tz.key}`)}\n \n ))\n )}\n \n
\n
\n \n ) => {\n handleChangeLanguage(e);\n validateLanguage(e.target.value);\n }}\n >\n {!props.languages ? (\n \n ) : (\n props.languages\n .sort((a, b) => {\n if (a.key < b.key) {\n return -1;\n }\n if (a.key > b.key) {\n return 1;\n }\n return 0;\n })\n .map((lang) => (\n \n {t(`Entities.Language.${lang.key}`)}\n \n ))\n )}\n \n
\n
\n \n ) => {\n handleChangeLocale(e);\n validateLocale(e.target.value);\n }}\n >\n {!props.locales ? (\n \n ) : (\n props.locales\n .sort((a, b) => {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n })\n .map((loc) => (\n \n {t(`Entities.Locale.${loc}`)}\n \n ))\n )}\n \n
\n
\n \n {t(\"Gui.Buttons.SaveChanges\")}\n \n
\n \n \n );\n};\n","export const jsonEqual = (a: any, b: any) => JSON.stringify(a) === JSON.stringify(b);\n","import React, { useState } from \"react\";\nimport cx from \"classnames\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faChevronRight } from \"@fortawesome/pro-regular-svg-icons\";\n\nimport \"./_tabs-nav.scss\";\n\ntype TabsProps = {\n initialValue: T;\n titles: { [K in T]: string };\n disableSwitching: boolean;\n handleChangeTab: () => void;\n children(tab: T): JSX.Element;\n};\n\nexport const Tabs = ({\n initialValue,\n titles,\n disableSwitching,\n handleChangeTab,\n children,\n}: TabsProps) => {\n const [activeTab, setActiveTab] = useState(initialValue);\n\n return (\n <>\n
\n {Object.keys(titles)\n .map((key) => key as T)\n .map((tab) => (\n \n {\n if (!disableSwitching) setActiveTab(tab);\n handleChangeTab();\n }}\n >\n {titles[tab]}\n \n \n
\n ))}\n
\n
\n {children(activeTab)}\n
\n \n );\n};\n","import React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Button, IconButton } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\n\nimport { faExclamationTriangle } from \"@fortawesome/pro-solid-svg-icons\";\n\nimport type { GetDataTransferStatus, IrMap, Language, Profile, SaveDataTransferStatus } from \"src/types\";\nimport { faArrowLeft } from \"@fortawesome/pro-light-svg-icons\";\nimport { UserProfileIntroDialogDetails } from \"./UserProfileIntroDialogDetails\";\nimport { UserProfileIntroDialogLocale } from \"./UserProfileIntroDialogLocale\";\nimport type { AvailableIntroTabs } from \"../../Types\";\nimport { Tabs } from \"../Tabs\";\n\nimport \"../_user-profile-dialog.scss\";\n\ntype UserProfileIntroDialogProps = {\n profile: Profile;\n languages: Language[];\n locales: string[];\n timeZones: IrMap;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n getLocalizationStatus: GetDataTransferStatus;\n initialTab: AvailableIntroTabs;\n onChange: (isDirty: boolean) => void;\n onClose: (event?: any, reason?: \"backdropClick\" | \"escapeKeyDown\" | \"userCancelled\") => void;\n};\n\nexport const UserProfileIntroDialog = (props: UserProfileIntroDialogProps) => {\n const { initialTab, saveProfileStatus, getLocalizationStatus } = props;\n const [isDirty, setIsDirty] = useState(false);\n const [showRevertInformation, setShowRevertInformation] = useState(false);\n\n const { t } = useTranslation();\n\n const TabTitles: { [K in AvailableIntroTabs]: string } = {\n DetailsTab: t(`Gui.Common.UserProfileIntroDialog.DetailsTabName`),\n LocaleTab: t(`Gui.Common.UserProfileIntroDialog.LocaleTabName`),\n };\n\n const handleChangeTab = () => {\n if (isDirty) {\n setShowRevertInformation(true);\n }\n };\n\n const handleOnChange = (isFormDirty: boolean) => {\n if (showRevertInformation) {\n setShowRevertInformation(isFormDirty);\n }\n\n setIsDirty(isFormDirty);\n props.onChange(isFormDirty);\n };\n\n return (\n <>\n {getLocalizationStatus.hasError ? (\n
\n
\n \n

{t(\"Error.ErrorLoading\")}

\n
\n
\n ) : (\n
\n
\n props.onClose(e, \"userCancelled\")}>\n \n \n
\n
\n
\n

{t(\"Gui.Common.UserProfileIntroDialog.MainHeader\")}

\n
\n \n initialValue={initialTab}\n titles={TabTitles}\n disableSwitching={isDirty}\n handleChangeTab={handleChangeTab}\n >\n {(currentTab) => (\n <>\n {currentTab === \"DetailsTab\" ? (\n \n ) : null}\n {currentTab === \"LocaleTab\" ? (\n \n ) : null}\n \n )}\n \n
\n
\n props.onClose(e, \"userCancelled\")}\n >\n {t(\"Gui.Buttons.Close\")}\n \n
\n
\n )}\n \n );\n};\n","import React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Dialog, IconButton } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faGlobe, faLanguage } from \"@fortawesome/pro-regular-svg-icons\";\nimport { faPen, faUser } from \"@fortawesome/pro-solid-svg-icons\";\nimport { GetDataTransferStatus, IrMap, Language, Profile, SaveDataTransferStatus } from \"src/types\";\nimport { useDialogModes } from \"src/hooks/useDialogModes\";\nimport { UserProfileIntroDialog } from \"./Dialogs/UserProfileIntroDialog/UserProfileIntroDialog\";\nimport type { AvailableIntroTabs } from \"./Types\";\n\ntype UserProfileIntroProps = {\n profile: Profile;\n languages: Language[];\n locales: string[];\n timeZones: IrMap;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n getLocalizationStatus: GetDataTransferStatus;\n};\n\nexport const UserProfileIntro = (props: UserProfileIntroProps) => {\n const [introDialogIsOpen, setIntroDialogIsOpen] = useState(false);\n const [introDialogInitialTab, setIntroDialogInitialTab] = useState(\"DetailsTab\");\n const [introDialogFormDirty, setIntroDialogFormDirty] = useState(false);\n\n const { t } = useTranslation();\n\n const { fullscreen } = useDialogModes();\n\n const handleEditIntroButtonClick = (initialTab: AvailableIntroTabs) => {\n setIntroDialogInitialTab(initialTab);\n setIntroDialogIsOpen(true);\n };\n\n const handleIntroDialogFormDirty = (isDirty: boolean) => {\n setIntroDialogFormDirty(isDirty);\n };\n\n const handleIntroDialogClose = (event?: any, reason?: \"backdropClick\" | \"escapeKeyDown\" | \"userCancelled\") => {\n if (introDialogFormDirty && reason !== \"userCancelled\") {\n return;\n }\n\n setIntroDialogIsOpen(false);\n };\n\n return (\n
\n
\n
\n
\n \n
\n

\n {props.profile?.fullName\n ? props.profile.fullName\n : t(\"Gui.Common.UserProfileIntro.MissingFullName\")}\n

\n

\n {props.profile?.displayName\n ? props.profile.displayName\n : t(\"Gui.Common.UserProfileIntro.MissingDisplayName\")}\n

\n
\n handleEditIntroButtonClick(\"DetailsTab\")}\n >\n \n \n
\n
\n
\n
\n

{t(\"Gui.Common.UserProfileIntro.EmailHeader\")}

\n
\n
\n

{props.profile?.email}

\n
\n
\n
\n
\n
\n
\n

{t(\"Gui.Common.UserProfileIntro.PhoneHeader\")}

\n
\n
\n

\n {props.profile?.phoneNumber\n ? props.profile.phoneNumber\n : t(\"Gui.Common.UserProfileIntro.MissingPhoneNumber\")}\n

\n
\n
\n
\n
\n
\n
\n

{t(\"Gui.Common.UserProfileIntro.SmsHeader\")}

\n
\n
\n

\n {props.profile?.smsNumber\n ? props.profile.smsNumber\n : t(\"Gui.Common.UserProfileIntro.MissingSmsNumber\")}\n

\n
\n
\n
\n
\n
\n
\n
\n \n

\n {t(`Entities.TimeZone.${props.profile ? props.profile.timeZone?.name : \"\"}`)}\n

\n
\n
\n \n
\n

\n {t(`Entities.Language.${props.profile ? props.profile.language?.key : \"\"}`)}\n

\n

\n {t(`Entities.Locale.${props.profile ? props.profile?.locale : \"\"}`)}\n

\n
\n
\n handleEditIntroButtonClick(\"LocaleTab\")}\n >\n \n \n
\n
\n \n \n \n
\n
\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Button, FormControl, FormHelperText, IconButton, InputAdornment, OutlinedInput } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUndoAlt as faUndoAltRegular } from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCheck as faCheckSolid,\n faExclamationTriangle as faExclamationTriangleSolid,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { faEye as faEyeLight, faEyeSlash as faEyeSlashLight } from \"@fortawesome/pro-light-svg-icons\";\nimport { Profile, SaveDataTransferStatus } from \"src/types\";\nimport { isValidPassword } from \"../ValidationFunctions\";\n\ntype UserProfileSecurityDialogPasswordProps = {\n profile: Profile;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n onChange: (isDirty: boolean) => void;\n showRevertInformation: boolean;\n};\n\nexport const UserProfileSecurityDialogPassword = (props: UserProfileSecurityDialogPasswordProps) => {\n const [originalProfile, setOriginalProfile] = useState(\n props.profile ? { ...props.profile } : undefined,\n );\n const [isDirty, setIsDirty] = useState(false);\n const [saveSuccessful, setSaveSuccessful] = useState(false);\n const [showTwoFactorCodeField] = useState(!!props.profile?.twoFactorAuthentication);\n const [showNewPassword, setShowNewPassword] = useState(false);\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\n const [showNewPasswordValidation, setShowNewPasswordValidation] = useState(false);\n const [newPassword, setNewPassword] = useState(\"\");\n const [newPasswordValid, setNewPasswordValid] = useState(true);\n const [newPasswordMatchesCurrentPassword, setNewPasswordMatchesCurrentPassword] = useState(false);\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [confirmPasswordValid, setConfirmPasswordValid] = useState(true);\n const [currentPassword, setCurrentPassword] = useState(\"\");\n const [twoFactorAuthCode, setTwoFactorAuthCode] = useState(\"\");\n\n const { saveProfileStatus, showRevertInformation } = props;\n\n const { t } = useTranslation();\n\n const handleIsDirty = () => {\n const result = newPassword !== \"\";\n setIsDirty(result);\n return result;\n };\n\n const handleRevertChanges = () => {\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n setCurrentPassword(\"\");\n };\n\n const validateNewPassword = () => {\n const valid = isValidPassword(newPassword);\n setNewPasswordValid(valid);\n return valid;\n };\n\n const validateNewPasswordAtLeastSevenCharacters = (value: string) => {\n let valid = false;\n if (value.length > 6) {\n valid = true;\n }\n\n return valid;\n };\n\n const validateNewPasswordAtLeastOneNumber = (value: string) => {\n let valid = false;\n if (value.match(/\\d/)) {\n valid = true;\n }\n\n return valid;\n };\n\n const validateNewPasswordAtLeastOneSpecialCharacter = (value: string) => {\n let valid = false;\n if (value.match(/[!@#$%^&*(),.?\":{}|<>]/)) {\n valid = true;\n }\n\n return valid;\n };\n\n const validateConfirmPassword = () => {\n let valid = true;\n if (confirmPassword && confirmPassword !== newPassword) {\n valid = false;\n }\n\n setConfirmPasswordValid(valid);\n return valid;\n };\n\n const checkIfNewPasswordMatchesCurrentPassword = () => {\n let valid = false;\n if (currentPassword && newPassword && currentPassword === newPassword) {\n valid = true;\n }\n\n setNewPasswordMatchesCurrentPassword(valid);\n return valid;\n };\n\n const validateForm = () => {\n let valid = true;\n if (!validateNewPassword()) {\n valid = false;\n }\n\n if (checkIfNewPasswordMatchesCurrentPassword()) {\n valid = false;\n }\n\n return valid;\n };\n\n const passwordValidationIcon = (valid: boolean) => {\n if (valid) {\n return ;\n }\n\n return (\n \n );\n };\n\n const handleShowNewPassword = () => {\n setShowNewPassword(!showNewPassword);\n };\n\n const handleShowCurrentPassword = () => {\n setShowCurrentPassword(!showCurrentPassword);\n };\n\n const handleMouseDownPasswordInput = (event: React.MouseEvent) => {\n event.preventDefault();\n };\n\n const saveProfile = () => {\n if (originalProfile !== undefined && validateForm()) {\n const newProfile = {\n ...originalProfile,\n currentPassword,\n newPassword,\n twoFactorAuthCode,\n };\n\n props\n .updateUser(newProfile)\n .then(() => {\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n setCurrentPassword(\"\");\n setShowNewPasswordValidation(false);\n setSaveSuccessful(true);\n })\n .catch(() => {\n setSaveSuccessful(false);\n });\n }\n };\n\n useEffect(() => {\n setOriginalProfile(props.profile ? { ...props.profile } : undefined);\n }, [props.profile]);\n\n useEffect(() => {\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [originalProfile]);\n\n useEffect(() => {\n validateNewPassword();\n if (newPassword) setSaveSuccessful(false);\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [newPassword]);\n\n useEffect(() => {\n validateConfirmPassword();\n }, [newPassword, confirmPassword]);\n\n useEffect(() => {\n checkIfNewPasswordMatchesCurrentPassword();\n }, [newPassword, currentPassword]);\n\n return (\n <>\n

{t(\"Gui.Common.UserProfileSecurityDialog.ChangePasswordTabHeader\")}

\n {showRevertInformation ? (\n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesSwitchTabsWarning\")}\n

\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesRevert\")}\n \n \n \n

\n
\n
\n
\n ) : null}\n {saveProfileStatus.hasError ? (\n
\n
\n \n

\n {saveProfileStatus.errorMessage &&\n saveProfileStatus.errorMessage.includes(\"IncorrectCurrentPassword\")\n ? t(\"Validation.Password.IncorrectCurrentPassword\")\n : t(\"Error.ErrorSaving\")}\n

\n
\n
\n ) : null}\n {!saveProfileStatus.hasError && !saveProfileStatus.isLoading && saveSuccessful ? (\n
\n
\n \n

{t(\"Gui.Common.UserProfileSecurityDialog.PasswordSavedSuccessfully\")}

\n
\n
\n ) : null}\n
\n
\n
\n
\n \n \n {\n setShowNewPasswordValidation(true);\n }}\n onChange={(e: React.ChangeEvent) => {\n setNewPassword(e.target.value);\n }}\n endAdornment={\n \n \n {showNewPassword ? (\n \n ) : (\n \n )}\n \n \n }\n />\n {newPasswordMatchesCurrentPassword ? (\n \n {t(\"Validation.UserProfileSecurityDialog.NewAndCurrentPasswordsMatches\")}\n \n ) : null}\n {!newPasswordValid && showNewPasswordValidation ? (\n \n {t(\"Validation.UserProfileSecurityDialog.NewPassword\")}\n \n ) : null}\n \n
\n
\n \n \n ) => {\n setConfirmPassword(e.target.value);\n }}\n endAdornment={\n \n \n {showNewPassword ? (\n \n ) : (\n \n )}\n \n \n }\n />\n {!confirmPasswordValid ? (\n \n {t(\"Validation.UserProfileSecurityDialog.ConfirmPassword\")}\n \n ) : null}\n \n
\n
\n
\n
\n
\n
\n

\n {t(\"Validation.UserProfileSecurityDialog.RecommendationsHeader\")}\n

\n
\n
\n

\n {passwordValidationIcon(validateNewPasswordAtLeastSevenCharacters(newPassword))}\n {t(\"Validation.UserProfileSecurityDialog.PasswordHintCharacters\")}\n

\n
\n
\n

\n {passwordValidationIcon(validateNewPasswordAtLeastOneNumber(newPassword))}\n {t(\"Validation.UserProfileSecurityDialog.PasswordHintNumbers\")}\n

\n
\n
\n

\n {passwordValidationIcon(\n validateNewPasswordAtLeastOneSpecialCharacter(newPassword),\n )}\n {t(\"Validation.UserProfileSecurityDialog.PasswordHintSpecialCharacters\")}\n

\n
\n
\n
\n
\n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileSecurityDialog.ConfirmChangesHeader\")}\n

\n

{t(\"Gui.Common.UserProfileSecurityDialog.CurrentPasswordNotice\")}

\n
\n\n
\n \n \n ) => {\n setCurrentPassword(e.target.value);\n }}\n endAdornment={\n \n \n {showCurrentPassword ? (\n \n ) : (\n \n )}\n \n \n }\n />\n \n
\n {showTwoFactorCodeField ? (\n
\n \n \n ) => {\n setTwoFactorAuthCode(e.target.value);\n }}\n />\n \n
\n ) : null}\n
\n \n {t(\"Gui.Buttons.ChangePassword\")}\n \n
\n
\n
\n \n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Button, FormControl, FormHelperText, IconButton, InputAdornment, OutlinedInput } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUndoAlt as faUndoAltRegular } from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCheck as faCheckSolid,\n faExclamationTriangle as faExclamationTriangleSolid,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { faEye as faEyeLight, faEyeSlash as faEyeSlashLight } from \"@fortawesome/pro-light-svg-icons\";\n\nimport { Profile, SaveDataTransferStatus } from \"src/types\";\nimport { isAlphanumerical, isValidAccessCodeLength } from \"../ValidationFunctions\";\n\ntype UserProfileSecurityDialogAccessCodeProps = {\n profile: Profile;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n onChange: (isDirty: boolean) => void;\n showRevertInformation: boolean;\n};\n\nexport const UserProfileSecurityDialogAccessCode = (props: UserProfileSecurityDialogAccessCodeProps) => {\n const [originalProfile, setOriginalProfile] = useState(\n props.profile ? { ...props.profile } : undefined,\n );\n const [isDirty, setIsDirty] = useState(false);\n const [saveSuccessful, setSaveSuccessful] = useState(false);\n const [showAccessCodeValidation, setShowAccessCodeValidation] = useState(false);\n const [showTwoFactorCodeField] = useState(!!props.profile?.twoFactorAuthentication);\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\n const [accessCode, setAccessCode] = useState(\"\");\n const [accessCodeLengthValid, setAccessCodeLengthValid] = useState(true);\n const [accessCodeContentValid, setAccessCodeContentValid] = useState(true);\n const [currentPassword, setCurrentPassword] = useState(\"\");\n const [twoFactorAuthCode, setTwoFactorAuthCode] = useState(\"\");\n\n const { saveProfileStatus, showRevertInformation } = props;\n\n const { t } = useTranslation();\n\n const handleIsDirty = () => {\n const result = accessCode !== \"\";\n setIsDirty(result);\n return result;\n };\n\n const handleRevertChanges = () => {\n setAccessCode(\"\");\n setShowAccessCodeValidation(false);\n };\n\n const validateAccessCodeLength = () => {\n const valid = isValidAccessCodeLength(accessCode);\n setAccessCodeLengthValid(valid);\n return valid;\n };\n\n const validateAccessCodeContent = () => {\n const valid = isAlphanumerical(accessCode);\n setAccessCodeContentValid(valid);\n return valid;\n };\n\n const validateForm = () => {\n let valid = true;\n if (!validateAccessCodeLength() || !validateAccessCodeContent()) {\n valid = false;\n }\n\n return valid;\n };\n\n const handleShowCurrentPassword = () => {\n setShowCurrentPassword(!showCurrentPassword);\n };\n\n const handleMouseDownPasswordInput = (event: React.MouseEvent) => {\n event.preventDefault();\n };\n\n const saveProfile = () => {\n if (originalProfile !== undefined && validateForm()) {\n const updatedProfile = {\n ...originalProfile,\n accessCode,\n currentPassword,\n twoFactorAuthCode,\n };\n\n props\n .updateUser(updatedProfile)\n .then(() => {\n setAccessCode(\"\");\n setCurrentPassword(\"\");\n setShowAccessCodeValidation(false);\n setSaveSuccessful(true);\n })\n .catch(() => {\n setSaveSuccessful(false);\n });\n }\n };\n\n useEffect(() => {\n setOriginalProfile(props.profile ? { ...props.profile } : undefined);\n }, [props.profile]);\n\n useEffect(() => {\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [originalProfile]);\n\n useEffect(() => {\n validateAccessCodeLength();\n validateAccessCodeContent();\n if (accessCode) setSaveSuccessful(false);\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [accessCode]);\n\n return (\n <>\n

{t(\"Gui.Common.UserProfileSecurityDialog.ChangeAccessCodeTabHeader\")}

\n {showRevertInformation ? (\n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesSwitchTabsWarning\")}\n

\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesRevert\")}\n \n \n \n

\n
\n
\n
\n ) : null}\n {saveProfileStatus.hasError ? (\n
\n
\n \n

\n {saveProfileStatus.errorMessage &&\n saveProfileStatus.errorMessage.includes(\"IncorrectCurrentPassword\")\n ? t(\"Validation.Password.IncorrectCurrentPassword\")\n : t(\"Error.ErrorSaving\")}\n

\n
\n
\n ) : null}\n {!saveProfileStatus.hasError && !saveProfileStatus.isLoading && saveSuccessful ? (\n
\n
\n \n

\n {t(\"Gui.Common.UserProfileSecurityDialog.AccessCodeSavedSuccessfully\")}\n

\n
\n
\n ) : null}\n
\n
\n \n \n {\n setShowAccessCodeValidation(true);\n }}\n onChange={(e: React.ChangeEvent) => {\n setAccessCode(e.target.value);\n }}\n />\n {!accessCodeLengthValid && showAccessCodeValidation ? (\n \n {t(\"Validation.UserProfileSecurityDialog.AccessCodeLength\")}\n \n ) : null}\n {!accessCodeContentValid && showAccessCodeValidation ? (\n \n {t(\"Validation.UserProfileSecurityDialog.AccessCodeContent\")}\n \n ) : null}\n \n {t(\"Validation.UserProfileSecurityDialog.AccessCodeExample\")}\n \n \n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileSecurityDialog.ConfirmChangesHeader\")}\n

\n

{t(\"Gui.Common.UserProfileSecurityDialog.CurrentPasswordNotice\")}

\n
\n\n
\n \n \n ) => {\n setCurrentPassword(e.target.value);\n }}\n endAdornment={\n \n \n {showCurrentPassword ? (\n \n ) : (\n \n )}\n \n \n }\n />\n \n
\n {showTwoFactorCodeField ? (\n
\n \n \n ) => {\n setTwoFactorAuthCode(e.target.value);\n }}\n />\n \n
\n ) : null}\n
\n \n {t(\"Gui.Buttons.SaveAccessCode\")}\n \n
\n
\n
\n \n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Button,\n Checkbox,\n FormControl,\n FormControlLabel,\n IconButton,\n InputAdornment,\n OutlinedInput,\n} from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUndoAlt as faUndoAltRegular } from \"@fortawesome/pro-regular-svg-icons\";\nimport {\n faCheck as faCheckSolid,\n faExclamationTriangle as faExclamationTriangleSolid,\n faInfoCircle as faInfoCircleSolid,\n} from \"@fortawesome/pro-solid-svg-icons\";\nimport { faEye as faEyeLight, faEyeSlash as faEyeSlashLight } from \"@fortawesome/pro-light-svg-icons\";\nimport { Profile, SaveDataTransferStatus, TwoFactorAuthMode } from \"src/types\";\n\ntype UserProfileSecurityDialogTwoFactorProps = {\n profile: Profile;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n onChange: (isDirty: boolean) => void;\n showRevertInformation: boolean;\n};\n\nexport const UserProfileSecurityDialogTwoFactor = (props: UserProfileSecurityDialogTwoFactorProps) => {\n const [originalProfile, setOriginalProfile] = useState(\n props.profile ? { ...props.profile } : undefined,\n );\n const [isDirty, setIsDirty] = useState(false);\n const [saveSuccessful, setSaveSuccessful] = useState(false);\n const [showEnableTwoFactorHint, setShowEnableTwoFactorHint] = useState(false);\n const [showTwoFactorCodeField, setShowTwoFactorCodeField] = useState(!!props.profile?.twoFactorAuthentication);\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\n const [enableTwoFactorAuth, setEnableTwoFactorAuth] = useState(!!props.profile?.twoFactorAuthentication);\n const [currentPassword, setCurrentPassword] = useState(\"\");\n const [twoFactorAuthCode, setTwoFactorAuthCode] = useState(\"\");\n\n const { saveProfileStatus, showRevertInformation } = props;\n\n const { t } = useTranslation();\n\n const handleIsDirty = () => {\n const result = enableTwoFactorAuth !== !!props.profile?.twoFactorAuthentication;\n setIsDirty(result);\n return result;\n };\n\n const handleRevertChanges = () => {\n setEnableTwoFactorAuth(!!props.profile?.twoFactorAuthentication);\n };\n\n const handleShowCurrentPassword = () => {\n setShowCurrentPassword(!showCurrentPassword);\n };\n\n const handleMouseDownPasswordInput = (event: React.MouseEvent) => {\n event.preventDefault();\n };\n\n const saveProfile = () => {\n if (originalProfile !== undefined) {\n const newProfile = {\n ...originalProfile,\n enableTwoFactorAuth,\n currentPassword,\n twoFactorAuthCode,\n twoFactorAuthentication: enableTwoFactorAuth ? TwoFactorAuthMode.GoogleAuthenticator : null,\n };\n\n props\n .updateUser(newProfile)\n .then(() => {\n setCurrentPassword(\"\");\n setShowTwoFactorCodeField(enableTwoFactorAuth);\n setSaveSuccessful(true);\n })\n .catch(() => {\n setSaveSuccessful(false);\n });\n }\n };\n\n useEffect(() => {\n setOriginalProfile(props.profile ? { ...props.profile } : undefined);\n }, [props.profile]);\n\n useEffect(() => {\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [originalProfile]);\n\n useEffect(() => {\n if (enableTwoFactorAuth !== !!props.profile?.twoFactorAuthentication) {\n setSaveSuccessful(false);\n }\n\n if (!props.profile?.twoFactorAuthentication) {\n if (enableTwoFactorAuth) {\n setShowEnableTwoFactorHint(true);\n } else {\n setShowEnableTwoFactorHint(false);\n }\n } else {\n // never show hint if two-factor already enabled on account\n setShowEnableTwoFactorHint(false);\n }\n\n const isDirtyResult = handleIsDirty();\n props.onChange(isDirtyResult);\n }, [enableTwoFactorAuth]);\n\n return (\n <>\n

{t(\"Gui.Common.UserProfileSecurityDialog.ChangeTwoFactorTabHeader\")}

\n {showRevertInformation ? (\n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesSwitchTabsWarning\")}\n

\n
\n
\n

\n {t(\"Gui.Common.UserProfileDialog.UnsavedChangesRevert\")}\n \n \n \n

\n
\n
\n
\n ) : null}\n {saveProfileStatus.hasError ? (\n
\n
\n \n

\n {saveProfileStatus.errorMessage &&\n saveProfileStatus.errorMessage.includes(\"IncorrectCurrentPassword\")\n ? t(\"Validation.Password.IncorrectCurrentPassword\")\n : t(\"Error.ErrorSaving\")}\n

\n
\n
\n ) : null}\n {!saveProfileStatus.hasError && !saveProfileStatus.isLoading && saveSuccessful ? (\n
\n
\n \n

\n {t(\"Gui.Common.UserProfileSecurityDialog.TwoFactorSavedSuccessfully\")}\n

\n
\n
\n ) : null}\n
\n
\n \n {\n setEnableTwoFactorAuth(e.target.checked);\n }}\n />\n }\n label={t(\"Gui.Common.UserProfileSecurityDialog.TwoFactorLabel\")}\n labelPlacement=\"end\"\n />\n {showEnableTwoFactorHint ? (\n
\n \n
\n {t(\"Gui.Common.UserProfileSecurityDialog.EnableTwoFactorHelpText\")}\n
\n
\n ) : null}\n
\n
\n
\n
\n

\n {t(\"Gui.Common.UserProfileSecurityDialog.ConfirmChangesHeader\")}\n

\n

{t(\"Gui.Common.UserProfileSecurityDialog.CurrentPasswordNotice\")}

\n
\n\n
\n \n \n ) => {\n setCurrentPassword(e.target.value);\n }}\n endAdornment={\n \n \n {showCurrentPassword ? (\n \n ) : (\n \n )}\n \n \n }\n />\n \n
\n {showTwoFactorCodeField ? (\n
\n \n \n ) => {\n setTwoFactorAuthCode(e.target.value);\n }}\n />\n \n
\n ) : null}\n
\n \n {t(\"Gui.Buttons.SaveTwoFactor\")}\n \n
\n
\n
\n \n );\n};\n","import React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Button, IconButton } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faArrowLeft } from \"@fortawesome/pro-light-svg-icons\";\n\nimport { Profile, SaveDataTransferStatus } from \"src/types\";\nimport { UserProfileSecurityDialogPassword } from \"./UserProfileSecurityDialogPassword\";\nimport { UserProfileSecurityDialogAccessCode } from \"./UserProfileSecurityDialogAccessCode\";\nimport { UserProfileSecurityDialogTwoFactor } from \"./UserProfileSecurityDialogTwoFactor\";\nimport { Tabs } from \"../Tabs\";\nimport type { AvailableSecurityTabs } from \"../../Types\";\n\nimport \"../_user-profile-dialog.scss\";\n\ntype UserProfileSecurityDialogProps = {\n profile: Profile;\n updateUser: (profile: Profile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n initialTab: AvailableSecurityTabs;\n onChange: (isDirty: boolean) => void;\n onClose: (event?: any, reason?: \"backdropClick\" | \"escapeKeyDown\" | \"userCancelled\") => void;\n};\n\nexport const UserProfileSecurityDialog = (props: UserProfileSecurityDialogProps) => {\n const { initialTab, saveProfileStatus } = props;\n const [isDirty, setIsDirty] = useState(false);\n const [showRevertInformation, setShowRevertInformation] = useState(false);\n\n const { t } = useTranslation();\n\n const TabTitles: { [K in AvailableSecurityTabs]: string } = {\n ChangePassword: t(`Gui.Common.UserProfileSecurityDialog.ChangePasswordTabName`),\n ChangeAccessCode: t(`Gui.Common.UserProfileSecurityDialog.ChangeAccessCodeTabName`),\n ChangeTwoFactor: t(`Gui.Common.UserProfileSecurityDialog.ChangeTwoFactorTabName`),\n };\n\n const handleChangeTab = () => {\n if (isDirty) {\n setShowRevertInformation(true);\n }\n };\n\n const handleOnChange = (isFormDirty: boolean) => {\n if (showRevertInformation) {\n setShowRevertInformation(isFormDirty);\n }\n\n setIsDirty(isFormDirty);\n props.onChange(isFormDirty);\n };\n\n return (\n <>\n
\n
\n props.onClose(e, \"userCancelled\")}>\n \n \n
\n
\n
\n

{t(\"Gui.Common.UserProfileSecurityDialog.MainHeader\")}

\n
\n \n initialValue={initialTab}\n titles={TabTitles}\n disableSwitching={isDirty}\n handleChangeTab={handleChangeTab}\n >\n {(currentTab) => (\n <>\n {currentTab === \"ChangePassword\" ? (\n \n ) : null}\n {currentTab === \"ChangeAccessCode\" ? (\n \n ) : null}\n {currentTab === \"ChangeTwoFactor\" ? (\n \n ) : null}\n \n )}\n \n
\n
\n props.onClose(e, \"userCancelled\")}\n >\n {t(\"Gui.Buttons.Close\")}\n \n
\n
\n \n );\n};\n","import React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Dialog, IconButton } from \"@material-ui/core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck, faExclamationTriangle, faKey, faPen } from \"@fortawesome/pro-solid-svg-icons\";\nimport type { UserProfile } from \"entities\";\nimport { SaveDataTransferStatus, TwoFactorAuthMode } from \"src/types\";\nimport { useDialogModes } from \"src/hooks/useDialogModes\";\nimport { UserProfileSecurityDialog } from \"./Dialogs/UserProfileSecurityDialog/UserProfileSecurityDialog\";\nimport type { AvailableSecurityTabs } from \"./Types\";\n\ntype UserProfileSecurityProps = {\n profile: UserProfile;\n updateUser: (profile: UserProfile) => Promise;\n saveProfileStatus: SaveDataTransferStatus;\n};\n\nexport const UserProfileSecurity = (props: UserProfileSecurityProps) => {\n const [securityDialogIsOpen, setSecurityDialogIsOpen] = useState(false);\n const [securityDialogInitialTab, setSecurityDialogInitialTab] = useState(\"ChangePassword\");\n const [securityDialogFormDirty, setSecurityDialogFormDirty] = useState(false);\n\n const { t } = useTranslation();\n\n const { fullscreen } = useDialogModes();\n\n const handleEditSecurityButtonClick = (initialTab: AvailableSecurityTabs) => {\n setSecurityDialogInitialTab(initialTab);\n setSecurityDialogIsOpen(true);\n };\n\n const handleSecurityDialogFormDirty = (isDirty: boolean) => {\n setSecurityDialogFormDirty(isDirty);\n };\n\n const handleSecurityDialogClose = (event?: any, reason?: \"backdropClick\" | \"escapeKeyDown\" | \"userCancelled\") => {\n if (securityDialogFormDirty && reason !== \"userCancelled\") {\n return;\n }\n\n setSecurityDialogIsOpen(false);\n };\n\n return (\n
\n
\n
\n
\n \n
\n

\n {t(\"Gui.Common.UserProfileSecurity.SecurityHeader\")}\n

\n
\n handleEditSecurityButtonClick(\"ChangePassword\")}\n >\n \n \n
\n
\n
\n

{t(\"Gui.Common.UserProfileSecurity.UserVerifiedHeader\")}

\n
\n
\n
\n {props.profile?.isUserVerified ? (\n

\n \n {t(\"Gui.Common.UserProfileSecurity.UserIsVerified\")}\n

\n ) : (\n

\n \n {t(\"Gui.Common.UserProfileSecurity.UserIsNotVerified\")}\n

\n )}\n
\n
\n
\n
\n

{t(\"Gui.Common.UserProfileSecurity.AccessCodeCreatedHeader\")}

\n
\n
\n
\n

\n {props.profile?.hasAccessCode\n ? t(\"Gui.Common.UserProfileSecurity.AccessCodeCreated\")\n : t(\"Gui.Common.UserProfileSecurity.AccessCodeNotCreated\")}\n

\n
\n
\n
\n
\n

{t(\"Gui.Common.UserProfileSecurity.TwoFactorHeader\")}

\n
\n
\n
\n {props.profile?.twoFactorAuthentication === TwoFactorAuthMode.GoogleAuthenticator ? (\n

\n \n {t(\"Gui.Common.UserProfileSecurity.TwoFactorIsEnabled\")}\n

\n ) : (\n \n

\n \n {t(\"Gui.Common.UserProfileSecurity.TwoFactorIsNotEnabled\")}\n

\n

\n {t(\"Gui.Common.UserProfileSecurity.TwoFactorRecommendedHint\")}\n

\n
\n )}\n
\n
\n
\n
\n

{t(\"Gui.Common.UserProfileSecurity.AutoLogoutHeader\")}

\n
\n
\n
\n

\n {props.profile?.autoLogoutMinutes > 0\n ? `${props.profile?.autoLogoutMinutes} ${t(\n \"Gui.Common.UserProfileSecurity.Minutes\",\n )}`\n : t(\"Gui.Common.UserProfileSecurity.AutoLogoutNotActivated\")}\n

\n
\n
\n
\n\n \n \n \n
\n
\n );\n};\n","import { Skeleton } from \"@material-ui/lab\";\nimport React, { useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useUserProfile } from \"src/contexts/UserProfileContext\";\nimport { useLocales } from \"src/hooks/useLocale\";\nimport { UserProfileIntro } from \"./UserProfileIntro\";\nimport { UserProfileSecurity } from \"./UserProfileSecurity\";\n\nimport \"./_user-profile-details.scss\";\n\nexport const UserProfileDetails = () => {\n const { saveProfileStatus, userProfile, updateUserProfile } = useUserProfile();\n const { languages, timeZones, locales, getLocalizationStatus } = useLocales();\n\n const { t } = useTranslation();\n\n const renderComponents = useCallback(() => {\n let returnComponent;\n\n if (getLocalizationStatus.isLoading) {\n returnComponent = (\n <>\n \n \n \n );\n } else if (getLocalizationStatus.hasError) {\n returnComponent = t(\"Error.ErrorLoading\");\n } else if (userProfile && languages && locales && timeZones) {\n returnComponent = (\n <>\n
\n \n
\n
\n \n
\n \n );\n } else {\n returnComponent = t(\"Error.ErrorLoading\");\n }\n\n return returnComponent;\n }, [userProfile, languages, locales, timeZones, saveProfileStatus, updateUserProfile, getLocalizationStatus]);\n\n return (\n
\n {renderComponents()}\n
\n );\n};\n","import React from \"react\";\n\nimport { Container } from \"@material-ui/core\";\n\nimport { Switch, Route } from \"react-router-dom\";\nimport { Dashboard, Login, NavBar, SiteDetails, About, AuthenticatedRoute, RedirectRoute } from \"src/components\";\nimport { getUserLastKnownRoute } from \"src/utils/storage\";\nimport { UserProfileDetails } from \"./UserProfileDetails\";\n\nexport const App: React.FC = () => {\n const redirectRoute: string = getUserLastKnownRoute() || \"/dashboard\";\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Site, SiteStatistics } from \"src/entities\";\nimport { apiUrl } from \"src/settings\";\nimport _orderBy from \"lodash/orderBy\";\nimport { useData } from \"./useData\";\n\ntype SortDirection = \"asc\" | \"desc\";\ntype SortProperty = \"name\" | \"eventsLastWeek\" | \"eventsLastDay\";\n\nconst useSites = () => {\n const url = `${apiUrl}/sites`;\n const { data: sitesList, isLoading, hasError } = useData(url);\n return { sitesList, sitesLoading: isLoading, sitesHasError: hasError };\n};\n\nconst useSiteStatistics = () => {\n const url = `${apiUrl}/sites/siteStatistics`;\n const { data: siteStatistics, isLoading, hasError } = useData(url);\n return { siteStatistics, siteStatisticsLoading: isLoading, siteStatisticsHasError: hasError };\n};\n\nfunction getSorterForProperty(property: string) {\n switch (property) {\n case \"name\":\n return (site: Site) => site[property].toLowerCase();\n case \"eventsLastDay\":\n case \"eventsLastWeek\":\n return (site: Site) => site[property] || (site[property] === 0 ? 0 : -1);\n default:\n return (site: Site) => site[property];\n }\n}\n\nexport const useSiteList = () => {\n const [sortProperty, setSortProperty] = useState(\"eventsLastWeek\");\n const [sortDirection, setSortDirection] = useState(\"desc\");\n const [sites, setSites] = useState([]);\n const [siteListIsLoading, setSiteListIsLoading] = useState(true);\n\n const { sitesList, sitesLoading, sitesHasError } = useSites();\n const { siteStatistics, siteStatisticsLoading, siteStatisticsHasError } = useSiteStatistics();\n\n const sortSites = (property: SortProperty) => {\n if (sortProperty === property) {\n setSortDirection(sortDirection === \"asc\" ? \"desc\" : \"asc\");\n } else {\n setSortProperty(property);\n\n if (property === \"name\") {\n setSortDirection(\"asc\");\n } else {\n setSortDirection(\"desc\");\n }\n }\n };\n\n useMemo(() => {\n setSiteListIsLoading(true);\n\n if (sitesList && siteStatistics) {\n const mappedSites = sitesList\n ?.filter((site) => site.siteState !== \"Ended\" && site.siteState !== \"NotStarted\")\n .map((site) => {\n const statistics = siteStatistics?.find((stat) => stat.id === site.id);\n const mappedSite = {\n ...site,\n ...statistics,\n } as Site;\n\n return mappedSite;\n });\n\n setSites(_orderBy(mappedSites, [getSorterForProperty(sortProperty)], [sortDirection]) || []);\n setSiteListIsLoading(false);\n }\n }, [sitesList, siteStatistics]);\n\n useEffect(() => {\n const orderedSites =\n sites && sites.length > 0 ? _orderBy(sites, [getSorterForProperty(sortProperty)], [sortDirection]) : [];\n setSites(orderedSites);\n }, [sortProperty, sortDirection]);\n\n return {\n sites,\n sitesLoading,\n sitesHasError,\n siteStatistics,\n siteStatisticsLoading,\n siteStatisticsHasError,\n sortSites,\n sortProperty,\n sortDirection,\n siteListIsLoading,\n };\n};\n","import { createContext, useContext } from \"react\";\n\nexport type GlobalSearchContextType = {\n globalSearchTerm: string;\n debounceTerm: string;\n setGlobalSearchTerm: (term: string) => void;\n clearGlobalSearchTerm: () => void;\n};\n\nexport const GlobalSearchContext = createContext>({});\n\nexport function useGlobalSearch() {\n return useContext(GlobalSearchContext) as GlobalSearchContextType;\n}\n","export enum AlarmZoneType {\n MotionDetection = \"MotionDetection\",\n LoiteringDetection = \"LoiteringDetection\",\n RailDefender = \"RailDefender\",\n ViolentBehaviorDetection = \"ViolentBehaviorDetection\",\n UnattendedObjectDetection = \"UnattendedObjectDetection\",\n FallDetection = \"FallDetection\",\n}\n","export enum EventAssessmentClass {\n Unknown = 0,\n NoClassificationNeeded = 1,\n NoAssessmentNeeded = 2,\n NoMeasureNeeded = 3,\n MeasureTaken = 4,\n}\n","export enum EventClassification {\n // Must be kept in sync with\n // Mindmancer.Services.Api.Common.RestApi.Shared.Enums.EventClasificationEnum\n\n Human = 1000,\n Car = 2000,\n Truck = 3000,\n\n L2HumanActivityYes = 4000,\n\n Animal = 9000,\n\n Environment = 10000,\n Tree = 10001,\n Bush = 10002,\n MovingWater = 10003,\n ReflectingWater = 10004,\n\n Unknown = 15000,\n\n // Legacy values sent from Mv1 Alarm Central\n // Another classification model would be prefered in the future.\n SunReflection = 20001,\n SwayingObject = 20002,\n Liquid = 20003,\n ShakingCamera = 20004,\n Shadow = 20005,\n MovingCloudShadow = 20006,\n BadlyConfiguredAlarmZone = 20007,\n OtherDetails = 20008,\n\n L2HumanActivityNo = 30000,\n L2HumanActivityUncertain = 40000,\n\n // Loitering analysis (says nothing about other, non-loitering human activity)\n LoiteringHumanActivityNo = 50100,\n LoiteringHumanActivityYes = 50102,\n\n // Reserved for later, but not used yet\n // L2LoiteringHumanActivityNo = 50110,\n // L2LoiteringHumanActivityUncertain = 50111,\n // L2LoiteringHumanActivityYes = 50112,\n\n // Flame detection (says nothing about human activity)\n FlameNo = 50200,\n FlameYes = 50202,\n\n // Reserved for later, but not used yet\n // L2FlameNo = 50210,\n // L2FlameUncertain = 50211,\n // L2FlameYes = 50212\n\n // Violent Behavior analysis\n ViolentBehaviorNo = 50300,\n ViolentBehaviorYes = 50302,\n\n // Not used yet, reserved for later\n // L2ViolentBehaviorNo = 50310,\n // L2ViolentBehaviorUncertain = 50311,\n // L2ViolentBehaviorYes = 50312\n\n // Handling issue alarms, for now only acknowledged is implemented.\n IssueAcknowledged = 50402,\n\n // Rail Defender\n RailDefenderNo = 50500,\n RailDefenderYes = 50502,\n\n // Not used yet, reserved for later\n // L2RailDefenderNo = 50510,\n // L2RailDefenderUncertain = 50511,\n // L2RailDefenderYes = 50512\n\n // Unattended object detection\n UnattendedObjectNo = 50600,\n UnattendedObjectYes = 50602,\n\n // Not used yet, reserved for later\n // L2UnattendedObjectNo = 50610,\n // L2UnattendedObjectUncertain = 50611,\n // L2UnattendedObjectYes = 50612\n\n // Fall detection\n FallNo = 50700,\n FallYes = 50702,\n\n // Not used yet, reserved for later\n // L2FallNo = 50710,\n // L2FallUncertain = 50711,\n // L2FallYes = 50712\n\n // Test alarm\n Test = 100000,\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\n\nimport {\n Avatar,\n Paper,\n Typography,\n LinearProgress,\n Fade,\n Box,\n Table,\n TableHead,\n TableRow,\n TableBody,\n TableCell,\n TableSortLabel,\n Menu,\n MenuItem,\n Button,\n Icon,\n Dialog,\n} from \"@material-ui/core\";\n\nimport { Skeleton } from \"@material-ui/lab\";\nimport { useTranslation } from \"react-i18next\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faEllipsisV } from \"@fortawesome/pro-solid-svg-icons\";\n\nimport { SiteExceptions } from \"src/components\";\nimport { Site } from \"src/entities\";\nimport { useSiteList } from \"src/hooks/useSiteList\";\nimport { useHistory } from \"react-router-dom\";\nimport { useGlobalSearch } from \"src/contexts/GlobalSearchContext\";\nimport { useDialogModes } from \"src/hooks/useDialogModes\";\nimport { useUserProfile } from \"src/contexts/UserProfileContext\";\n\nimport \"./Dashboard.scss\";\n\nconst SkeletonCell = () => (\n \n \n \n \n \n);\n\nconst SkeletonRow = () => (\n \n \n \n \n \n \n \n \n);\n\nexport const Dashboard = () => {\n const { sites, sitesHasError, sortSites, sortProperty, sortDirection, siteListIsLoading } = useSiteList();\n const { userProfile } = useUserProfile();\n const { globalSearchTerm } = useGlobalSearch();\n const history = useHistory();\n const { t } = useTranslation();\n\n const [exceptionDialogOpen, setExceptionDialogOpen] = useState(false);\n const [menuSite, setMenuSite] = useState();\n const [menuAnchorElement, setMenuAnchorElement] = useState();\n const [menuAvailable, setMenuAvailable] = useState(false);\n const [siteLinkEnabled, setSiteLinkEnabled] = useState(false);\n\n const { fullscreen } = useDialogModes();\n\n const onSelectSite = (siteId: string) => {\n if (siteLinkEnabled) {\n history.push(`sites/${siteId}`);\n }\n };\n\n const filteredSites = useMemo(() => {\n if (globalSearchTerm) {\n return sites.filter((s) => s.name.toLowerCase().includes(globalSearchTerm));\n }\n\n return sites;\n }, [sites, globalSearchTerm]);\n\n useEffect(() => {\n if (userProfile) {\n const hasSiteScheduleExceptionsPermissions =\n userProfile.userPermissions?.partnerPermissions?.includes(\"SiteScheduleExceptions\") ||\n userProfile.userPermissions?.sitePermissions?.includes(\"SiteScheduleExceptions\");\n\n setMenuAvailable(!!hasSiteScheduleExceptionsPermissions);\n\n const hasSiteInformationPermissions =\n userProfile.userPermissions?.partnerPermissions?.includes(\"SiteInformation\") ||\n userProfile.userPermissions?.sitePermissions?.includes(\"SiteInformation\");\n\n setSiteLinkEnabled(!!hasSiteInformationPermissions);\n }\n }, [userProfile]);\n\n const sitesShownString = () => {\n if (filteredSites && sites) {\n if (sites.length !== filteredSites.length) {\n return t(\"Entities.Sites.SitesShown\", { sitesShown: filteredSites.length, sitesTotal: sites.length });\n }\n\n return sites.length;\n }\n\n return \"\";\n };\n\n return (\n
\n
    \n
  • {t(\"Gui.Manage.SideMenu.Overview\")}
  • \n
\n {siteListIsLoading ? : null}\n \n \n {menuAnchorElement ? (\n {\n setMenuSite(undefined);\n setMenuAnchorElement(undefined);\n }}\n >\n {\n setExceptionDialogOpen(true);\n setMenuAnchorElement(undefined);\n }}\n >\n \n {t(\"Entities.ScheduleException.ScheduleExceptions\")}\n \n \n ) : null}\n \n \n \n \n \n {t(\"Entities.Site.Sites\")} ({sitesShownString()})\n \n \n \n {t(\"Entities.Events.Events\")}\n \n \n \n \n \n \n \n sortSites(\"name\")}\n style={{ margin: 0 }}\n >\n {t(\"Entities.Common.Name\")}\n \n \n \n sortSites(\"eventsLastWeek\")}\n style={{ margin: 0 }}\n >\n {t(\"Entities.Events.LastWeek\")}\n \n \n \n sortSites(\"eventsLastDay\")}\n style={{ margin: 0 }}\n >\n {t(\"Entities.Events.LastDay\")}\n \n \n \n \n \n {sitesHasError && (\n \n \n Error Loading Sites\n \n )}\n {filteredSites.length === 0 && !siteListIsLoading ? (\n \n \n {t(\"Entities.Site.NoSites\")}\n \n ) : null}\n {siteListIsLoading ? (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ) : null}\n {filteredSites?.map((site: Site) => (\n onSelectSite(site.id)}\n >\n \n {site.name[0]}\n \n \n \n \n {site.name}\n \n \n \n \n \n {site.eventsLastWeek != null && site.eventsLastWeek >= 0\n ? site.eventsLastWeek\n : \"-\"}\n \n \n \n \n {site.eventsLastDay != null && site.eventsLastDay >= 0\n ? site.eventsLastDay\n : \"-\"}\n \n {menuAvailable ? (\n {\n e.preventDefault();\n e.stopPropagation();\n setMenuSite(site);\n setMenuAnchorElement(e.target as HTMLElement);\n }}\n >\n \n \n ) : null}\n \n \n ))}\n \n
\n
\n
\n {menuSite && exceptionDialogOpen && (\n \n {\n setMenuAnchorElement(undefined);\n setMenuSite(undefined);\n setExceptionDialogOpen(false);\n }}\n />\n \n )}\n
\n );\n};\n","import { Table, TableRow, TableCell, Button, Typography, TableHead, TableBody } from \"@material-ui/core/\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faEye, faEyeSlash, faLowVision } from \"@fortawesome/pro-solid-svg-icons\";\nimport { faTimes, faCircleNotch } from \"@fortawesome/pro-light-svg-icons\";\nimport moment from \"moment-timezone\";\nimport { formatDateTime } from \"../../../utils\";\nimport { ScheduleException, Site } from \"../../../entities\";\n\ntype ScheduleExceptionsTableProps = {\n analysisEnabledCaption: string;\n onRemove?: (exception: ScheduleException) => void;\n removeButtonCaption?: string;\n removeRequestLoading?: boolean;\n scheduleExceptions: ScheduleException[];\n site: Site;\n disableRemoveButton: boolean;\n};\n\nexport const ScheduleExceptionsTable = (props: ScheduleExceptionsTableProps) => {\n const { t } = useTranslation();\n const {\n analysisEnabledCaption,\n removeButtonCaption,\n removeRequestLoading,\n scheduleExceptions,\n site,\n disableRemoveButton,\n } = props;\n\n const [clicked, setClicked] = useState([] as string[]);\n\n const handleRemove = (ex: ScheduleException) => {\n setClicked([ex.id, ...clicked]);\n\n if (props.onRemove) {\n props.onRemove(ex);\n }\n };\n\n useEffect(() => {\n if (!removeRequestLoading) {\n setClicked([]);\n }\n }, [removeRequestLoading]);\n\n return (\n <>\n {scheduleExceptions?.length === 0 ? (\n {t(\"Entities.Schedule.NoScheduleExceptions\")}\n ) : null}\n {!!scheduleExceptions && scheduleExceptions.length !== 0 ? (\n \n \n \n {analysisEnabledCaption}\n {t(\"Entities.Schedule.StartTime\")}\n {t(\"Entities.Schedule.StopTime\")}\n \n \n \n {scheduleExceptions?.map((ex: ScheduleException) => {\n const appliesTo = ex.isFullSiteException\n ? t(\"Entities.ScheduleException.AppliesToFullSite\")\n : t(\"Entities.ScheduleException.AppliesToConfigurationGroupsFormat\", {\n configurationGroups: ex.configurationGroups\n ?.map(\n (cg) =>\n cg.name || t(\"Entities.Default.DefaultDetectionConfiguration\", cg),\n )\n ?.join(\", \"),\n });\n return (\n \n \n \n {(() => {\n if (!ex.isFullSiteException) {\n return (\n \n \n {t(\"Entities.ScheduleException.PartiallyEnabled\")}\n \n );\n }\n if (ex.isOnType) {\n return (\n \n \n {t(\"Entities.ScheduleException.Enabled\")}\n \n );\n }\n return (\n \n \n {t(\"Entities.ScheduleException.Disabled\")}\n \n );\n })()}\n \n {formatDateTime(moment(ex.dtStart), site.timeZone)}\n {formatDateTime(moment(ex.dtStop), site.timeZone)}\n \n \n \n {appliesTo}\n \n {!!props.onRemove && (\n \n handleRemove(ex)}\n disabled={disableRemoveButton}\n startIcon={\n removeRequestLoading && clicked.includes(ex.id) ? (\n \n ) : (\n \n )\n }\n >\n {removeButtonCaption}\n \n \n )}\n \n \n );\n })}\n \n
\n ) : null}\n \n );\n};\n","import { Moment } from \"moment-timezone\";\nimport { ScheduleException } from \"src/entities\";\n\nexport const hasDatesInPast = (start: Moment, end: Moment, utcNow: Moment) => {\n return start.isBefore(utcNow) || end.isBefore(utcNow);\n};\n\nexport const hasInvalidEndDate = (start: Moment, end: Moment) => {\n return end.isSameOrBefore(start);\n};\n\nexport const hasCollisions = (scheduleExceptions: ScheduleException[], start: Moment, end: Moment) => {\n let ret = false;\n\n scheduleExceptions?.forEach((e: ScheduleException) => {\n if (start.isSameOrAfter(e.dtStart) && start.isBefore(e.dtStop)) ret = true;\n if (end.isAfter(e.dtStart) && end.isSameOrBefore(e.dtStop)) ret = true;\n\n if (e.dtStart.isSameOrAfter(start) && e.dtStart.isBefore(end)) ret = true;\n if (e.dtStop.isAfter(start) && e.dtStop.isSameOrBefore(end)) ret = true;\n });\n\n return ret;\n};\n\nexport type Duration =\n | \"30Minutes\"\n | \"1Hour\"\n | \"2Hours\"\n | \"3Hours\"\n | \"4Hours\"\n | \"6Hours\"\n | \"8Hours\"\n | \"12Hours\"\n | \"16Hours\"\n | \"24Hours\";\n","import React from \"react\";\nimport { Redirect, Route } from \"react-router-dom\";\nimport { setUserLastKnownRoute } from \"src/utils/storage\";\nimport { getToken } from \"../../utils\";\n\nexport const AuthenticatedRoute: React.FC = (props: any) => {\n const token = getToken();\n\n if (token) {\n return ;\n }\n\n setUserLastKnownRoute(props.location.pathname);\n return ;\n};\n","import React from \"react\";\n\nimport { Link as MaterialLink, LinkProps as MaterialLinkProps } from \"@material-ui/core\";\nimport { Link as RouterLink, LinkProps as RouterLinkProps } from \"react-router-dom\";\n\nexport type LinkProps = RouterLinkProps & MaterialLinkProps;\n\n// eslint-disable-next-line react/display-name\nconst RouterLinkComponent = React.forwardRef((props, ref) => (\n \n));\n\nexport class Link extends React.Component {\n render() {\n return (\n \n {this.props.children}\n \n );\n }\n}\n","import React from \"react\";\n\nimport { Tab, TabProps } from \"@material-ui/core\";\nimport { Link, LinkProps } from \"src/components\";\n\nconst InternalLinkTab: React.ComponentType = Tab as React.ComponentType;\n\ntype LinkTabProps = LinkProps & TabProps;\n\nexport class LinkTab extends React.Component {\n render() {\n return (\n \n {this.props.children}\n \n );\n }\n}\n","import React from \"react\";\n\nimport { ListItem } from \"@material-ui/core\";\nimport { Link as RouterLink, LinkProps as RouterLinkProps } from \"react-router-dom\";\n\ntype ListItemLinkProps = {\n to: string;\n children: any;\n};\n\nexport const ListItemLink: React.FC = (props: ListItemLinkProps) => {\n const { children, to } = props;\n\n const renderLink = React.useMemo(\n () =>\n // eslint-disable-next-line react/display-name\n React.forwardRef>((itemProps, ref) => (\n // With react-router-dom@^6.0.0 use `ref` instead of `innerRef`\n // See https://github.com/ReactTraining/react-router/issues/6056\n \n )),\n [to],\n );\n return (\n \n {children}\n \n );\n};\n","import React, { ReactNode } from \"react\";\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from \"@material-ui/core\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faCheck } from \"@fortawesome/pro-light-svg-icons\";\n\ntype OkCancelDialogProps = {\n okButtonText: string;\n onClose: (ok: boolean) => void;\n children?: ReactNode;\n title: string;\n open: boolean;\n};\n\nexport const OkCancelDialog = (props: OkCancelDialogProps) => {\n const { t } = useTranslation();\n const { okButtonText, onClose, open, title, children } = props;\n\n const handleOk = () => {\n onClose(true);\n };\n\n const handleCancel = () => {\n onClose(false);\n };\n\n return (\n handleCancel()}>\n \n {title}\n \n {children}\n \n \n }\n onClick={() => handleOk()}\n >\n {t(okButtonText ?? \"Gui.Buttons.Ok\")}\n \n \n \n );\n};\n","import { RouteComponentProps, RouteProps, Route } from \"react-router-dom\";\n\nimport React, { ReactElement } from \"react\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype PropsRouteProps

> = RouteProps & {\n component: React.ComponentType> | React.ComponentType;\n withProps?: any;\n};\n\nexport const PropsRoute =

>({\n component: WrappedComponent,\n withProps,\n ...routeProps\n}: PropsRouteProps

): ReactElement

=> {\n return (\n {\n return ;\n }}\n />\n );\n};\n","import React from \"react\";\nimport { Redirect, Route } from \"react-router-dom\";\nimport { getToken } from \"../../utils\";\n\nexport const RedirectRoute: React.FC = (props: { redirectIfLoggedIn: string; path: string; component: any }) => {\n const token = getToken();\n\n if (token) {\n return ;\n }\n\n return ;\n};\n","import { ScheduleExceptionDelete, ScheduleExceptionPost } from \"src/entities\";\nimport { apiUrl } from \"src/settings\";\nimport { fetchWithIntercept } from \"./fetchService\";\n\nexport const addScheduleException = async (\n siteId: string,\n scheduleException: ScheduleExceptionPost,\n logout: () => void,\n) => {\n const url = `${apiUrl}/sites/${siteId}/scheduleExceptions`;\n\n try {\n const response = await fetchWithIntercept(url, \"POST\", logout, scheduleException);\n\n // we are disregarding the response here and only return true or false,\n // and thus put the resposibility on the function calling this function\n // to refresh scheduleException data from the api\n\n return response.ok;\n } catch (err) {\n throw new Error(err as string);\n }\n};\n\nexport const updateScheduleException = async (\n siteId: string,\n scheduleException: ScheduleExceptionDelete,\n logout: () => void,\n) => {\n const url = `${apiUrl}/sites/${siteId}/scheduleExceptions`;\n\n try {\n const response = await fetchWithIntercept(url, \"PATCH\", logout, scheduleException);\n\n // we are disregarding the response here and only return true or false,\n // and thus put the resposibility on the function calling this function\n // to refresh scheduleException data from the api\n\n return response.ok;\n } catch (err) {\n throw new Error(err as string);\n }\n};\n","import moment from \"moment-timezone\";\nimport { useEffect, useState } from \"react\";\nimport { ScheduleException, ScheduleExceptionDelete, ScheduleExceptionPost } from \"src/entities\";\nimport { updateScheduleException, addScheduleException } from \"src/services/scheduleExceptionService\";\nimport { apiUrl } from \"src/settings\";\nimport { useData } from \"./useData\";\n\nconst useScheduleExceptionsInternal = (siteId: string) => {\n const url = `${apiUrl}/sites/${siteId}/scheduleExceptions`;\n const {\n data: scheduleExceptionsList,\n isLoading: scheduleExceptionsIsLoading,\n hasError: scheduleExceptionsHasError,\n refreshData: refreshScheduleExceptions,\n } = useData(url);\n\n if (scheduleExceptionsList) {\n Object.values(scheduleExceptionsList).forEach((e) => {\n e.dtStart = moment.utc(e.dtStart);\n e.dtStop = moment.utc(e.dtStop);\n });\n }\n\n return {\n scheduleExceptionsList,\n scheduleExceptionsIsLoading,\n scheduleExceptionsHasError,\n refreshScheduleExceptions,\n };\n};\n\nexport const useScheduleExceptions = (props: { siteId: string; logout: () => void }) => {\n const { siteId, logout } = props;\n const [scheduleExceptionsPostIsLoading, setScheduleExceptionsPostIsLoading] = useState(false);\n const [scheduleExceptionsPostHasError, setScheduleExceptionsPostHasError] = useState(false);\n const [scheduleExceptionsDeleteIsLoading, setScheduleExceptionsDeleteIsLoading] = useState(false);\n const [scheduleExceptionsDeleteHasError, setScheduleExceptionsDeleteHasError] = useState(false);\n const [scheduleExceptions, setScheduleExceptions] = useState([]);\n\n const {\n scheduleExceptionsList,\n scheduleExceptionsIsLoading,\n scheduleExceptionsHasError,\n refreshScheduleExceptions,\n } = useScheduleExceptionsInternal(siteId);\n\n useEffect(() => {\n if (scheduleExceptionsList) {\n setScheduleExceptions(scheduleExceptionsList);\n }\n }, [scheduleExceptionsList]);\n\n const postException = async (scheduleException: ScheduleExceptionPost) => {\n setScheduleExceptionsPostIsLoading(true);\n setScheduleExceptionsPostHasError(false);\n\n try {\n await addScheduleException(siteId, scheduleException, logout);\n } catch (err) {\n setScheduleExceptionsPostHasError(true);\n }\n\n refreshScheduleExceptions();\n\n setScheduleExceptionsPostIsLoading(false);\n };\n\n const deleteException = async (scheduleException: ScheduleExceptionDelete) => {\n setScheduleExceptionsDeleteIsLoading(true);\n setScheduleExceptionsDeleteHasError(false);\n\n try {\n await updateScheduleException(siteId, scheduleException, logout);\n } catch (error) {\n setScheduleExceptionsDeleteHasError(true);\n }\n\n refreshScheduleExceptions();\n\n setScheduleExceptionsDeleteIsLoading(false);\n };\n\n return {\n scheduleExceptions,\n scheduleExceptionsIsLoading,\n scheduleExceptionsHasError,\n scheduleExceptionsPostIsLoading,\n scheduleExceptionsPostHasError,\n scheduleExceptionsDeleteIsLoading,\n scheduleExceptionsDeleteHasError,\n postException,\n deleteException,\n };\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Box,\n Button,\n Select,\n MenuItem,\n ButtonGroup,\n Divider,\n Typography,\n LinearProgress,\n Snackbar,\n Checkbox,\n IconButton,\n Switch,\n FormControlLabel,\n InputLabel,\n FormControl,\n} from \"@material-ui/core/\";\nimport { faArrowLeft, faInfoCircle } from \"@fortawesome/pro-light-svg-icons\";\nimport { faCheck, faEye, faEyeSlash } from \"@fortawesome/pro-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { useTranslation } from \"react-i18next\";\nimport moment, { Moment } from \"moment-timezone\";\nimport { DateTimePicker, MuiPickersUtilsProvider } from \"@material-ui/pickers\";\nimport MomentUtils from \"@date-io/moment\";\nimport { useAuth } from \"src/contexts/AuthStateContext\";\nimport { ScheduleException, ScheduleExceptionDelete, ScheduleExceptionPost } from \"../../../entities/ScheduleException\";\nimport { ScheduleExceptionsTable } from \"./ScheduleExceptionsTable\";\nimport { Duration, hasCollisions, hasDatesInPast, hasInvalidEndDate } from \"./siteExceptionsUtils\";\nimport { OkCancelDialog } from \"../../Core\";\nimport { Site } from \"../../../entities\";\nimport { useScheduleExceptions } from \"../../../hooks/useScheduleExceptions\";\n\nimport \"./SiteExceptions.scss\";\n\ntype Props = {\n site: Site;\n onClose(): void;\n};\n\nexport const SiteExceptions = ({ site, onClose }: Props) => {\n const [duration, setDuration] = useState(\"1Hour\");\n const [exceptionEnabled, setExceptionEnabled] = useState(false);\n const [advancedMode, setAdvancedMode] = useState(false);\n const [showHistorical, setShowHistorical] = useState(false);\n const [dtStart, setDtStart] = useState(moment.utc().tz(site.timeZone));\n const [dtStop, setDtStop] = useState(moment.utc().tz(site.timeZone).add(1, \"hour\"));\n const [showErrorMessage, setShowErrorMessage] = useState(false);\n const [errorMessage, setErrorMessage] = useState(\"\");\n const [showOverlapConfirmation, setShowOverlapConfirmation] = useState(false);\n\n const [scheduleExceptionsOngoing, setScheduleExceptionsOngoing] = useState([]);\n const [scheduleExceptionsUpcoming, setScheduleExceptionsUpcoming] = useState([]);\n const [scheduleExceptionsHistorical, setScheduleExceptionsHistorical] = useState([]);\n\n const { logout } = useAuth();\n const { t } = useTranslation();\n const {\n scheduleExceptions,\n scheduleExceptionsIsLoading,\n scheduleExceptionsPostIsLoading,\n scheduleExceptionsDeleteIsLoading,\n postException,\n deleteException,\n } = useScheduleExceptions({ siteId: site.id, logout });\n\n const handleEndOrRemoveExceptionClick = async (ex: ScheduleException) => {\n const submitData: ScheduleExceptionDelete = {\n scheduleExceptionId: ex.id,\n };\n\n await deleteException(submitData);\n };\n\n const onApply = async (allowOverride = false) => {\n let start: Moment;\n let end: Moment;\n const utcNow = moment.utc();\n let ex = {\n id: \"\",\n isOnType: exceptionEnabled,\n } as ScheduleExceptionPost;\n\n if (!advancedMode) {\n start = utcNow.clone();\n end = moment(start).add(1, \"hours\");\n switch (duration) {\n case \"30Minutes\":\n end = moment(start).add(30, \"minutes\");\n break;\n case \"1Hour\":\n end = moment(start).add(1, \"hours\");\n break;\n case \"2Hours\":\n end = moment(start).add(2, \"hours\");\n break;\n case \"3Hours\":\n end = moment(start).add(3, \"hours\");\n break;\n case \"4Hours\":\n end = moment(start).add(4, \"hours\");\n break;\n case \"6Hours\":\n end = moment(start).add(6, \"hours\");\n break;\n case \"8Hours\":\n end = moment(start).add(8, \"hours\");\n break;\n case \"12Hours\":\n end = moment(start).add(12, \"hours\");\n break;\n case \"16Hours\":\n end = moment(start).add(16, \"hours\");\n break;\n case \"24Hours\":\n end = moment(start).add(24, \"hours\");\n break;\n default:\n break;\n }\n ex = { ...ex, durationSeconds: moment.duration(end.diff(start)).asSeconds() } as ScheduleExceptionPost;\n } else {\n start = dtStart.clone().utc();\n end = dtStop.clone().utc();\n ex = { ...ex, dtStart: start, dtStop: end, isOnType: exceptionEnabled } as ScheduleExceptionPost;\n }\n\n const collisions = hasCollisions(scheduleExceptions, start, end);\n const datesInPast = hasDatesInPast(start, end, utcNow);\n const invalidEndDate = hasInvalidEndDate(start, end);\n\n if (datesInPast) {\n setShowErrorMessage(true);\n setErrorMessage(\"Validation.irDateFuture\");\n } else if (invalidEndDate) {\n setShowErrorMessage(true);\n setErrorMessage(\"Validation.irDateEndIsBeforeStart\");\n } else if (collisions && !allowOverride) {\n setShowOverlapConfirmation(true);\n setErrorMessage(\"Entities.ScheduleException.OverlappingExceptionsMessage\");\n } else {\n if (allowOverride) {\n ex.overrideExistingExceptions = true;\n }\n await postException(ex);\n }\n };\n\n const isLoading = () => {\n return scheduleExceptionsIsLoading || scheduleExceptionsPostIsLoading || scheduleExceptionsDeleteIsLoading;\n };\n\n const handleOverrideDialogClosed = async (okClicked: boolean) => {\n setShowOverlapConfirmation(false);\n if (okClicked) {\n await onApply(true);\n }\n };\n\n const setScheduleExceptionArrays = () => {\n const now = moment.utc();\n\n const ongoing = scheduleExceptions?.filter((ex: ScheduleException) =>\n now.isBetween(ex.dtStart, ex.dtStop, \"minutes\", \"[)\"),\n );\n // sort ongoing on dtStop desc - so that the exception that is closer to ending will be on top\n setScheduleExceptionsOngoing(ongoing.sort((a, b) => b.dtStop.diff(a.dtStop)));\n\n const upcoming = scheduleExceptions?.filter((ex: ScheduleException) => now.isBefore(ex.dtStart, \"minutes\"));\n // sort upcoming on dtStart asc - so that the exception that is closer to starting will be on the top\n setScheduleExceptionsUpcoming(upcoming.sort((a, b) => a.dtStart.diff(b.dtStart)));\n\n const historical = scheduleExceptions?.filter((ex: ScheduleException) =>\n now.isSameOrAfter(ex.dtStop, \"minutes\"),\n );\n // sort historical on dtStop desc - so that the most recently ended exception is on top\n setScheduleExceptionsHistorical(historical.sort((a, b) => b.dtStop.diff(a.dtStart)));\n };\n\n useEffect(() => {\n if (!scheduleExceptionsIsLoading && !scheduleExceptionsPostIsLoading && !scheduleExceptionsDeleteIsLoading) {\n setScheduleExceptionArrays();\n }\n }, [scheduleExceptionsIsLoading, scheduleExceptionsPostIsLoading, scheduleExceptionsDeleteIsLoading]);\n\n return (\n \n

\n {\n setShowErrorMessage(false);\n setErrorMessage(\"\");\n }}\n open={showErrorMessage}\n message={t(errorMessage)}\n autoHideDuration={3000}\n >\n\n {\n await handleOverrideDialogClosed(ok);\n }}\n okButtonText=\"Gui.Buttons.Override\"\n open={showOverlapConfirmation}\n >\n {t(\"Entities.ScheduleException.OverlapOverrideConfirmationBody\")}\n \n\n {isLoading() ? : null}\n\n
\n \n \n \n
\n\n
\n
\n \n {t(\"Entities.ScheduleException.CreateNew\")}\n \n
\n\n
\n \n {t(\"Entities.ScheduleException.AnalysisShouldBe\")}\n \n \n setExceptionEnabled(true)}\n className={\n exceptionEnabled\n ? \"site-exceptions__radio-button--selected\"\n : \"site-exceptions__radio-button\"\n }\n startIcon={}\n >\n {\" \"}\n {t(\"Entities.ScheduleException.Enabled\")}{\" \"}\n \n setExceptionEnabled(false)}\n className={\n !exceptionEnabled\n ? \"site-exceptions__radio-button--selected\"\n : \"site-exceptions__radio-button\"\n }\n startIcon={}\n >\n {\" \"}\n {t(\"Entities.ScheduleException.Disabled\")}{\" \"}\n \n \n
\n {!advancedMode ? (\n
\n {/*
{t(\"Entities.ScheduleException.StartingNow\")}
*/}\n \n \n {t(\"Entities.ScheduleException.StartingNow\")}\n \n {\n setDuration(e.target.value as Duration);\n }}\n value={duration}\n >\n \n {t(\"Entities.ScheduleException.MinutesFormat\", { count: 30 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 1 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 2 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 3 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 4 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 6 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 8 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 12 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 16 })}\n \n \n {t(\"Entities.ScheduleException.HoursFormat\", { count: 24 })}\n \n \n \n
\n ) : (\n
\n \n \n {t(\"Entities.Schedule.StartTime\")}\n setDtStart((dateTime as unknown) as Moment)}\n onError={() => {}} // TODO: Error handling?\n className=\"site-exceptions__date-time-picker\"\n />\n \n \n {t(\"Entities.Schedule.StopTime\")}\n setDtStop((dateTime as unknown) as Moment)}\n onError={() => {}}\n className=\"site-exceptions__date-time-picker\"\n />\n \n \n
\n )}\n
\n \n setAdvancedMode(e.target.checked)} />}\n label={t(\"Entities.ScheduleException.Advanced\")}\n />\n \n \n }\n color=\"primary\"\n onClick={async () => {\n await onApply(false);\n }}\n disabled={isLoading()}\n size=\"large\"\n >\n {t(\"Gui.Buttons.Apply\")}\n \n \n
\n
\n \n {t(\"Entities.ScheduleException.CurrentScheduleExceptions\")}\n \n
\n\n handleEndOrRemoveExceptionClick(exception)}\n removeButtonCaption={t(\"Entities.ScheduleException.EndNow\")}\n removeRequestLoading={scheduleExceptionsDeleteIsLoading}\n site={site}\n disableRemoveButton={isLoading()}\n />\n\n
\n \n {t(\"Entities.ScheduleException.UpcomingScheduleExceptions\")}\n \n
\n\n handleEndOrRemoveExceptionClick(exception)}\n removeButtonCaption={t(\"Gui.Buttons.Remove\")}\n removeRequestLoading={scheduleExceptionsDeleteIsLoading}\n site={site}\n disableRemoveButton={isLoading()}\n />\n\n
\n \n {t(\"Entities.ScheduleException.HistoricalScheduleExceptions\")}\n \n
\n setShowHistorical(e.target.checked)} />\n }\n label={t(\"Entities.ScheduleException.ShowHistoricalScheduleExceptions\")}\n />\n\n {showHistorical ? (\n \n ) : null}\n\n \n\n
\n

\n \n {t(\"Entities.ScheduleException.OverlapInfo\")}\n

\n
\n
\n\n
\n \n
\n
\n \n );\n};\n","export default \"data:image/png;base64,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\"","/* eslint-disable @typescript-eslint/unbound-method */\nimport React, { useState } from \"react\";\nimport { Button, TextField, Box, Fade } from \"@material-ui/core\";\nimport { useTranslation } from \"react-i18next\";\nimport { getUserLastKnownRoute } from \"src/utils/storage\";\nimport { useAuth } from \"src/contexts/AuthStateContext\";\nimport irisityLogo from \"src/img/logos/irisity_logo_header.png\";\nimport { Redirect } from \"react-router-dom\";\nimport { Link } from \".\";\n\nimport \"./Login.scss\";\n\nexport const Login = () => {\n const {\n authError,\n isLoggedIn,\n requiresTwoFactorAuth,\n twoFactorStatusError,\n checkTwoFactorStatus,\n login,\n } = useAuth();\n const { t } = useTranslation();\n\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [twoFactorAuthCode, setTwoFactorAuthCode] = useState(\"\");\n\n const submitForm = async (event: React.FormEvent) => {\n event.preventDefault();\n await login({ username, password, twoFactorAuthCode });\n };\n\n return isLoggedIn ? (\n \n ) : (\n
\n
\n
\n
\n
\n
\n \"Irisity\n
\n
\n {\n setUsername(e.target.value);\n checkTwoFactorStatus(e.target.value);\n }}\n />\n {\n setPassword(e.target.value);\n }}\n label={t(\"BeforeLogin.Login.Password\")}\n />\n {requiresTwoFactorAuth && (\n {\n setTwoFactorAuthCode(e.target.value);\n }}\n label={t(\"BeforeLogin.Login.GoogleAuthenticationCode\")}\n />\n )}\n
\n
\n
\n \n \n \n
\n {authError && (\n \n \n {t(\"BeforeLogin.Login.ErrorLoggingIn\")}\n \n \n )}\n {twoFactorStatusError && (\n \n \n {t(\"BeforeLogin.Login.ErrorLoggingIn.TwoFactorAuthCode\")}\n \n \n )}\n
\n
\n \n {t(\"BeforeLogin.Login.AboutIrisityIRIS\")}\n \n
\n
\n
\n
\n
\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { faBars, faSearch, faHome, faDoorClosed, faUser } from \"@fortawesome/pro-light-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Link, useHistory, useLocation } from \"react-router-dom\";\n\nimport {\n AppBar,\n Divider,\n IconButton,\n InputBase,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n SwipeableDrawer,\n Toolbar,\n} from \"@material-ui/core\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { ListItemLink } from \"src/components\";\nimport logo from \"src/img/logos/irisity_logo_header.png\";\nimport { useAuth } from \"src/contexts/AuthStateContext\";\nimport { useGlobalSearch } from \"src/contexts/GlobalSearchContext\";\nimport { useUserProfile } from \"src/contexts/UserProfileContext\";\n\nimport \"./NavBar.scss\";\n\nexport const NavBar = () => {\n const { auth, logout } = useAuth();\n const { userProfile } = useUserProfile();\n const { clearGlobalSearchTerm, debounceTerm, globalSearchTerm, setGlobalSearchTerm } = useGlobalSearch();\n\n const { t } = useTranslation();\n const location = useLocation();\n const history = useHistory();\n\n const [menuIsOpen, setMenuIsOpen] = useState(false);\n const [drawerIsOpen, setDrawerIsOpen] = useState(false);\n\n const toggleDrawerOpen = (open: boolean) => (event: React.KeyboardEvent | React.MouseEvent) => {\n if (\n event &&\n event.type === \"keydown\" &&\n ((event as React.KeyboardEvent).key === \"Tab\" || (event as React.KeyboardEvent).key === \"Shift\")\n ) {\n return;\n }\n\n if (drawerIsOpen !== open) {\n setDrawerIsOpen(open);\n }\n };\n\n const sideList = () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n );\n\n const handleMenuClose = () => {\n setMenuIsOpen(false);\n };\n\n useEffect(() => {\n if (globalSearchTerm !== \"\" && location.pathname !== \"/Dashboard\") {\n history.push(\"/Dashboard\");\n }\n }, [globalSearchTerm]);\n\n useEffect(() => {\n if (location.pathname !== \"/Dashboard\" && globalSearchTerm !== \"\") {\n setGlobalSearchTerm(\"\");\n clearGlobalSearchTerm();\n }\n }, [location.pathname]);\n\n return auth ? (\n
\n \n \n \n \"Irisity\"\n \n
\n
\n \n
\n setGlobalSearchTerm(e.target.value)}\n />\n
\n
\n
\n \n \n \n
\n
\n
\n \n My account\n Profile\n \n \n {sideList()}\n \n
\n ) : null;\n};\n","import React, { useState, useEffect, useRef } from \"react\";\n\nimport { fetchImageWithAccessToken } from \"src/utils\";\n\nimport \"./_lazy-image.scss\";\n\nconst placeHolder =\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkqAcAAIUAgUW0RjgAAAAASUVORK5CYII=\";\n\ntype OwnProps = {\n src: string;\n alt: string;\n intersectionNode: Element | null;\n};\n\nexport const LazyLoadImage = (props: OwnProps) => {\n const [imageSrc, setImageSrc] = useState(\"\");\n const [inViewport, setInViewport] = useState(false);\n const wrapperRef = useRef(null);\n\n const onLoad = (event) => {\n if (event.target.complete) {\n event.target.classList.add(\"lazy-image__source--loaded\");\n }\n };\n\n const onError = (event) => {\n event.target.classList.add(\"lazy-image__source--has-error\");\n setImageSrc(placeHolder);\n };\n\n useEffect(() => {\n let sub;\n if (inViewport) {\n sub = fetchImageWithAccessToken(`${props.src}`).subscribe((response) => {\n setImageSrc(response.url);\n });\n }\n\n return () => {\n if (sub) {\n sub.unsubscribe();\n }\n };\n }, [inViewport]);\n\n useEffect(() => {\n let observer;\n let didCancel = false;\n\n if (wrapperRef?.current) {\n if (IntersectionObserver) {\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!didCancel && (entry.intersectionRatio > 0 || entry.isIntersecting)) {\n setInViewport(true);\n observer.unobserve(wrapperRef?.current);\n }\n });\n },\n {\n root: props.intersectionNode,\n threshold: 0.01,\n rootMargin: \"75%\",\n },\n );\n observer.observe(wrapperRef?.current);\n } else {\n // Old browsers fallback\n setInViewport(true);\n }\n }\n return () => {\n didCancel = true;\n // on component cleanup, we remove the listener\n if (observer?.unobserve && wrapperRef?.current) {\n observer.unobserve(wrapperRef.current);\n }\n };\n }, [wrapperRef]);\n return (\n
\n {inViewport && imageSrc ? (\n {props.alt}\n ) : null}\n
\n );\n};\n","export default __webpack_public_path__ + \"static/media/irisity-logo-animation.1ea791a9.mp4\";","export default __webpack_public_path__ + \"static/media/irisity-logo-animation.7ed8aeef.ogv\";","export default __webpack_public_path__ + \"static/media/irisity-logo-animation.7f3fa58b.png\";","export default __webpack_public_path__ + \"static/media/irisity-logo-animation.4ea870d1.webm\";","import React from \"react\";\n\nimport animationMp4 from \"./irisity-logo-animation.mp4\";\nimport animationOgv from \"./irisity-logo-animation.ogv\";\nimport posterImage from \"./irisity-logo-animation.png\";\nimport animationWebm from \"./irisity-logo-animation.webm\";\n\nexport const LogoAnimation: React.FC = () => (\n \n \n \n \n \"Placeholder\n \n);\n","import React, { Component } from \"react\";\nimport { createStyles, Theme, withStyles, WithStyles, Typography, Box } from \"@material-ui/core\";\nimport { withTranslation, WithTranslation } from \"react-i18next\";\n\nconst styles = () => createStyles({});\n\ntype OwnProps = {\n theme: Theme;\n video: string;\n onLoadedMetadata: (event: React.SyntheticEvent) => void;\n onLoadedData: (event: React.SyntheticEvent) => void;\n onLoadStart: (event: React.SyntheticEvent) => void;\n};\n\ntype Props = OwnProps & WithStyles & WithTranslation;\n\nclass AlarmVideoInternal extends Component {\n constructor(props: Props) {\n super(props);\n this.state = {};\n }\n\n handleLoadedMetaData = (event: React.SyntheticEvent) => {\n this.props.onLoadedMetadata(event);\n };\n\n handleLoadedData = (event: React.SyntheticEvent) => {\n this.props.onLoadedData(event);\n };\n\n handleLoadStart = (event: React.SyntheticEvent) => {\n this.props.onLoadStart(event);\n };\n\n render() {\n const { t } = this.props;\n\n return (\n \n {this.props.video ? (\n \n \n {t(\"Entities.VideoNotFound\")}\n \n ) : (\n \n \n {t(\"Entities.VideoNotFound\")}\n \n \n )}\n \n );\n }\n}\n\nexport const AlarmVideo = withTranslation()(withStyles(styles, { withTheme: true })(AlarmVideoInternal));\n","import moment, { Moment } from \"moment-timezone\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { Alarm } from \"src/entities\";\nimport { makeApiUrl } from \"src/utils\";\nimport { useData } from \"./useData\";\n\ntype AlarmsApiResponse = {\n events: Alarm[];\n eventsTotal: { [key: string]: number };\n};\n\nconst useAlarmsInternal = (siteId: string, from: Moment, to: Moment) => {\n const url = makeApiUrl(`/sites/${siteId}/events`, {\n fromDate: moment.utc(from).format(),\n toDate: moment.utc(to).format(),\n offset: 0,\n count: 1000,\n generateVideoUrl: true,\n generateOverlayUrl: true,\n });\n\n const { data: alarmsResponse, isLoading: alarmsIsLoading, hasError: alarmsHasError } = useData(\n url,\n );\n\n return { alarmsResponse, alarmsIsLoading, alarmsHasError };\n};\n\nexport const useAlarms = (_siteId: string, _from: Moment, _to: Moment) => {\n const [siteId] = useState(_siteId);\n const [from, setFrom] = useState(_from);\n const [to, setTo] = useState(_to);\n\n const { alarmsResponse, alarmsIsLoading, alarmsHasError } = useAlarmsInternal(siteId, from, to);\n\n const alarms = useMemo(() => {\n return alarmsResponse?.events?.map((event) => ({ ...event }));\n }, [alarmsResponse]);\n\n const changeDates = useCallback(\n (__from: Moment, __to: Moment) => {\n setFrom(__from);\n setTo(__to);\n },\n [from, to],\n );\n\n return { alarms, alarmsIsLoading, alarmsHasError, changeDates };\n};\n","import React, { Component } from \"react\";\nimport { withTranslation, WithTranslation } from \"react-i18next\";\nimport { AlarmVideo } from \"src/components\";\nimport { AlarmOverlay, AlarmZoneType } from \"src/entities\";\n\nimport \"./_alarm-overlay.scss\";\n\ntype OwnProps = {\n video: string;\n overlay: AlarmOverlay;\n};\n\ntype Props = OwnProps & WithTranslation;\n\nclass AlarmOverlayVideoInternal extends Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n width: null,\n height: null,\n videoDataLoaded: null,\n error: null,\n overlay: null,\n };\n }\n\n handleLoadedMetadata = (event: React.SyntheticEvent) => {\n this.setState({\n width: (event.target as HTMLVideoElement).videoWidth,\n height: (event.target as HTMLVideoElement).videoHeight,\n });\n };\n\n handleLoadedData = () => {\n this.setState({\n videoDataLoaded: true,\n });\n };\n\n handleLoadStart = () => {\n this.setState({\n videoDataLoaded: false,\n });\n };\n\n renderOverlay = () => {\n return this.props.overlay && this.state.width && this.state.height && this.state.videoDataLoaded;\n };\n\n relativeToSvg = (x: number, y: number) => {\n if ((x || x === 0) && (y || y === 0) && this.state.width && this.state.height) {\n const X = this.state.width > 1 ? x * (this.state.width - 1) : x;\n const Y = this.state.height > 1 ? y * (this.state.height - 1) : y;\n return `${X},${Y}`;\n }\n return null;\n };\n\n absoluteToSvg = (x: number, y: number) => {\n if ((x || x === 0) && (y || y === 0)) {\n return `${x},${y}`;\n }\n return null;\n };\n\n alarmZonePaths = () => {\n const paths = this.props.overlay?.alarmZones?.flatMap((alarmZone, alarmZoneIndex) => {\n if (alarmZone) {\n const coords = alarmZone.polygon?.flatMap((vertex, vertexIndex) => {\n const points = this.relativeToSvg(vertex?.x, vertex?.y);\n if (points) {\n return vertexIndex === 0 ? `M${points}` : `L${points}`;\n }\n return [];\n });\n if (coords?.length && coords[0].startsWith(\"M\")) {\n return (\n \n );\n }\n return [];\n }\n return [];\n });\n return paths?.length ? paths : null;\n };\n\n triggeredAlarmZonePath = () => {\n const coords = this.props.overlay?.triggeredAlarmZone?.polygon?.flatMap((vertex, vertexIndex) => {\n const points = this.relativeToSvg(vertex?.x, vertex?.y);\n if (points) {\n return vertexIndex === 0 ? `M${points}` : `L${points}`;\n }\n return [];\n });\n if (coords?.length && coords[0].startsWith(\"M\")) {\n return ;\n }\n return null;\n };\n\n getBoundingBoxCoords = (x: number, y: number, width: number, height: number, offset: number) => {\n if ((x || x === 0) && (y || y === 0) && width && height && (offset || offset === 0)) {\n const resized = [\n {\n x: x - width / 2,\n y: y - height / 2,\n },\n {\n x: x + (3 * width) / 2,\n y: y - height / 2,\n },\n {\n x: x + (3 * width) / 2,\n y: y + (3 * height) / 2,\n },\n {\n x: x - width / 2,\n y: y + (3 * height) / 2,\n },\n ].flatMap((vertex, vertexIndex) => {\n if (vertex) {\n const points = this.absoluteToSvg(vertex?.x + offset, vertex?.y + offset);\n if (points) {\n return vertexIndex === 0 ? `M${points}` : `L${points}`;\n }\n }\n return [];\n });\n if (resized?.length && resized[0].startsWith(\"M\")) {\n return resized;\n }\n return null;\n }\n return null;\n };\n\n blobHistoryPath = () => {\n const coords = this.props.overlay?.blobPositionHistory?.flatMap((vertex, vertexIndex) => {\n const points = this.absoluteToSvg(vertex?.x, vertex?.y);\n if (points) {\n return vertexIndex === 0 ? `M${points}` : `L${points}`;\n }\n return [];\n });\n if (coords?.length && coords[0].startsWith(\"M\")) {\n return ;\n }\n return null;\n };\n\n boundingBoxPaths = (offset: number) => {\n const paths = this.props.overlay?.boundingBoxes?.flatMap((bbox, index) => {\n if (bbox) {\n const coords = this.getBoundingBoxCoords(bbox?.x, bbox?.y, bbox?.width, bbox?.height, offset);\n if (coords?.length && coords[0].startsWith(\"M\")) {\n return coords ? (\n \n ) : null;\n }\n return [];\n }\n return [];\n });\n return paths?.length ? paths : null;\n };\n\n render() {\n let overlay;\n\n if (this.renderOverlay()) {\n const triggeredAlarmZonePath = this.triggeredAlarmZonePath();\n const alarmZonePaths = this.alarmZonePaths();\n let triggeredAlarmZone;\n let alarmZones;\n let boundingBoxes;\n let dropShadows;\n let blobHistory;\n const boundingBoxPaths = this.boundingBoxPaths(0);\n const dropShadowPaths = this.boundingBoxPaths(-1);\n const blobHistoryPath = this.blobHistoryPath();\n\n if (\n this.props.overlay?.triggeredAlarmZone?.type === AlarmZoneType[AlarmZoneType.MotionDetection] ||\n this.props.overlay?.triggeredAlarmZone?.type ===\n AlarmZoneType[AlarmZoneType.ViolentBehaviorDetection] ||\n this.props.overlay?.triggeredAlarmZone?.type === AlarmZoneType[AlarmZoneType.FallDetection]\n ) {\n boundingBoxes = boundingBoxPaths ? (\n {boundingBoxPaths}\n ) : null;\n }\n\n switch (this.props.overlay?.triggeredAlarmZone?.type) {\n case AlarmZoneType.MotionDetection:\n triggeredAlarmZone = triggeredAlarmZonePath ? (\n \n {triggeredAlarmZonePath}\n \n ) : null;\n alarmZones = alarmZonePaths ? {alarmZonePaths} : null;\n dropShadows = dropShadowPaths ? (\n {dropShadowPaths}\n ) : null;\n blobHistory = blobHistoryPath ? (\n {blobHistoryPath}\n ) : null;\n\n overlay = (\n \n {triggeredAlarmZone}\n {alarmZones}\n {boundingBoxes}\n {dropShadows}\n {blobHistory}\n \n );\n break;\n case AlarmZoneType.ViolentBehaviorDetection:\n case AlarmZoneType.FallDetection:\n triggeredAlarmZone = triggeredAlarmZonePath ? (\n \n {triggeredAlarmZonePath}\n \n ) : null;\n alarmZones = alarmZonePaths ? {alarmZonePaths} : null;\n dropShadows = dropShadowPaths ? (\n {dropShadowPaths}\n ) : null;\n\n overlay = (\n \n {triggeredAlarmZone}\n {alarmZones}\n {boundingBoxes}\n {dropShadows}\n \n );\n break;\n case AlarmZoneType.LoiteringDetection:\n triggeredAlarmZone = triggeredAlarmZonePath ? (\n \n {triggeredAlarmZonePath}\n \n ) : null;\n alarmZones = alarmZonePaths ? {alarmZonePaths} : null;\n\n overlay = (\n \n {triggeredAlarmZone}\n {alarmZones}\n \n );\n break;\n default:\n if (this.props.overlay?.boundingBoxes) {\n boundingBoxes = boundingBoxPaths ? (\n \n {boundingBoxPaths}\n \n ) : null;\n dropShadows = dropShadowPaths ? (\n \n {dropShadowPaths}\n \n ) : null;\n overlay = (\n \n {boundingBoxes}\n {dropShadows}\n \n );\n } else {\n overlay = null;\n }\n break;\n }\n } else {\n overlay = null;\n }\n\n return (\n
\n \n {overlay}\n
\n );\n }\n}\n\nexport const AlarmOverlayVideo = withTranslation()(AlarmOverlayVideoInternal);\n","import React, { Component } from \"react\";\nimport { createStyles, Theme, withStyles, WithStyles, CircularProgress } from \"@material-ui/core\";\nimport { withTranslation, WithTranslation } from \"react-i18next\";\nimport { interval } from \"rxjs\";\n\nimport { fetchImageWithAccessToken } from \"src/utils\";\nimport { Alarm } from \"../../../entities\";\nimport { apiUrl } from \"../../../settings\";\n\nimport \"./_alarm-thumbnail.scss\";\n\nconst styles = () => createStyles({});\n\ntype OwnProps = {\n theme: Theme;\n alarm: Alarm;\n};\n\ntype OwnState = {\n offset: number;\n frame: number;\n videoLoadingError: boolean;\n subscription: any;\n imageUrl: string;\n};\n\ntype Props = OwnProps & WithStyles & WithTranslation;\n\nclass AlarmThumbnailInternal extends Component {\n constructor(props: Props) {\n super(props);\n const state = {\n offset: 0,\n frame: 0,\n videoLoadingError: false,\n subscription: interval(400).subscribe(() => this.animate()),\n imageUrl: \"\",\n loading: false,\n };\n\n this.state = state;\n }\n\n componentDidMount() {\n this.fetchImage();\n }\n\n componentDidUpdate(prevProps: OwnProps) {\n if (prevProps.alarm.id !== this.props.alarm.id) {\n this.setState(\n (state) => {\n return {\n ...state,\n offset: 0,\n frame: 0,\n videoLoadingError: false,\n };\n },\n () => {\n this.fetchImage();\n },\n );\n }\n }\n\n componentWillUnmount() {\n this.state.subscription.unsubscribe();\n }\n\n fetchImage() {\n const url = `${apiUrl}/events/${this.props.alarm.friendlyId}/video/sprite`;\n this.setState((state) => ({\n ...state,\n loading: true,\n }));\n const sub = fetchImageWithAccessToken(url).subscribe((response) => {\n sub.unsubscribe();\n if (!response.error) {\n this.setState((state) => ({\n ...state,\n loading: false,\n imageUrl: response.url,\n }));\n } else {\n this.handleVideoLoadingError();\n }\n });\n }\n\n animate = () => {\n this.setState(\n (state: OwnState) => {\n state.frame = (state.frame + 1) % 4;\n state.offset = (state.frame * 100) / 3;\n\n return state;\n },\n () => {\n this.forceUpdate();\n },\n );\n };\n\n handleVideoLoadingError = () => {\n this.setState((state) => {\n state.videoLoadingError = true;\n state.loading = false;\n return state;\n });\n };\n\n render() {\n const { t } = this.props;\n return (\n
\n {this.state.loading || this.state.videoLoadingError ? (\n \n {this.state.loading ? (\n \n \n
\n ) : null}\n {this.state.videoLoadingError ? (\n {t(\"Entities.VideoNotFound\")}\n ) : null}\n \n ) : null}\n {!this.state.loading && this.state.imageUrl ? (\n \n \n {!this.state.videoLoadingError ? (\n \n ) : null}\n \n ) : null}\n
\n );\n }\n}\n\nexport const AlarmThumbnail = withTranslation()(withStyles(styles, { withTheme: true })(AlarmThumbnailInternal));\n","import React, { ReactNode } from \"react\";\nimport moment from \"moment-timezone\";\nimport { RouteComponentProps } from \"react-router-dom\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { AlarmOverlayVideo } from \"./AlarmOverlayVideo\";\nimport { AlarmThumbnail } from \"./AlarmThumbnail\";\nimport { Alarm, Site, EventAssessmentClass, EventClassification } from \"../../../entities\";\n\nimport { formatDateTime } from \"../../../utils\";\n\nimport \"./_info-list.scss\";\nimport \"./_alarm-details.scss\";\n\ntype InfoString = {\n isTranslatable: boolean;\n strings: (string | ReactNode)[];\n};\n\ntype Props = {\n alarm: Alarm;\n site: Site;\n} & RouteComponentProps;\n\nexport const AlarmDetails = (props: Props) => {\n const { alarm, site } = props;\n const { t } = useTranslation();\n\n const findInfoString = (result) => {\n if (result.isTranslatable) {\n return t(result.strings);\n }\n\n return result.strings;\n };\n\n const getClassificationInfo = () => {\n const result: InfoString = {\n isTranslatable: true,\n strings: [\"\"],\n };\n if (alarm.eventAssessmentClass === EventAssessmentClass[EventAssessmentClass.Unknown]) {\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.PendingClassification\"];\n return result;\n }\n\n switch (alarm.eventClassification) {\n case EventClassification[EventClassification.L2HumanActivityNo]:\n // Only visible for sysadmins, so Ok with special string\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.L2HumanActivityNo\"];\n break;\n case EventClassification[EventClassification.L2HumanActivityUncertain]:\n // Only visible for sysadmins, so Ok with special string\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.L2HumanActivityUncertain\"];\n break;\n case EventClassification[EventClassification.L2HumanActivityYes]:\n // Visible for everyone, so no special string here.\n // We could show a special string here, like \"Gui.Manage.SiteEventsTable.Details.L2HumanActivityYes\"\n // only for sysadmins, if possible. But perhaps better to show this distinction in some other way.\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.HumanActivity\"];\n break;\n case EventClassification[EventClassification.FlameNo]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.FlameNo\"];\n break;\n case EventClassification[EventClassification.FlameYes]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.FlameYes\"];\n break;\n case EventClassification[EventClassification.LoiteringHumanActivityNo]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.LoiteringHumanActivityNo\"];\n break;\n case EventClassification[EventClassification.LoiteringHumanActivityYes]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.LoiteringHumanActivityYes\"];\n break;\n case EventClassification[EventClassification.Human]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.HumanActivity\"];\n break;\n case EventClassification[EventClassification.ViolentBehaviorNo]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.ViolentBehaviorNo\"];\n break;\n case EventClassification[EventClassification.ViolentBehaviorYes]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.ViolentBehaviorYes\"];\n break;\n case EventClassification[EventClassification.FallNo]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.FallNo\"];\n break;\n case EventClassification[EventClassification.FallYes]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.FallYes\"];\n break;\n case EventClassification[EventClassification.RailDefenderNo]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.RailDefenderNo\"];\n break;\n case EventClassification[EventClassification.RailDefenderYes]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.RailDefenderYes\"];\n break;\n case EventClassification[EventClassification.UnattendedObjectNo]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.UnattendedObjectNo\"];\n break;\n case EventClassification[EventClassification.UnattendedObjectYes]:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.UnattendedObjectYes\"];\n break;\n default:\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.NoHumanActivity\"];\n break;\n }\n\n return result;\n };\n\n const getEvaluationInfo = () => {\n const result: InfoString = {\n isTranslatable: true,\n strings: [\"\"],\n };\n if (alarm.eventAssessmentClass === EventAssessmentClass[EventAssessmentClass.Unknown]) {\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.PendingClassification\"];\n } else if (\n alarm.eventAssessmentClass === EventAssessmentClass[EventAssessmentClass.NoAssessmentNeeded] ||\n alarm.eventAssessmentClass === EventAssessmentClass[EventAssessmentClass.NoClassificationNeeded]\n ) {\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.NoEvaluationNeeded\"];\n } else if (!!alarm.decisionMakingDetails) {\n result.isTranslatable = false;\n result.strings = alarm.decisionMakingDetails\n .split(/\\r\\n/g)\n .filter((infoString) => infoString !== \"\" && infoString != null)\n .map((infoString, index) =>
{infoString}
);\n }\n return result;\n };\n\n const getMeasureInfo = () => {\n const result: InfoString = {\n isTranslatable: true,\n strings: [\"\"],\n };\n if (alarm.eventAssessmentClass === EventAssessmentClass[EventAssessmentClass.Unknown]) {\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.PendingClassification\"];\n } else if (alarm.eventAssessmentClass !== EventAssessmentClass[EventAssessmentClass.MeasureTaken]) {\n result.strings = [\"Gui.Manage.SiteEventsTable.Details.NoMeasureTaken\"];\n } else if (!!alarm.measureTakingDetails) {\n result.isTranslatable = false;\n result.strings = alarm.measureTakingDetails\n .split(/\\r\\n/g)\n .filter((infoString) => infoString !== \"\" && infoString != null)\n .map((infoString, index) =>
{infoString}
);\n }\n return result;\n };\n\n return (\n \n {alarm ? (\n
\n
\n {alarm?.videoUrl && alarm?.overlay ? (\n \n ) : (\n \n )}\n
\n
    \n
  • \n
    \n {alarm.siteEquipmentName}, {alarm.functionalityName}{\" \"}\n
    \n
    \n {formatDateTime(moment.utc(alarm.dtEvent), site.timeZone)}\n
    \n
  • \n
  • \n
    \n {t(\"Gui.Manage.SiteEventsTable.Details.Header.Classification\")}\n
    \n
    {findInfoString(getClassificationInfo())}
    \n
  • \n
  • \n
    \n {t(\"Gui.Manage.SiteEventsTable.Details.Header.Evaluation\")}\n
    \n
    {findInfoString(getEvaluationInfo())}
    \n
  • \n
  • \n
    \n {t(\"Gui.Manage.SiteEventsTable.Details.Header.Measure\")}\n
    \n
    {findInfoString(getMeasureInfo())}
    \n
  • \n
  • \n
    {t(\"Entities.EventReport.EventId\")}
    \n
    {alarm.friendlyId}
    \n
  • \n
\n
\n ) : (\n
{t(\"Entities.Alarm.AlarmNotFound\")}
\n )}\n
\n );\n};\n","import React, { Component } from \"react\";\nimport {\n createStyles,\n GridList,\n GridListTile,\n GridListTileBar,\n Theme,\n WithStyles,\n withStyles,\n} from \"@material-ui/core\";\nimport moment from \"moment-timezone\";\nimport { withRouter, RouteComponentProps } from \"react-router-dom\";\nimport { WithTranslation, withTranslation } from \"react-i18next\";\nimport { Alarm } from \"src/entities\";\nimport { apiUrl } from \"src/settings\";\nimport { Link, LazyLoadImage } from \"src/components\";\nimport { formatDateTime } from \"src/utils\";\n\nconst styles = (theme: Theme) =>\n createStyles({\n root: {\n simpleScroll: {},\n display: \"flex\",\n width: \"100%\",\n flexWrap: \"wrap\",\n justifyContent: \"space-around\",\n marginBottom: theme.spacing(3),\n },\n gridList: {\n flexWrap: \"nowrap\",\n width: \"100%\",\n \"*::-webkit-scrollbar-track\": {\n \"-webkit-box-shadow\": \"inset 0 0 6px rgba(0,0,0,0.3)\",\n borderRadius: \"10px\",\n backgroundColor: \"red !important\",\n },\n },\n gridListTile: {\n cursor: \"pointer\",\n },\n gridListTileInner: {\n width: \"160px\",\n height: \"120px\",\n borderRadius: \"10px\",\n \"&.selected\": {\n border: \"2px solid #fff\",\n \"& .image\": {\n margin: \"-2px\",\n },\n },\n \"& .image\": {\n backgroundPosition: \"center top\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"cover\",\n height: \"100%\",\n },\n },\n });\n\ntype OwnProps = {\n theme: Theme;\n alarms: Alarm[];\n selectedAlarmId?: string;\n timeZone: string;\n};\n\ntype Props = OwnProps & WithStyles & RouteComponentProps & WithTranslation;\n\nclass AlarmsGridListInternal extends Component {\n render() {\n const { classes } = this.props;\n const gridRef = React.createRef();\n\n return (\n
\n \n {this.props.alarms.map((alarm: any) => (\n \n {/* We should use image after fixing endpoint that returns one frame (or gif animation?) {alarm.detector} */}\n \n \n \n \n \n ))}\n \n
\n );\n }\n}\n\nexport const AlarmsGridList = withTranslation()(\n withStyles(styles, { withTheme: true })(withRouter(AlarmsGridListInternal)),\n);\n","import React, { useEffect, useState } from \"react\";\nimport {\n Box,\n FormControl,\n InputLabel,\n Card,\n CardContent,\n Typography,\n Select,\n MenuItem,\n LinearProgress,\n Fade,\n} from \"@material-ui/core/\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport moment, { Moment } from \"moment-timezone\";\nimport { RouteComponentProps, Switch, useHistory } from \"react-router-dom\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAlarms } from \"src/hooks/useAlarms\";\nimport { makeApiUrl } from \"src/utils\";\nimport { fetchWithIntercept } from \"src/services/fetchService\";\nimport { useAuth } from \"src/contexts/AuthStateContext\";\nimport { Alarm, AlarmOverlay, AlarmsPeriod, Site } from \"../../../entities\";\nimport { PropsRoute } from \"../../Core/PropsRoute\";\n\nimport { AlarmDetails } from \"./AlarmDetails\";\nimport { AlarmsGridList } from \"./AlarmsGridList\";\n\nimport \"./SiteAlarms.scss\";\n\ntype Props = {\n site: Site;\n} & RouteComponentProps;\n\nexport const SiteAlarms = (props: Props) => {\n const { location, match, site } = props;\n\n const { logout } = useAuth();\n\n const initialPeriod: AlarmsPeriod = \"Today\";\n const initialTo = moment.utc().tz(site.timeZone).endOf(\"day\");\n const initialFrom = moment(initialTo).startOf(\"day\");\n\n const [siteAlarmsUrl] = useState(match.url);\n const [alarmsPeriod, setAlarmsPeriod] = useState(initialPeriod);\n const [from, setFrom] = useState(initialFrom);\n const [to, setTo] = useState(initialTo);\n const [selectedAlarmId, setSelectedAlarmId] = useState(undefined);\n const [selectedAlarm, setSelectedAlarm] = useState(undefined);\n\n const { t } = useTranslation();\n const history = useHistory();\n const { alarms, alarmsIsLoading, alarmsHasError, changeDates } = useAlarms(site.id, from, to);\n\n const resetComponent = () => {\n history.push(siteAlarmsUrl);\n setSelectedAlarmId(undefined);\n setSelectedAlarm(undefined);\n };\n\n const updateSelectedAlarm = (alarm: Alarm) => {\n const fetchOverlay = async () => {\n const overlayResponse = await fetchWithIntercept(alarm.overlayUrl, \"GET\", logout, null, undefined, true);\n const overlayJson = (await overlayResponse.json()) as AlarmOverlay;\n return overlayJson;\n };\n\n if (alarm && !alarm.overlay && alarm.overlayUrl) {\n fetchOverlay()\n .then((alarmOverlay) => {\n alarm.overlay = alarmOverlay;\n setSelectedAlarm(alarm);\n })\n .catch((overlayError) => console.log(overlayError));\n } else {\n setSelectedAlarm(alarm);\n }\n };\n\n useEffect(() => {\n const alarmId = location.pathname.substring(match.url.length + 1);\n\n if (alarmId && alarmId.length) {\n setSelectedAlarmId(alarmId);\n const alarm = alarms?.find((_alarm) => _alarm.friendlyId === alarmId);\n\n if (alarm) {\n updateSelectedAlarm(alarm);\n } else {\n const loadSingleAlarm = async (_alarmId: string) => {\n const url = makeApiUrl(\n `/sites/${site.id}/events/${_alarmId}?generateVideoUrl=true&generateOverlayUrl=true`,\n );\n\n const alarmResponse = await fetchWithIntercept(url, \"GET\", logout);\n const alarmJson = await alarmResponse.json();\n updateSelectedAlarm(alarmJson);\n };\n\n loadSingleAlarm(alarmId).catch((alarmError) => console.error(alarmError));\n }\n }\n }, [location]);\n\n const onDateChanged = (e: React.ChangeEvent<{ value: unknown }>) => {\n resetComponent();\n\n const newPeriod = e.target.value as AlarmsPeriod;\n let newFrom: Moment | undefined;\n let newTo: Moment | undefined;\n\n switch (newPeriod) {\n case \"Today\":\n newTo = moment.utc().tz(site.timeZone).endOf(\"day\");\n newFrom = moment(newTo).startOf(\"day\");\n break;\n case \"Yesterday\":\n newTo = moment.utc().tz(site.timeZone).subtract(1, \"days\").endOf(\"day\");\n newFrom = moment(newTo).startOf(\"day\");\n break;\n case \"ThisWeek\":\n newTo = moment.utc().tz(site.timeZone).endOf(\"week\");\n newFrom = moment(newTo).startOf(\"week\");\n break;\n case \"LastWeek\":\n newTo = moment.utc().tz(site.timeZone).subtract(1, \"week\").endOf(\"week\");\n newFrom = moment(newTo).startOf(\"week\");\n break;\n case \"ThisMonth\":\n newTo = moment.utc().tz(site.timeZone).endOf(\"month\");\n newFrom = moment(newTo).startOf(\"month\");\n break;\n case \"LastMonth\":\n newTo = moment.utc().tz(site.timeZone).subtract(1, \"month\").endOf(\"month\");\n newFrom = moment(newTo).startOf(\"month\");\n break;\n case \"TwoMonthsAgo\":\n newTo = moment.utc().tz(site.timeZone).subtract(2, \"month\").endOf(\"month\");\n newFrom = moment(newTo).startOf(\"month\");\n break;\n default:\n newTo = undefined;\n newFrom = undefined;\n break;\n }\n\n if (newFrom && newTo) {\n setFrom(newFrom);\n setTo(newTo);\n setAlarmsPeriod(newPeriod);\n changeDates(newFrom, newTo);\n }\n };\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n {t(\"Entities.AlarmEvents.FilterPeriod\")}\n \n \n \n \n {!alarmsIsLoading && site.timeZone !== \"\" ? (\n \n {alarms && alarms?.length > 0 ? (\n \n ) : null}\n {alarmsHasError ? (\n \n {t(\"Entities.AlarmEvent.NoAlarmDataAvailable\")}\n \n ) : null}\n \n ) : (\n \n \n \n \n \n )}\n \n \n \n \n \n \n \n
\n );\n};\n","import moment from \"moment-timezone\";\nimport { useMemo } from \"react\";\nimport { ConfigurationGroup, Site, SiteDetails, VideoStream } from \"src/entities\";\nimport { apiUrl } from \"src/settings\";\nimport { useData } from \"./useData\";\n\nconst useSite = (siteId: string) => {\n const url = `${apiUrl}/sites/${siteId}/slim`;\n const { data: site, isLoading: siteIsLoading, hasError: siteHasError } = useData(url);\n return { site, siteIsLoading, siteHasError };\n};\n\nconst useVideoStreams = (siteId: string) => {\n const url = `${apiUrl}/sites/${siteId}/videostreams`;\n const { data: videoStreamList, isLoading: videoStreamsIsLoading, hasError: videoStreamsHasError } = useData<\n VideoStream[]\n >(url);\n\n const videoStreams = videoStreamList?.map((videoStream) => ({\n alarmZones: videoStream.alarmZones,\n id: videoStream.id,\n name: videoStream.name,\n dtLastImageUpdate: moment.utc(videoStream.dtLastImageUpdate).toDate(),\n periodicImageUploadStatus: videoStream.periodicImageUploadStatus,\n images: videoStream.images,\n latestImageUpdateStatus: videoStream.latestImageUpdateStatus,\n siteEquipmentName: videoStream.siteEquipmentName,\n index: videoStream.index,\n dtCreated: moment.utc(videoStream.dtCreated).toDate(),\n dtLastState: moment.utc(videoStream.dtLastState).toDate(),\n }));\n\n return { videoStreams, videoStreamsIsLoading, videoStreamsHasError };\n};\n\nconst useConfigurations = (siteId: string) => {\n const url = `${apiUrl}/sites/${siteId}/configurations/withSchedules`;\n const { data: configurations, isLoading: configurationsIsLoading, hasError: configurationsHasError } = useData<\n ConfigurationGroup[]\n >(url);\n return { configurations, configurationsIsLoading, configurationsHasError };\n};\n\nexport const useSiteDetails = (props: { siteId: string }) => {\n const { siteId } = props;\n const { site, siteIsLoading, siteHasError } = useSite(siteId);\n const { videoStreams, videoStreamsIsLoading, videoStreamsHasError } = useVideoStreams(siteId);\n const { configurations, configurationsIsLoading, configurationsHasError } = useConfigurations(siteId);\n\n const siteDetails = useMemo(() => {\n if (videoStreams && configurations && site) {\n return {\n site,\n configurationGroups: configurations,\n siteId,\n videoStreams,\n } as SiteDetails;\n }\n return undefined;\n }, [videoStreams, configurations, site]);\n\n return {\n siteDetails,\n siteDetailsIsLoading: videoStreamsIsLoading || configurationsIsLoading || siteIsLoading,\n siteDetailsHasError: videoStreamsHasError || configurationsHasError || siteHasError,\n };\n};\n","import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Card, CardContent, Typography } from \"@material-ui/core/\";\nimport moment from \"moment-timezone\";\nimport { formatDateTime } from \"../../../utils\";\n\ntype OwnProps = {\n videoStream: any;\n functionalities: any;\n timeZone: string;\n};\n\nexport const SiteOverviewVideoStream = (props: OwnProps) => {\n const { t } = useTranslation();\n const { videoStream, timeZone } = props;\n let ratio = \"100%\";\n if (videoStream.images.latest) {\n ratio = `${(videoStream.images.latest.height / videoStream.images.latest.width) * 100}%`;\n }\n return (\n
\n \n \n
\n {videoStream.siteEquipmentName}\n {videoStream.latestImageUpdateStatus === \"Success\" ? (\n \n {`${t(\"Gui.Common.LastUpdated\")} ${formatDateTime(\n moment(videoStream.dtLastImageUpdate),\n timeZone,\n )}`}\n \n ) : null}\n {videoStream.latestImageUpdateStatus === \"NotUploaded\" ? (\n \n {t(\"Gui.Manage.SystemTesting.NoImageUpdate\")}\n \n ) : null}\n
\n
\n
\n {videoStream.siteEquipmentName}\n \n {videoStream.alarmZones?.map((alarmZone, alarmZoneIndex) => {\n const { hexColor } = alarmZone.configurationGroup;\n const coords = alarmZone.polygon.map((polygon, polyIndex) => {\n const points = `${polygon.x * videoStream.images.latest.width},${\n polygon.y * videoStream.images.latest.height\n }`;\n return polyIndex === 0 ? `M${points}` : `L${points}`;\n });\n return (\n \n \n \n );\n })}\n \n
\n
\n
\n
\n
\n );\n};\n","import React from \"react\";\nimport { ConfigurationGroupSchedule } from \"src/entities/ConfigurationGroup\";\n\ntype Props = {\n schedule: ConfigurationGroupSchedule | null;\n};\n\nexport const Schedule = (props: Props) =>\n props.schedule ? (\n
\n {props.schedule &&\n props.schedule.weeklySchedule.daySchedules.map((a, index) => (\n
\n

{a.dayType}

\n
\n
\n {a.scheduleTimePeriods.map((period, timePeriodIndex) => (\n {`${period.startTime.substring(0, 5)} – ${period.stopTime.substring(0, 5)}`}

\n ))}\n
\n
\n ))}\n
\n ) : null;\n","import React from \"react\";\n\ntype Props = {\n instruction: string;\n};\n\nexport const Instructions = (props: Props) => (\n
\n {props.instruction?.split(\"\\n\").map((text, index) => (\n

\n {text}\n

\n ))}\n
\n);\n","import React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faChevronDown } from \"@fortawesome/pro-regular-svg-icons\";\nimport { ConfigurationGroup } from \"src/entities\";\nimport cx from \"classnames\";\n\nimport { Schedule } from \"./Schedule\";\nimport { Instructions } from \"./Instructions\";\n\ntype SiteOverviewConfigurationGroupProps = {\n configurationGroup: ConfigurationGroup;\n};\n\nexport const SiteOverviewConfigurationGroup = (props: SiteOverviewConfigurationGroupProps) => {\n const { t } = useTranslation();\n const { configurationGroup } = props;\n const [expanded, setExpanded] = useState(false);\n\n return (\n
\n \n
\n \n\n

\n {configurationGroup.name\n ? configurationGroup.name\n : t(`Entities.Default.DefaultConfigurationName`, {\n type: t(`Enums.ConfigurationGroupType.${configurationGroup.type}`),\n index: configurationGroup.index,\n })}\n

\n\n

\n {t(`Enums.ConfigurationGroupType.${configurationGroup.type}`)}\n

\n
\n\n {expanded && configurationGroup.schedule ? : null}\n\n {expanded && configurationGroup.instruction ? (\n \n ) : null}\n\n {\n setExpanded(!expanded);\n }}\n >\n Details\n \n \n
\n
\n );\n};\n","import React, { Component } from \"react\";\nimport { withRouter, RouteComponentProps } from \"react-router-dom\";\nimport { withTranslation, WithTranslation } from \"react-i18next\";\nimport {\n Container,\n Theme,\n Typography,\n withStyles,\n WithStyles,\n createStyles,\n List,\n ListItem,\n Fade,\n} from \"@material-ui/core/\";\n\nimport { fetchImageWithAccessToken } from \"src/utils\";\nimport { apiUrl } from \"src/settings\";\nimport { Site, SiteDetails } from \"src/entities\";\n\nimport { SiteOverviewVideoStream } from \"./SiteOverviewVideoStream\";\nimport { SiteOverviewConfigurationGroup } from \"./SiteOverviewConfigurationGroup\";\nimport \"./_configuration-groups.scss\";\nimport \"./_site-overview.scss\";\nimport \"./_video-stream-list.scss\";\n\nconst themedStyle = (theme: Theme) =>\n createStyles({\n siteOverviewListPrimary: {\n color: theme.palette.text.secondary,\n },\n siteOverviewListSecondary: {\n color: theme.palette.text.primary,\n },\n siteOverviewListSpacer: {\n background: theme.palette.divider,\n },\n });\n\ntype OwnProps = {\n site: Site;\n siteDetails: SiteDetails;\n siteDetailsIsLoading: boolean;\n theme: Theme;\n};\n\ntype Props = OwnProps & WithStyles & RouteComponentProps & WithTranslation;\n\nclass SiteOverviewInternal extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n imageUrl: \"\",\n };\n }\n componentDidMount() {\n const sub = fetchImageWithAccessToken(`${apiUrl}/sites/${this.props.site.id}/map/image.jpg`).subscribe(\n (response) => {\n sub.unsubscribe();\n this.setState((state) => ({\n ...state,\n imageUrl: response.url,\n }));\n },\n );\n }\n\n render() {\n const { classes, t } = this.props;\n return (\n
\n {this.props.site ? (\n \n
\n \n
\n \n \n \n \n \n {this.props.site.name}\n \n \n \n {t(\"Entities.TimeZone.TimeZone\")}\n
\n
\n \n {this.props.site.timeZone}\n
\n \n \n
\n \n
\n {!this.props.siteDetailsIsLoading && this.props.siteDetails ? (\n \n

{t(\"Entities.AlarmHandling.CamerasOnSite\")}

\n
\n {Object.values(this.props.siteDetails.videoStreams).map((videoStream: any) => {\n const { functionalities } = videoStream;\n if (videoStream) {\n return (\n \n );\n }\n return null;\n })}\n
\n\n

\n {t(\"Entities.ConfigurationGroup.ConfigurationGroups\")}\n

\n
\n {Object.values(this.props.siteDetails.configurationGroups)?.map(\n (configurationGroup: any) => {\n if (configurationGroup) {\n return (\n \n );\n }\n return null;\n },\n )}\n
\n
\n ) : null}\n \n ) : null}\n
\n );\n }\n}\n\nexport const SiteOverview = withTranslation()(\n withStyles(themedStyle, { withTheme: true })(withRouter(SiteOverviewInternal)),\n);\n","import React, { useEffect, useState } from \"react\";\n\nimport { Divider, Tabs, LinearProgress, Fade } from \"@material-ui/core/\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link, Redirect, RouteComponentProps, Switch } from \"react-router-dom\";\n\nimport { Site } from \"src/entities\";\nimport { useSiteDetails } from \"src/hooks/useSiteDetails\";\nimport { SiteAlarms } from \"./SiteAlarms\";\nimport { LinkTab, PropsRoute } from \"../Core\";\nimport { SiteOverview } from \"./SiteOverview\";\n\nimport \"./SiteDetails.scss\";\n\nexport const SiteDetails = (props: RouteComponentProps) => {\n const { location, match } = props;\n const [siteId] = useState((match.params as any).id);\n const [site, setSite] = useState(undefined);\n const [currentUrl] = useState(match.url);\n\n const { siteDetails, siteDetailsIsLoading, siteDetailsHasError } = useSiteDetails({ siteId });\n\n const { t } = useTranslation();\n\n const getActiveRoute = () => {\n let route = currentUrl;\n\n if (location.pathname.startsWith(`${route}/alarms`)) {\n route += \"/alarms\";\n }\n\n return route;\n };\n\n const [activeRoute, setActiveRoute] = useState(getActiveRoute());\n\n useEffect(() => setSite(siteDetails?.site), [siteDetails]);\n\n useEffect(() => {\n setActiveRoute(getActiveRoute());\n }, [match]);\n\n return (\n
\n
    \n
  • \n {t(\"Gui.Manage.SideMenu.Overview\")}\n
  • \n
  • {site?.name}
  • \n
\n \n \n \n \n \n \n \n \n {siteDetailsHasError ? (\n
{t(\"Error.Loading.Site\")}
\n ) : null}\n {site ? (\n \n \n \n \n \n ) : null}\n
\n );\n};\n","/* eslint-disable @typescript-eslint/no-floating-promises */\n// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL((process as { env: { [key: string]: string } }).env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service \" +\n \"worker. To learn more, visit https://bit.ly/CRA-PWA\",\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\",\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (response.status === 404 || (contentType != null && contentType.indexOf(\"javascript\") === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\"No internet connection found. App is running in offline mode.\");\n });\n}\n\nexport function unregister() {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister();\n });\n }\n}\n/* eslint-enable @typescript-eslint/no-floating-promises */\n","import jwtDecode from \"jwt-decode\";\nimport moment from \"moment-timezone\";\nimport { UserProfile } from \"src/entities\";\nimport { apiUrl } from \"src/settings\";\nimport { LoginDetails, LoginRequest, Profile, TokenResponse, TwoFactorAuthMode } from \"src/types\";\nimport { fetchWithIntercept } from \"./fetchService\";\n\ntype RawToken = {\n nbf: number;\n exp: number;\n iss: string;\n aud: string[];\n client_id: string;\n sub: string;\n auth_time: number;\n idp: string;\n email: string;\n scope: string[];\n amr: string[];\n};\n\nexport const updateUserProfile = async (patchDelta: Profile, logout: () => void) => {\n const url = `${apiUrl}/profile`;\n\n let response;\n\n try {\n response = await fetchWithIntercept(url, \"PATCH\", logout, patchDelta);\n } catch (error) {\n throw new Error(error as string);\n }\n\n if (!response.ok) {\n throw new Error(`Patch user failed with ${response.status}`);\n }\n\n const jsonResponse = await response.json();\n\n // Handle some proprietary error messages from API\n if (jsonResponse.errors) {\n let errorMessage = \"\";\n\n Object.entries(jsonResponse.errors).forEach(([, error]) => {\n errorMessage = (error as Array)[0];\n });\n\n throw new Error(errorMessage);\n }\n\n return jsonResponse;\n};\n\nexport const activate2fa = async (email: string, logout: () => void) => {\n const twoFactorUrl = `${apiUrl}/account/twoFactorAuthentication/activate?email=${email}`;\n\n try {\n await fetchWithIntercept(twoFactorUrl, \"GET\", logout);\n } catch (error) {\n throw new Error(`Activate 2fa error: ${error}`);\n }\n};\n\nexport const checkTwoFactorStatus = async (email: string, logout: () => void): Promise => {\n const url = `${apiUrl}/account/twoFactorAuthMode?email=${email}`;\n\n try {\n const response = await fetchWithIntercept(url, \"GET\", logout);\n const twoFactorResponse = await response.json();\n\n let userRequiresTwoFactor = false;\n\n const userAuthMode: TwoFactorAuthMode = twoFactorResponse;\n if (userAuthMode === TwoFactorAuthMode.GoogleAuthenticator) {\n userRequiresTwoFactor = true;\n }\n\n return userRequiresTwoFactor;\n } catch (error) {\n throw new Error(`Check 2fa error: ${error}`);\n }\n};\n\nexport const fetchUserProfile = async (logout: () => void) => {\n const url = `${apiUrl}/profile`;\n\n let response: Response;\n\n try {\n response = await fetchWithIntercept(url, \"GET\", logout);\n } catch (error) {\n throw new Error(`network error`);\n }\n\n if (!response.ok) {\n throw new Error(`getUserProfile failed with status ${response.status}`);\n }\n\n const profileResponse = (await response.json()) as UserProfile;\n return profileResponse;\n};\n\nexport const fetchToken = async (credentials: LoginRequest): Promise => {\n const url = `${apiUrl}/token`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json;charset=UTF-8\",\n },\n body: JSON.stringify(credentials),\n });\n\n if (!response.ok) {\n throw new Error(\"Login failed\");\n }\n\n const tokenResponse = (await response.json()) as TokenResponse;\n const rawToken = jwtDecode(tokenResponse.accessToken);\n\n const token: LoginDetails = {\n ...tokenResponse,\n accessTokenExpiresAt: moment.unix(rawToken.exp),\n email: rawToken.email,\n };\n return token;\n } catch (error) {\n throw new Error(`requestGetToken fails ${error}`);\n }\n};\n","import React, { FunctionComponent, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { checkTwoFactorStatus, fetchToken } from \"src/services/userProfileService\";\nimport { LoginDetails, LoginRequest } from \"src/types\";\nimport { getToken, storeToken } from \"src/utils\";\nimport { clearStorage } from \"src/utils/storage\";\nimport { AuthStateContext, AuthStateContextType } from \"./AuthStateContext\";\n\nexport const AuthStateContextProvider: FunctionComponent = ({ children }: any) => {\n const [auth, setAuth] = useState(getToken());\n const [authError, setAuthError] = useState(false);\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [requiresTwoFactorAuth, setRequiresTwoFactorAuth] = useState(false);\n const [twoFactorStatusError, setTwoFactorError] = useState(false);\n const history = useHistory();\n\n const logout = () => {\n clearStorage();\n setAuth(undefined);\n setIsLoggedIn(false);\n setRequiresTwoFactorAuth(false);\n history.replace(\"/login\");\n };\n\n const value: AuthStateContextType = {\n auth,\n authError,\n isLoggedIn,\n requiresTwoFactorAuth,\n twoFactorStatusError,\n checkTwoFactorStatus: async (email: string) => {\n try {\n const twoFactorStatus = await checkTwoFactorStatus(email, logout);\n setRequiresTwoFactorAuth(twoFactorStatus);\n } catch (e) {\n setTwoFactorError(true);\n }\n },\n logout,\n login: async (credentials: LoginRequest) => {\n try {\n const token = await fetchToken(credentials);\n\n setAuth(token);\n storeToken(token);\n setIsLoggedIn(true);\n } catch (e) {\n setAuthError(true);\n }\n },\n };\n\n return {children};\n};\n","import { useEffect, useState } from \"react\";\n\nfunction useDebounce(value: any, delay: number) {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nexport default useDebounce;\n","import React, { FunctionComponent, useEffect, useState } from \"react\";\nimport useDebounce from \"src/hooks/useDebounce\";\nimport { GlobalSearchContext, GlobalSearchContextType } from \"./GlobalSearchContext\";\n\n// eslint-disable-next-line react/prop-types\nexport const GlobalSearchContextProvider: FunctionComponent = ({ children }) => {\n const [term, setTerm] = useState(\"\");\n const [debounceTerm, setDebounceTerm] = useState(\"\");\n\n const debouncedSearch = useDebounce(debounceTerm, 300);\n\n useEffect(() => {\n setTerm(debounceTerm);\n }, [debouncedSearch]);\n\n const value: GlobalSearchContextType = {\n globalSearchTerm: term,\n debounceTerm,\n setGlobalSearchTerm: (t: string) => setDebounceTerm(t.toLocaleLowerCase()),\n clearGlobalSearchTerm: () => setTerm(\"\"),\n };\n\n return {children};\n};\n","import { createMuiTheme, Theme } from \"@material-ui/core\";\nimport * as Colors from \"@material-ui/core/colors\";\nimport { darken } from \"@material-ui/core/styles\";\n\nexport const theme: Theme = createMuiTheme({\n palette: {\n background: {\n default: Colors.grey[900],\n paper: Colors.grey[800],\n },\n primary: Colors.blue,\n type: \"dark\",\n },\n overrides: {\n MuiAppBar: {\n colorPrimary: {\n backgroundColor: darken(Colors.grey[800], 0.3),\n color: Colors.grey[400],\n },\n },\n MuiPaper: {\n root: {\n marginBottom: \"16px\",\n },\n },\n },\n});\n","import React, { FunctionComponent, useEffect, useState } from \"react\";\nimport { isEmpty } from \"lodash\";\nimport { activate2fa, fetchUserProfile, updateUserProfile } from \"src/services/userProfileService\";\nimport { Profile, SaveDataTransferStatus } from \"src/types\";\nimport { getUserProfile, PatchDelta, storeUserProfile } from \"src/utils\";\nimport { useAuth } from \"./AuthStateContext\";\nimport { UserProfileContext, UserProfileContextType } from \"./UserProfileContext\";\n\nexport const UserProfileContextProvider: FunctionComponent = ({ children }: any) => {\n const [userProfile, setUserProfile] = useState(getUserProfile());\n const [saveProfileStatus, setSaveProfileStatus] = useState({\n isLoading: false,\n hasError: false,\n errorMessage: \"\",\n });\n const { auth, isLoggedIn, logout } = useAuth();\n\n useEffect(() => {\n const fetchAndSetUser = async () => {\n const profile = await fetchUserProfile(logout);\n setUserProfile(profile);\n storeUserProfile(profile);\n };\n\n if (isLoggedIn && auth?.accessToken) {\n fetchAndSetUser().catch(console.error);\n }\n }, [auth, isLoggedIn]);\n\n const value: UserProfileContextType = {\n saveProfileStatus,\n userProfile,\n updateUserProfile: async (updatedProfile: Profile) => {\n if (userProfile) {\n try {\n const patchDelta = PatchDelta.difference(userProfile, updatedProfile);\n let profileResponse;\n\n if (!isEmpty(patchDelta)) {\n setSaveProfileStatus({\n isLoading: true,\n hasError: false,\n errorMessage: \"\",\n });\n\n profileResponse = await updateUserProfile(patchDelta, logout);\n\n setUserProfile(profileResponse);\n storeUserProfile(profileResponse);\n\n setSaveProfileStatus({\n isLoading: false,\n hasError: false,\n errorMessage: \"\",\n });\n }\n\n if (patchDelta.enableTwoFactorAuth) {\n await activate2fa(userProfile.email, logout);\n }\n } catch (error) {\n const errorMessage = (error as Error).message;\n\n setSaveProfileStatus({\n isLoading: false,\n hasError: true,\n errorMessage,\n });\n // throw new Error(`Patch user profile error: ${error}`);\n }\n } else {\n throw new Error(\"UserProfile is undefined\");\n }\n },\n };\n\n return {children};\n};\n","import \"react-app-polyfill/ie11\";\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport \"core-js/es/array\";\nimport \"core-js/es/string\";\nimport \"core-js/es/object\";\nimport \"core-js/es/function/name\";\nimport \"core-js/es/number\";\n/* eslint-enable import/no-extraneous-dependencies */\nimport React, { Suspense } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Router } from \"react-router-dom\";\nimport { createBrowserHistory } from \"history\";\n/* eslint-disable import/no-extraneous-dependencies */\nimport moment from \"moment-timezone\";\nimport \"moment/locale/nb\";\nimport \"moment/locale/sv\";\n/* eslint-enable import/no-extraneous-dependencies */\nimport { CssBaseline, LinearProgress } from \"@material-ui/core\";\nimport { MuiThemeProvider, StylesProvider } from \"@material-ui/core/styles\";\nimport { App } from \"./components\";\nimport * as serviceWorker from \"./serviceWorker\";\nimport { initLanguageHandling } from \"./utils/i18n\";\nimport { getUserLanguage, getUserLocale } from \"./utils/storage\";\nimport { AuthStateContextProvider } from \"./contexts/AuthStateContextProvider\";\nimport { GlobalSearchContextProvider } from \"./contexts/GlobalSearchContextProvider\";\n\nimport \"./styles/app.scss\";\nimport \"typeface-roboto\";\nimport { theme } from \"./styles/theme\";\nimport { UserProfileContextProvider } from \"./contexts/UserProfileContextProvider\";\n\ninitLanguageHandling(getUserLanguage());\nmoment.locale(getUserLocale());\n\nexport const history = createBrowserHistory();\n\nReactDOM.render(\n \n \n \n \n \n }>\n \n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById(\"root\"),\n);\n\n// if you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}