{"version":3,"sources":["theme/assets/chevron-right.svg","components/map/widgets/Popup/Popup.tsx","components/map/widgets/Popup/Popup.render.tsx","theme/assets/map-markers/dot_streetlight-selected.svg","theme/assets/map-markers/dot_extended-repair-selected.svg","theme/assets/map-markers/dot_reported-selected.svg","theme/assets/map-markers/dot_non-ce-selected.svg","components/map/Map.utils.ts","components/button/Button.styles.ts","state-management/utils/dispatch-logger/DispatchLogger.ts","shared/enums/search.enums.ts","theme/typography/font-sizes.ts","theme/index.ts","theme/layout/properties.ts","theme/utils/Font.utils.ts","theme/utils/Breakpoint.utils.ts","api/utils.api.ts","api/api.service.ts","shared/utils/data.utils.ts","state-management/slices/version/version.slice.ts","state-management/root-reducer.ts","state-management/store.ts","theme/colors/Colors.palette.ts","components/icon/Icon.styles.ts","components/icon/streetlight-icon/CobraIcon.tsx","components/icon/streetlight-icon/HangingIcon.tsx","components/icon/streetlight-icon/DecorativeIcon.tsx","components/icon/streetlight-icon/StreetlightIcon.component.tsx","shared/utils/testing.utils.ts","components/map/widgets/Popup/Popup.styles.ts","../node_modules/@stencil/core/internal/client lazy /^/.*/.entry/.js.*$/ include: /.entry/.js$/ exclude: /.system/.entry/.js$/ groupOptions: {} namespace object","components/header/Header.styles.ts","components/logo/Logo.types.ts","components/logo/DesktopLogo.component.tsx","components/logo/MobileLogo.component.tsx","components/header/Header.component.tsx","components/header/Header.types.ts","components/layout/BaseLayout.component.tsx","views/View.styles.ts","theme/assets/map-controls/zoom_in.svg","theme/assets/map-controls/zoom_out.svg","theme/assets/map-controls/location_on.svg","theme/assets/map-controls/location_off.svg","theme/assets/map-controls/search.svg","theme/assets/map-controls/cancel_dark.svg","components/map/Map.styles.ts","shared/constants/logging.constants.ts","components/map/widgets/LocationWidget.ts","components/map/widgets/ZoomWidget.ts","components/map/widgets/SearchWidget.ts","theme/assets/pin-mode-marker.svg","shared/enums/outage.enums.ts","components/map/FeatureLayer.service.ts","components/map/BaseMap.service.ts","components/alert/Alert.styles.ts","components/alert/Alert.types.ts","components/alert/GenericAlert.component.tsx","components/alert/AlertList.component.tsx","components/map/widgets/Legend/Legend.styles.tsx","components/map/widgets/Legend/Legend.component.tsx","theme/assets/map-controls/add_light_new.svg","theme/assets/map-controls/plus.svg","theme/assets/map-controls/check_status.svg","theme/assets/map-controls/layers.svg","theme/assets/map-controls/close.svg","components/button/Button.types.ts","components/button/Button.component.tsx","components/loading/LoadingOverlay.styles.ts","components/loading/LoadingOverlay.animations.ts","components/loading/LoadingOverlay.component.tsx","components/loading/LoadingOverlay.types.ts","components/form/Form.constants.ts","components/form/Form.utils.ts","state-management/slices/outages/outages.thunk.ts","shared/services/Auth.service.entra.ts","components/map/BaseMap.component.tsx","components/admin/AdminPanel.styles.ts","components/pagination/Pagination.types.ts","components/pagination/Pagination.styles.ts","components/pagination/Pagination.component.tsx","components/admin/DroppedPinList.component.tsx","components/admin/AdminPanel.types.ts","components/admin/AdminPanel.component.tsx","components/form/Form.styles.ts","components/form/Form.service.ts","components/form/ImageUpload.service.ts","theme/assets/successful-submit-icon.svg","components/form/submit-outage/FormConfirmation.component.tsx","components/form/bracket-type-selector/BracketTypeSelector.styles.ts","components/form/bracket-type-selector/BracketTypeSelector.utils.ts","components/form/bracket-type-selector/BracketTypeSelector.component.tsx","components/form/submit-outage/OutageForm.component.tsx","components/form/Form.animations.ts","components/form/Form.types.ts","components/form/outage-search/views/SearchForm.component.tsx","components/form/outage-search/OutageSearch.styles.ts","theme/assets/exclamation.svg","components/form/outage-search/views/SearchResults.component.tsx","components/form/outage-search/OutageSearch.component.tsx","components/drawer/Drawer.animations.ts","components/drawer/Drawer.styles.ts","theme/assets/drawer-controls/cancel.svg","theme/assets/drawer-controls/back.svg","components/drawer/Drawer.component.tsx","components/drawer/Drawer.types.ts","components/modal/Modal.types.ts","components/modal/Modal.styles.ts","components/modal/PinMode.modal.tsx","components/modal/OutageNotFound.modal.tsx","components/modal/outage-reconciliation/OutageReconciliation.styles.ts","shared/styled-components/buttons.ts","components/modal/outage-reconciliation/AcceptPane.component.tsx","components/modal/outage-reconciliation/RejectPane.component.tsx","components/modal/outage-reconciliation/OutageReconciliation.modal.tsx","state-management/localStorage/UIMessages.ts","state-management/localStorage/LocalStorage.ts","views/Map.view.tsx","shared/hooks/useQuery.ts","components/dashboard/Dashboard.styles.ts","components/dashboard/Dashboard.utils.ts","components/dashboard/Dashboard.component.tsx","views/Dashboard.view.tsx","App.tsx","api/constants/urls.constants.ts","api/constants/error.constants.ts","state-management/utils/state/outages.utils.ts","theme/assets/map-markers/dot_streetlight.svg","theme/assets/map-markers/dot_reported.svg","theme/layout/breakpoints.ts","state-management/slices/lookups/lookups.slice.ts","theme/assets/map-markers/dot_extended-repair.svg","theme/assets/map-markers/dot_non-ce.svg","theme/utils/AppMedia.ts","api/config.api.ts","state-management/slices/global/global.slice.ts","api/mock/data/logs.ts","shared/services/Logging.service.ts","components/map/Map.constants.ts","shared/enums/utility.enums.ts","state-management/slices/outages/outages.slice.ts","index.tsx","shared/enums/logging.enums.ts"],"names":["getStreetlightLabel","bracketTypeData","pinMode","routing","enabled","selectedOutage","bracketType","utility","EBracketTypes","OTHER","UNKNOWN","getBracketTypeDisplayLabel","renderHeader","markerAttributes","address","markerStatus","GISID","className","EMarkerStatuses","COMPLETED","renderContent","reportedDate","sapNotificationId","dispatch","sendDataToGTM","layerId","appConfig","REPORTED","IN_PROGRESS","ReportedContainer","EXTENDED_REPAIR","NON_CE","esriGrandRapidsLayerId","href","ButtonContainer","LinkButton","onClick","event","preventDefault","updateDrawerState","category","action","label","title","src","Chevron","alt","Popup","onClose","useDispatch","useGTMDispatch","useSelector","state","globalState","ui","hasOutage","setHasOutage","useState","isExtendedRepair","setIsExtendedRepair","isNonCE","setIsNonCE","useEffect","MainContainer","IconContainer","type","reported","bgFill","ColorsPalette","MapMarkers","extendedRepairStroke","nonCEStroke","ContentContainer","justify","CloseButton","height","width","renderPopup","props","node","document","createElement","ReactDOM","id","theme","Theme","CE_THEME","store","fetchCrossStreets","async","xStreetResponse","axios","get","LOCATOR_URL","params","location","geometry","featureTypes","f","then","response","catch","errors","data","error","fetchGeoLocData","geoLocResponse","all","mapPoint","spread","streetNameResponse","streetAddressResponse","pointAddressResponse","buildStreetAddressString","addressResponse","Address","City","Region","streetAddress","buildGeoLocPayload","xStreetsResponse","geoLocPayload","isNullOrUndefined","crossStreets","includes","getLocationError","locationError","code","PERMISSION_DENIED","POSITION_UNAVAILABLE","TIMEOUT","message","ELocationServicesErrorMessages","displayMessage","getPointLatLong","latitude","longitude","x","y","getPinModePopupContent","mapView","removePinModeGraphics","lampType","popup","close","getGrandRapidsPopupContent","featureLayerID","graphic","feature","layer","updateMarkerGeoLoc","LampTypeDisplayMap","UNK","COBRA","graphics","removeAll","getPopupContent","getGlobalState","sourceLayer","ESRI_ATTRIBUTES","attributes","selectedMarker","streetLightData","outagesState","getOutagesState","outageCollection","Object","values","forEach","outage","locationId","coordinates","LATITUDE","LONGITUDE","reportedDateString","Date","reportedDateTime","sapNotification","Intl","DateTimeFormat","timeStyle","dateStyle","format","LAMPTYPE","FIXTURESUP","getRoutingPopupContent","removeMapViewGraphics","getMarkerByStatus","selected","symbol","PictureMarkerSymbol","url","SelectedReportedMarker","ReportedMarker","SelectedExtendedRepairMarker","ExtendedRepairMarker","SelectedNonCEMarker","NonCEMarker","SelectedStreetlightMarker","StreetlightMarker","processExtent","currentExtent","apiService","dispatchLogger","featureLayerService","outages","outagesApi","getOutagesByExtent","fire","getOutagesSuccess","ELogTypes","API","fetchFeatureLayer","getOutagesFailed","ERROR","projectLatLngFromExtent","extent","projection","SpatialReference","wkid","renderLocationButtonIcon","locateIcons","getElementsByClassName","length","classList","value","CESoarButton","styled","Button","fontFamilies","semiBold","colors","essential","buttonGreen","white","cta","primary","div","button","brand","DispatchLogger","constructor","testId","loggingService","this","LoggingService","getInstance","instance","getTestId","payload","log","logMessage","ESearchWizardSteps","fontSizes","large","base","small","smallest","namespace","alerts","Colors","Alerts","Brand","CTA","grays","Grays","Essential","mapMarkers","breakpoints","regular","layoutProperties","outageDrawerWidth","headerHeight","logoWidthDesktop","logoWidthMobile","utils","getFontThemeSize","key","increaseFontSize","size","decreaseFontSize","getThemeBreakpoint","browserUtils","isEdge","isMobile","isFirefox","isSamsungBrowser","isMobileSafari","EApiTypes","EEnvironments","apiName","endpoint","LOOKUPS","LOOKUPS_ENDPOINT","OUTAGES","OUTAGES_ENDPOINT","SEARCH_OUTAGES","SEARCH_OUTAGES_ENDPOINT","ADMIN_OUTAGES","ADMIN_OUTAGES_ENDPOINT","VERSION","VERSION_ENDPOINT","testHttpError","ApiService","_appConfig","_lookupsApi","_outagesApi","_versionApi","lookupsAxiosInstance","outagesAxiosInstance","versionAxiosInstance","getBaseAPIUrl","baseURL","apiUrl","getBaseUrl","replace","buildAxiosInstance","create","headers","apimSubscriptionKey","initLookupsApi","getLookups","method","APIUtils","initOutagesApi","getOutageById","outageId","latLongExtent","MapUtils","top_left_lat","ymin","top_left_long","xmax","bottom_right_lat","ymax","bottom_right_long","xmin","Promise","reject","submitOutage","hasImage","fileData","searchOutages","searchTerm","page_size","page_number","searchvalue","searchAdminOutages","authState","getState","auth","entraAuthState","token","accessToken","Authorization","updateAdminOutage","completedReason","updatePayload","initVersionApi","getVersion","initializeAPIs","lookupsApi","versionApi","getKeyByValue","object","keys","find","obj","versionSlice","createSlice","name","initialState","version","versionError","reducers","getVersionSuccess","getVersionFailed","actions","rootReducer","combineReducers","globalReducer","lookups","lookupReducer","outagesReducer","versionReducer","configureStore","reducer","secondary","tertiary","quaternary","quinary","undefined","senary","septenary","octonary","black","grayDark","grayLight","extendedRepairFill","nonCEFill","StreetlightIcon","svg","COBRA_ICON","fill","xmlns","viewBox","cx","cy","r","stroke","d","HANGING_ICON","strokeLinecap","strokeWidth","strokeMiterlimit","DECORATIVE_ICON","x1","y1","x2","y2","strokeLinejoin","points","STREETLIGHT_ICON","BracketTypeDisplayMap","COB","PT","POST_TOP","CS","CENTER_SUSPENSION","renderIcon","webpackEmptyAsyncContext","req","resolve","e","Error","module","exports","Header","header","LogoColumn","Col","TitleColumn","DefaultLogoProps","color","DESKTOP_LOGO","style","transform","renderLogo","defaultProps","MOBILE_LOGO","Media","AppMedia","HEADER","lessThan","Container","fluid","Row","xs","greaterThanOrEqual","BASE_LAYOUT","children","ViewContainer","MapContainer","BasemapGalleryContainer","SearchContainer","SearchIcon","CancelIcon","LocationContainer","LocationOnIcon","LocationOffIcon","ZoomContainer","ZoomInIcon","ZoomOutIcon","PinModeContainer","BasemapToggleContainer","SearchOutagesContainer","AdminFooterContainer","consoleSuccessStyle","LocationWidget","locatorTask","locate","Locator","buildLocationWidget","Locate","container","view","useHeadingEnabled","iconClass","goToOverride","options","target","scale","goTo","add","position","index","console","info","getLocate","getLocatorTask","getUserLocation","userLocation","timestamp","lat","coords","lng","updateUserLocation","updateUserLocationError","ZoomService","zoomWidget","buildZoomWidget","Zoom","getZoomWidget","SearchWidget","searchWidget","buildSearchWidget","Search","minSuggestCharacters","popupEnabled","locationEnabled","watch","ctrl","placeholder","on","result","resultData","toJSON","SEARCH","getSearchWidget","ECompletedReasons","FeatureLayerService","map","locationWidget","pinModeLayer","streetlightLayer","restrictedLayer","grandRapidsLayer","saginawLayer","jacksonLayer","streetlightFields","streetLightRenderer","pinModeRenderer","grandRapidsRenderer","saginawRenderer","jacksonRenderer","streetlightSpatialReference","overlayLayer","streetlightSymbol","reportedSymbol","extendedRepairSymbol","nonCESymbol","pinModeSymbol","overlayFill","featureLayerURL","restrictedLayerURL","grandRapidsLayerID","grandRapidsLayerURL","saginawLayerId","saginlayerURL","jacksonLayerId","jacksonlayerURL","restrictedLayerID","queryTask","APIService","queryFeatures","createQuery","results","features","applyEdits","deleteFeatures","removeNonCEGraphics","nonCELights","marker","DOES_NOT_EXIST","push","fadeOverlay","opacity","overlay","finalOpacity","mapInstance","animating","currentOpacity","incrementOpacityByFrame","remove","requestAnimationFrame","whenLayerView","layerView","watchUtils","updating","renderRoutingPopup","gisOutageData","outageData","Point","open","content","updateFeatureLayer","droppedPins","updates","droppedPinUpdates","filter","pin","Graphic","concat","addFeatures","finally","routeNavigationComplete","routingRoutineComplete","gisOutage","updateMarkerData","setRoutingRoutineComplete","addMarker","markerData","updatePin","Query","returnGeometry","returnExceededLimitFeatures","outFields","orderByFields","where","execute","featureSet","getFeatureById","gisID","esriStreetlightLayerId","esriRestrictedLayerId","esriSaginawLayerId","esriJacksonLayerId","esriRestrictedFeatureLayerUrl","esriGrandRapidsLayerUrl","esriSaginawLayerUrl","esriJacksonLayerUrl","esriFeatureLayerUrl","QueryTask","buildPopup","buildSymbolMarkers","buildStreetlightRenderer","buildGrandRapidsRenderer","buildSaginawRenderer","buildJacksonRenderer","buildPinModeRenderer","alignment","autoCloseEnabled","spinnerEnabled","StreetLightMarker","ReportedStreetLightMarker","outline","PinModeMarker","UniqueValueRenderer","field","defaultSymbol","uniqueValueInfos","SimpleRenderer","buildOverlayLayer","polygonGraphic","rings","GraphicsLayer","OVERLAY_LAYER_ID","addOverlayLayer","removeOverlayLayer","buildRestrictedLayer","FeatureLayer","setRestrictedLayerInitialized","buildGrandRapidsLayer","buildSaginawLayer","buildJacksonLayer","OUT_FIELDS","minScale","MIN_SCALE","renderer","geometryType","popupTemplate","setGrandRapidsLayerInitialized","setSaginawLayerInitialized","setJacksonLayerInitialized","buildFeatureLayer","currentState","fields","spatialReference","source","setFeatureLayerInitialized","parseInt","routeOutage","centerMapToLocation","setOutageNotFound","PIN_MODE_LAYER_ID","num","center","setRoutingOutage","getStreetlightsLayer","getPinModeLayer","getRestrictedLayer","getGrandRapidsLayer","BaseMapService","streetlightsLayer","basemapGallery","mapViewLoadComplete","queryFeatureLayer","mapViewMoveComplete","mapViewLoadErrorHandler","reason","mapViewPointerMovedHandler","hitTest","getElementById","pinModeEnabled","cursor","mapViewClickHandler","include","streetlightMarkers","grandRapidsMarkers","stopPropagation","array","selectionGraphic","eventLabel","EGoogleEventTypes","MAP_MARKER_CLICKED","getCurrentExtent","getFeatureLayerService","buildMap","Map","basemap","initializeMapView","mapContainer","basemapGalleryContainer","warn","MapView","current","DEFAULT_CENTER_POINT","zoom","DEFAULT_ZOOM_LEVEL_MOBILE","DEFAULT_ZOOM_LEVEL_DESKTOP","constraints","rotationEnabled","minZoom","maxZoom","highlightOptions","fillOpacity","haloOpacity","components","buildWidgets","initializeFeatureLayerService","addHandlers","when","setBaseMapInitialized","BasemapGallery","Basemap","fromId","visible","getMapView","getMap","openBasemapGallery","closeBasemapGallery","getLocationWidget","AlertList","ul","GenericAlert","Alert","variant","AlertContentContainer","GENERIC_ALERT","enabletestid","testid","dismissible","sm","ALERT_LIST","outagesError","locationServicesError","locationServices","lookupCollectionError","clearLocationError","clearOutageError","clearLookupsError","LegendContainer","LEGEND","Image","NotReportedIcon","ReportedIcon","ExtendedRepairIcon","NonCEIcon","BUTTON","disabled","renderButton","LoadingOverlayContainer","LoadingIconContainer","LOADING_OVERLAY","loadingTimeline","anime","timeline","easing","loop","overlayTimeline","containerTimeline","targets","duration","complete","delay","startLoadingAnimation","show","FeedbackMessages","additionalDetailsMax","nameMin","nameMax","nameMatch","nameRequired","phoneMax","phoneMatch","phoneRequired","emailMax","emailMatch","emailRequired","dropdownOptionRequired","bracketTypeRequired","searchTextRequired","adminGisIdRequired","emojisRestricted","InitialValues","outageFormDropdown","outageFormComments","outageFormName","outageFormPhone","outageFormEmail","outageFormBracketType","InitialSearchValues","searchFormText","InitialAcceptOutageValues","acceptOutageFormGISID","phoneRegExp","nameRegExp","commentsRegExp","outageSchema","yup","shape","min","FormConstants","max","matches","required","email","pinModeSchema","searchSchema","acceptOutageSchema","getBlobFromDataURI","dataURI","byteString","atob","split","mimeType","ab","ArrayBuffer","ia","Uint8Array","i","charCodeAt","Blob","getDataUriFromBlob","blob","callback","fr","FileReader","onload","readAsDataURL","getBlobSizeInMB","fetchAdminOutages","pageSize","pageNumber","setIsAdminLoading","isAxiosError","axiosError","ErrorConstants","GENERIC_ERROR_MESSAGE","adminOutagesFailed","adminOutagesSuccess","baseMapService","gisFeature","mergedPayload","county","COUNTY","contractAccountNumber","CONTRACT_A","township","TOWNSHIP","trs","TRS","getLampTypeLabel","wattage","WATTAGE","toString","updateAdminOutagesFailed","setShowAdminModal","AuthSericeEntra","msalInstance","tenantId","azureTenantId","clientId","azureClientId","scope","azureScope","accounts","getAllAccounts","account","setActiveAccount","loginRequest","scopes","loginRedirect","err","history","basename","window","origin","createHref","pathname","logout","postLogoutRedirectUri","updateAdminModeState","setLoggedIn","BASE_MAP","useMsal","useRef","useHistory","authService","isAuthenticated","useIsAuthenticated","baseMapInitialized","featureLayerInitialized","restrictedLayerInitialized","grandRapidsLayerInitialized","loading","pinModeActive","setPinModeActive","basemapToggleActive","setBasemapToggleActive","locationContainerClassname","locationDisabled","setLoading","ref","setPinMode","buildPinModeLayer","togglePinMode","updatePinModeState","PinModeIcon","PlusIcon","CloseIcon","LayersIcon","updateSearchModeState","CheckStatusIcon","loggedIn","signOut","AdminPanelContainer","DroppedPinListContainer","DroppedPinListItem","ListGroup","Item","NoResultsContainer","PaginationContainer","renderPageItems","pages","currentPage","navPageNumber","Pagination","active","Array","from","_","PAGINATION","totalCount","setPages","pageNumbers","Math","ceil","First","Prev","Next","Last","renderListItems","setSelectedOutageAdminMode","city","DROPPED_PIN_LIST","adminOutages","isLoading","pagination","Spinner","animation","ADMIN_PANEL","FormContainer","FormGroup","Form","Group","FormControl","Control","FormLabel","Label","FormHeading","FormSubmitContainer","FormConfirmationContainer","ConfirmationIcon","ConfirmationHeading","ConfirmationReport","FormService","submitFormActions","searchFormActions","formikReference","resetForm","setFormikReference","submitOutageReport","formValues","formActions","setIsLoading","setSubmitting","imageUpload","buildSubmitPayload","imgDataUrl","submitOutagesFailed","imageUploadUri","blockBlobClient","BlobServiceClient","getContainerClient","getBlockBlobClient","imageBlob","FormUtils","upload","submitOutagesSuccess","submittedLabel","outageReason","searchOutagesFailed","searchOutagesSuccess","updateSearchView","RESULTS","getValidationSchema","searchMode","getReportedDate","toLocaleDateString","getReportedTime","toLocaleTimeString","ImageUploadService","processImageUpload","uploadEvent","reader","file","files","imageUploadService","setImageProcessing","ev","compressedFile","endsWith","heic2any","toType","imageCompression","maxSizeMB","fileType","lastModified","dataUrl","setImageDataUrl","setFileData","renderMessage","FORM_CONFIRMATION","submittedOutage","imageUploadState","formService","SuccessfulSubmitIcon","comments","BracketTypeSelector","selectedIconId","BRACKET_TYPE_SELECTOR","setSelectedIcon","onChange","selectedBracketType","parentElement","previousValue","newValue","setPinBracketType","BracketTypeSelectorUtils","OUTAGE_FORM","showSubmittedError","setShowSubmittedError","lookupCollection","validationSchema","showSafetyTooltip","renderOptions","endDelay","submitOutageError","pause","began","backgroundColor","ThemeKit","outageReasons","faker","datatype","uuid","isSubmitted","innerRef","initialValues","onSubmit","handleSubmit","handleChange","handleBlur","setFieldValue","touched","isValid","noValidate","as","Feedback","display","onBlur","controlId","OverlayTrigger","trigger","placement","Popover","PopoverBody","setShowSafetyTooltip","onToggle","nextShow","imageProcessing","htmlFor","accept","clearImageData","allowEmptyFormatting","mask","customInput","FormStyles","onValueChange","floatValue","Heading","DefaultOutageSearchProps","activeView","OUTAGE_SEARCH_FORM","searchedOutages","searchText","setSearchTerm","SearchResultsList","ResultsListItem","li","ResultsContainer","ResultsContent","renderNotificationId","getStatusClassNames","reportedStatus","getMarkerStatusLabel","renderNoResults","ExclamationIcon","clearSearchTerm","setSearchView","OUTAGE_SEARCH_RESULTS","getMarkerStatusFlag","streetlightType","OUTAGE_SEARCH","currentView","ClickSheild","DrawerContainter","DrawerHeader","renderTitleContainer","adminMode","titleClassName","renderCloseButtonContainer","renderBackButtonContainer","clearSearchedOutages","BackIcon","renderDrawer","DRAWER","isDrawerOpen","clickShieldClassname","drawerContainerClassname","localDrawerState","setLocalDrawerState","openTimeline","translateY","begin","shield","querySelector","translateX","openDrawer","closeTimeline","changeComplete","clearSubmittedOutage","closeDrawer","DefaultModalProps","centered","LocationModal","Modal","NotFoundModal","OutageReconciliationModal","PinModeModal","LocationModalHeader","NotFoundModalHeader","PinModeModalHeader","PIN_MODE_MODAL","setShow","handleClose","dialogClassName","backdrop","keyboard","onHide","Title","Body","Footer","OUTAGE_NOT_FOUND_MODAL","AdminModalPane","Tab","Pane","GENERIC_BUTTON_STYLES","BlueSecondaryButton","RedPrimaryButton","ACCEPT_PANE","REJECT_PANE","radioGroupValue","setRadioGroupValue","checked","OUTAGE_RECONCILIATION_MODAL","contact","contacts","mobilePhone","closeButton","rel","defaultActiveKey","Nav","Link","eventKey","Content","EMessages","UIMessages","getStorage","localStorage","storage","getItem","set","setItem","clearItem","removeItem","clearItems","super","getPinModeAccepted","PIN_MODE_ACCEPTED","setPinModeAccepted","pinModeAccepted","clear","onDrawerCloseClick","uiState","clearSelectedMarker","MAP_VIEW","query","URLSearchParams","useLocation","search","messagesLocalStorage","authServiceEntra","showPinModeModal","setShowPinModeModal","tokenParsed","setTokenParsed","outageNotFound","adminModeQuery","outageIdQuery","loggedInQuery","originatorQuery","originatorQueryUppercase","callbackCodeQuery","callbackStateQuery","JSON","parse","signin","pinModeAcceptedState","setOriginatorFlag","setRoutingOutageId","accessTokenRequest","acquireTokenSilent","roles","stringify","idTokenClaims","findIndex","indexOf","setEntraAuthstate","showAdminModal","DashboadContainer","poiResponse","DASHBOARD","formData","updateFormData","geoLocResults","setGeoLocResults","pointAddress","xStreets","poi","trim","Card","parseFloat","DashboardUtils","handleAddressLookup","Text","LongLabel","ShortLabel","Match_addr","DASHBOARD_VIEW","pageTitle","App","pca","appConfigLoaded","setappConfigLoaded","fetchAppConfig","msalConfig","authority","azureAuthority","redirectUri","azureRedirectUri","navigateToLoginRequestUrl","cache","cacheLocation","storeAuthStateInCookie","system","allowNativeBroker","PublicClientApplication","handleRedirectPromise","s","a","exact","path","component","CONFIG_BASE_URL","CONFIG_ENDPOINT","INTERNAL_SERVER_ERROR","retVal","BRACKET","BKT","MONGOOSE","MON","MID_POLE","MID","SECURITY","SEC","OTH","HPS","MV","MH","LED","LPS","INC","FLUO","getCity","gisCity","geoCity","test","geoLocation","geoLocAddress","geoLocCity","pinModeState","routingState","CITY","originator","originatorFlag","mobile","tablet","computer","largeScreen","widescreen","lookupsSlice","getLookupsSuccess","getLookupsFailed","fetchLookups","createMedia","CONFIG_API","configAPI","getConfig","oktaAuthState","logs","saginawLayerInitialized","jacksonLayerInitialized","globalStateSlice","setDrawerState","getConfigSuccess","getConfigFailure","setOktaAuthState","setUserLocation","setUserLocationError","setSelectedMarkerGeoLoc","setSelectedMarkerData","streetlightData","setSearchMode","setAdminMode","setPin","selectedMarkerData","updateLogs","env","GEO_LOC_EVENT","MAP_CLICK","STATE_CHANGED","createLog","logTypeArray","propertyKey","propertyValue","entries","random","words","arrayElement","testData","toDateString","MockLogs","getLogs","newLog","toISOString","process","REACT_APP_ENABLE_LOGGING","outagesSlice","searchedOutagesError","adminOutagesError","updateAdminOutagesError","outageViewModelWithContacts","MediaContextProvider","require","default","render","StrictMode"],"mappings":"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","file":"static/js/main.11d774fc.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/chevron-right.e8b206eb.svg\";","import { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport * as React from \"react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { X } from \"react-bootstrap-icons\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { EBracketTypes } from \"../../../../shared/enums/utility.enums\";\r\nimport { IAppConfig } from \"../../../../shared/types/config.types\";\r\nimport { RootState } from \"../../../../state-management/root-reducer\";\r\nimport {\r\n IPinModeState,\r\n IRoutingState,\r\n updateDrawerState,\r\n} from \"../../../../state-management/slices/global/global.slice\";\r\nimport { AppDispatch } from \"../../../../state-management/store\";\r\nimport { getBracketTypeDisplayLabel } from \"../../../../state-management/utils/state/outages.utils\";\r\nimport Chevron from \"../../../../theme/assets/chevron-right.svg\";\r\nimport ColorsPalette from \"../../../../theme/colors/Colors.palette\";\r\n\r\nimport ButtonStyles from \"../../../button/Button.styles\";\r\nimport STREETLIGHT_ICON from \"../../../icon/streetlight-icon/StreetlightIcon.component\";\r\nimport { EMarkerStatuses } from \"../../Map.constants\";\r\nimport { ISelectedMarker } from \"../../Map.types\";\r\nimport PopupStyles from \"./Popup.styles\";\r\nimport { IMarkerAttributes, IPopupProps } from \"./Popup.types\";\r\n\r\nconst getStreetlightLabel = (\r\n bracketTypeData: string,\r\n pinMode: IPinModeState,\r\n routing: IRoutingState\r\n): string => {\r\n if (pinMode.enabled) {\r\n return \"New Streetlight\";\r\n }\r\n\r\n if (routing.selectedOutage) {\r\n const { bracketType } = routing.selectedOutage.utility as any;\r\n return `${bracketType} Streetlight`;\r\n }\r\n\r\n if (\r\n bracketTypeData === EBracketTypes.OTHER ||\r\n bracketTypeData === EBracketTypes.UNKNOWN\r\n ) {\r\n return \"Streetlight\";\r\n }\r\n\r\n return `${getBracketTypeDisplayLabel(bracketTypeData)} Streetlight`;\r\n};\r\n\r\nconst renderHeader = (\r\n routing: IRoutingState,\r\n pinMode: IPinModeState,\r\n markerAttributes: IMarkerAttributes,\r\n address: string\r\n):\r\n | React.ReactElement>\r\n | React.ReactNodeArray => {\r\n const { markerStatus, bracketType, GISID } = markerAttributes;\r\n\r\n return (\r\n <>\r\n
\r\n
{getStreetlightLabel(bracketType, pinMode, routing)}
\r\n {markerStatus === EMarkerStatuses.COMPLETED && !pinMode.enabled && (\r\n
Streetlight ID: {GISID || \"Pending\"}
\r\n )}\r\n
\r\n
{address}
\r\n \r\n );\r\n};\r\n\r\nconst renderContent = (\r\n markerStatus: EMarkerStatuses,\r\n reportedDate: string | null,\r\n sapNotificationId: string | null,\r\n GISID: string,\r\n dispatch: AppDispatch,\r\n sendDataToGTM: any,\r\n layerId?: string,\r\n appConfig?: IAppConfig | null\r\n): React.ReactElement => {\r\n if (\r\n markerStatus === EMarkerStatuses.REPORTED ||\r\n markerStatus === EMarkerStatuses.IN_PROGRESS\r\n ) {\r\n return (\r\n \r\n \r\n \r\n );\r\n } else if (markerStatus === EMarkerStatuses.EXTENDED_REPAIR) {\r\n return (\r\n \r\n \r\n

\r\n Our crews have determined that this streetlight will need an extended\r\n amount of time to repair\r\n

\r\n
\r\n );\r\n } else if (markerStatus === EMarkerStatuses.NON_CE) {\r\n return layerId === appConfig?.esriGrandRapidsLayerId ? (\r\n \r\n

\r\n This light is maintained by the city of Grand Rapids, please call{\" \"}\r\n 616-456-3000, to report an issue.\r\n

\r\n
\r\n ) : (\r\n \r\n

\r\n This light is not maintained by Consumers Energy. It may be privately\r\n owned or maintained by your local municipality.\r\n

\r\n
\r\n );\r\n } else {\r\n return (\r\n \r\n {\r\n event.preventDefault();\r\n dispatch(updateDrawerState(true));\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Report Outage Clicked\",\r\n });\r\n }}\r\n title=\"Report Outage Button\"\r\n >\r\n Report Outage\r\n \"Report\r\n \r\n \r\n );\r\n }\r\n};\r\n\r\nconst Popup: React.FC = ({\r\n address,\r\n markerAttributes,\r\n reportedDate,\r\n sapNotificationId,\r\n layerId,\r\n onClose,\r\n}: IPopupProps) => {\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n const { markerStatus, bracketType, GISID } = markerAttributes;\r\n\r\n // App State\r\n const { appConfig } = useSelector((state: RootState) => state.globalState);\r\n const { pinMode, routing } = useSelector(\r\n (state: RootState) => state.globalState.ui\r\n );\r\n\r\n // Local State\r\n const [hasOutage, setHasOutage] = useState(0);\r\n const [isExtendedRepair, setIsExtendedRepair] = useState(false);\r\n const [isNonCE, setIsNonCE] = useState(false);\r\n\r\n useEffect(() => {\r\n if (\r\n markerStatus === EMarkerStatuses.REPORTED ||\r\n markerStatus === EMarkerStatuses.IN_PROGRESS\r\n ) {\r\n setHasOutage(1);\r\n }\r\n\r\n if (markerStatus === EMarkerStatuses.EXTENDED_REPAIR) {\r\n setIsExtendedRepair(true);\r\n }\r\n\r\n if (markerStatus === EMarkerStatuses.NON_CE) {\r\n setIsNonCE(true);\r\n }\r\n }, [markerStatus]);\r\n\r\n return (\r\n \r\n \r\n {!isExtendedRepair && !isNonCE && (\r\n \r\n )}\r\n {isExtendedRepair && (\r\n \r\n )}\r\n {isNonCE && (\r\n \r\n )}\r\n \r\n\r\n \r\n {renderHeader(routing, pinMode, markerAttributes, address)}\r\n\r\n {renderContent(\r\n markerStatus,\r\n reportedDate,\r\n sapNotificationId,\r\n GISID,\r\n dispatch,\r\n sendDataToGTM,\r\n layerId,\r\n appConfig\r\n )}\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Popup;\r\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\nimport { Provider } from \"react-redux\";\r\nimport { ThemeProvider } from \"@emotion/react\";\r\n\r\nimport Theme from \"../../../../theme\";\r\nimport store from \"../../../../state-management/store\";\r\n\r\nimport Popup from \"./Popup\";\r\nimport { IPopupProps } from \"./Popup.types\";\r\nimport { GTMProvider } from \"@elgorditosalsero/react-gtm-hook\";\r\n\r\nexport const renderPopup = (props: IPopupProps): HTMLDivElement => {\r\n const node = document.createElement(\"div\");\r\n const gtmParams = { id: \"GTM-5T2S9J\" };\r\n\r\n ReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n node\r\n );\r\n\r\n return node;\r\n};\r\n","export default __webpack_public_path__ + \"static/media/dot_streetlight-selected.53735cae.svg\";","export default __webpack_public_path__ + \"static/media/dot_extended-repair-selected.6072c1bb.svg\";","export default __webpack_public_path__ + \"static/media/dot_reported-selected.5e5f3538.svg\";","export default __webpack_public_path__ + \"static/media/dot_non-ce-selected.36ad5137.svg\";","import axios, { AxiosResponse } from \"axios\";\r\nimport MapView from \"@arcgis/core/views/MapView\";\r\nimport {\r\n ELocationServicesErrorMessages,\r\n EMarkerStatuses,\r\n LOCATOR_URL,\r\n} from \"./Map.constants\";\r\nimport Extent from \"@arcgis/core/geometry/Extent\";\r\nimport SpatialReference from \"@arcgis/core/geometry/SpatialReference\";\r\nimport Popup from \"@arcgis/core/widgets/Popup\";\r\nimport Geometry from \"@arcgis/core/geometry/Geometry\";\r\n\r\nimport {\r\n ILocationServicesError,\r\n IMapPoint,\r\n IMapPointInfo,\r\n MapViewClickEvent,\r\n} from \"./Map.types\";\r\nimport { ApiService } from \"../../api/api.service\";\r\nimport { OutagesResponse, OutageViewModel } from \"../../api/generated/models\";\r\nimport { ELogTypes } from \"../../shared/enums/logging.enums\";\r\nimport {\r\n getOutagesSuccess,\r\n getOutagesFailed,\r\n} from \"../../state-management/slices/outages/outages.slice\";\r\nimport { DispatchLogger } from \"../../state-management/utils/dispatch-logger/DispatchLogger\";\r\nimport { FeatureLayerService } from \"./FeatureLayer.service\";\r\nimport * as projection from \"@arcgis/core/geometry/projection\";\r\nimport {\r\n getGlobalState,\r\n getOutagesState,\r\n} from \"../../shared/utils/testing.utils\";\r\nimport { updateMarkerGeoLoc } from \"../../state-management/slices/global/global.slice\";\r\nimport { renderPopup } from \"./widgets/Popup/Popup.render\";\r\nimport { AppDispatch } from \"../../state-management/store\";\r\nimport {\r\n EBracketTypes,\r\n LampTypeDisplayMap,\r\n} from \"../../shared/enums/utility.enums\";\r\nimport PictureMarkerSymbol from \"@arcgis/core/symbols/PictureMarkerSymbol\";\r\n\r\nimport SelectedStreetlightMarker from \"../../theme/assets/map-markers/dot_streetlight-selected.svg\";\r\nimport SelectedExtendedRepairMarker from \"../../theme/assets/map-markers/dot_extended-repair-selected.svg\";\r\nimport SelectedReportedMarker from \"../../theme/assets/map-markers/dot_reported-selected.svg\";\r\nimport SelectedNonCEMarker from \"../../theme/assets/map-markers/dot_non-ce-selected.svg\";\r\n\r\nimport StreetlightMarker from \"../../theme/assets/map-markers/dot_streetlight.svg\";\r\nimport ExtendedRepairMarker from \"../../theme/assets/map-markers/dot_extended-repair.svg\";\r\nimport ReportedMarker from \"../../theme/assets/map-markers/dot_reported.svg\";\r\nimport NonCEMarker from \"../../theme/assets/map-markers/dot_non-ce.svg\";\r\nimport { isNullOrUndefined } from \"../../shared/utils/data.utils\";\r\n\r\n/**\r\n * getLocationError\r\n * @param {GeolocationPositionError} error\r\n * @returns {ILocationServicesError}\r\n */\r\nconst getLocationError = (\r\n error: GeolocationPositionError\r\n): ILocationServicesError => {\r\n let locationError: ILocationServicesError;\r\n const { code, PERMISSION_DENIED, POSITION_UNAVAILABLE, TIMEOUT } = error;\r\n switch (code) {\r\n case PERMISSION_DENIED:\r\n locationError = {\r\n code: code,\r\n message: ELocationServicesErrorMessages.PERMISSION_DENIED,\r\n displayMessage: ELocationServicesErrorMessages.PERMISSION_DENIED,\r\n };\r\n break;\r\n case POSITION_UNAVAILABLE:\r\n locationError = {\r\n code: code,\r\n message: ELocationServicesErrorMessages.POSITION_UNAVAILABLE,\r\n displayMessage: ELocationServicesErrorMessages.PERMISSION_DENIED,\r\n };\r\n break;\r\n case TIMEOUT:\r\n locationError = {\r\n code: code,\r\n message: ELocationServicesErrorMessages.TIMEOUT,\r\n displayMessage: ELocationServicesErrorMessages.PERMISSION_DENIED,\r\n };\r\n break;\r\n default:\r\n locationError = {\r\n code: code,\r\n message: ELocationServicesErrorMessages.UNKNOWN,\r\n displayMessage: ELocationServicesErrorMessages.PERMISSION_DENIED,\r\n };\r\n break;\r\n }\r\n\r\n return locationError;\r\n};\r\n\r\n/**\r\n * getPointLatLong\r\n * @param {MapViewClickEvent} event\r\n * @return {*} {IMapPoint}\r\n * @memberof MapUtils\r\n */\r\nconst getPointLatLong = (event: MapViewClickEvent): IMapPointInfo => {\r\n const { latitude, longitude, x, y } = event.mapPoint;\r\n return { latitude, longitude, x, y };\r\n};\r\n\r\nconst fetchCrossStreets = async (geometry: Geometry): Promise => {\r\n const xStreetResponse = await axios\r\n .get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: geometry,\r\n featureTypes: \"StreetInt\",\r\n f: \"json\",\r\n },\r\n })\r\n .then((response) => response)\r\n .catch((errors) => {\r\n return errors;\r\n });\r\n\r\n if (xStreetResponse.data.error || !xStreetResponse.data.address) {\r\n return \"Address Unknown\";\r\n }\r\n return xStreetResponse;\r\n};\r\n\r\nconst fetchGeoLocData = async (mapPoint: IMapPoint): Promise => {\r\n let geoLocResponse = null;\r\n try {\r\n geoLocResponse = await axios\r\n .all([\r\n axios.get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: mapPoint,\r\n featureTypes: \"StreetName\",\r\n f: \"json\",\r\n },\r\n }),\r\n axios.get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: mapPoint,\r\n featureTypes: \"StreetAddress\",\r\n f: \"json\",\r\n },\r\n }),\r\n axios.get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: mapPoint,\r\n featureTypes: \"PointAddress\",\r\n f: \"json\",\r\n },\r\n }),\r\n ])\r\n .then(\r\n axios.spread(\r\n (streetNameResponse, streetAddressResponse, pointAddressResponse) => {\r\n return {\r\n streetNameResponse,\r\n streetAddressResponse,\r\n pointAddressResponse,\r\n };\r\n }\r\n )\r\n )\r\n .catch((errors) => {\r\n return errors;\r\n });\r\n } catch (error) {\r\n return error;\r\n }\r\n\r\n return geoLocResponse;\r\n};\r\n\r\n/**\r\n * buildStreetAddressString\r\n * @param {string} address\r\n * @param {string} city\r\n * @param {string} region\r\n * @return {*} {string}\r\n */\r\nconst buildStreetAddressString = (addressResponse: any): string => {\r\n const { Address, City, Region } = addressResponse.data.address;\r\n let streetAddress;\r\n\r\n if (Address && City && Region) {\r\n streetAddress = `${Address}, ${City} ${Region}`;\r\n } else if (Address && City) {\r\n streetAddress = `${Address}, ${City}`;\r\n } else {\r\n streetAddress = `${Address}`;\r\n }\r\n\r\n return streetAddress;\r\n};\r\n\r\n/**\r\n * buildGeoLocPayload\r\n * @param {*} geoLocResponse\r\n * @param {*} xStreetsResponse\r\n * @return {*} {{ streetAddress: string; geoLocPayload: any }}\r\n */\r\nconst buildGeoLocPayload = (\r\n geoLocResponse: any,\r\n xStreetsResponse: any\r\n): { streetAddress: string; geoLocPayload: any } => {\r\n const { streetNameResponse, streetAddressResponse, pointAddressResponse } =\r\n geoLocResponse;\r\n let geoLocPayload = null;\r\n let streetAddress = null;\r\n xStreetsResponse = isNullOrUndefined(xStreetsResponse.data)\r\n ? streetAddressResponse\r\n : xStreetsResponse;\r\n if (streetAddressResponse.data.error && pointAddressResponse.data.error) {\r\n streetAddress = buildStreetAddressString(xStreetsResponse);\r\n geoLocPayload = {\r\n ...xStreetsResponse.data,\r\n crossStreets: xStreetsResponse.data.address.Address,\r\n };\r\n } else {\r\n // IF Point Address has an error, fall back to street address\r\n if (pointAddressResponse.data.error) {\r\n streetAddress = buildStreetAddressString(streetAddressResponse);\r\n geoLocPayload = {\r\n ...streetAddressResponse.data,\r\n crossStreets: xStreetsResponse.data.address.Address,\r\n };\r\n } else {\r\n // if pointAddress IS ON the same street as streetAddress,\r\n // we want to use pointAddress. If point address does not exist,\r\n // fall back to streetAddress. Else, if pointAddress is NOT on the\r\n // same street as streetAddress, then fall back to streetAddress.\r\n if (streetAddressResponse.data.error) {\r\n streetAddress = buildStreetAddressString(pointAddressResponse);\r\n geoLocPayload = {\r\n ...pointAddressResponse.data,\r\n crossStreets: xStreetsResponse.data.address.Address,\r\n };\r\n } else {\r\n if (\r\n pointAddressResponse.data.address.Address.includes(\r\n streetNameResponse.data.address.Address\r\n )\r\n ) {\r\n streetAddress = buildStreetAddressString(pointAddressResponse);\r\n geoLocPayload = {\r\n ...pointAddressResponse.data,\r\n crossStreets: xStreetsResponse.data.address.Address,\r\n };\r\n } else {\r\n // if pointAddress is NOT on the\r\n // same street as streetAddress, then fall back to streetAddress.\r\n streetAddress = buildStreetAddressString(streetAddressResponse);\r\n geoLocPayload = {\r\n ...streetAddressResponse.data,\r\n crossStreets: xStreetsResponse.data.address.Address,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { streetAddress, geoLocPayload };\r\n};\r\n\r\n/**\r\n * projectLatLngFromExtent\r\n * @param {Extent} extent\r\n * @return {*}\r\n */\r\nconst projectLatLngFromExtent = (extent: Extent): any => {\r\n return projection.project(\r\n extent,\r\n new SpatialReference({\r\n wkid: 4326,\r\n })\r\n );\r\n};\r\n\r\n/**\r\n * processExtent\r\n * @param {Extent} currentExtent\r\n * @param {ApiService} apiService\r\n * @param {DispatchLogger} dispatchLogger\r\n * @param {FeatureLayerService} featureLayerService\r\n * @return {*} {Promise}\r\n */\r\nconst processExtent = async (\r\n currentExtent: Extent,\r\n apiService: ApiService,\r\n dispatchLogger: DispatchLogger,\r\n featureLayerService: FeatureLayerService\r\n): Promise => {\r\n try {\r\n const outages = (await apiService.outagesApi.getOutagesByExtent({\r\n currentExtent,\r\n })) as OutagesResponse;\r\n\r\n dispatchLogger.fire(\r\n getOutagesSuccess,\r\n { ...outages },\r\n {\r\n message: \"Outages Fetched\",\r\n type: ELogTypes.API,\r\n data: { outages },\r\n }\r\n );\r\n\r\n featureLayerService.fetchFeatureLayer(currentExtent, outages);\r\n } catch (error) {\r\n dispatchLogger.fire(\r\n getOutagesFailed,\r\n { error },\r\n {\r\n message: \"Outages Fetched\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n\r\n return error;\r\n }\r\n};\r\n\r\n/**\r\n * Note: this is a workaround to get the the locate icon to render properly.\r\n * This solution is backwards compatible, If and whenever ESRI decides to fix it.\r\n * @see https://stackoverflow.com/questions/65563851/arcgis-4-18-locate-widget-custom-icon\r\n */\r\nconst renderLocationButtonIcon = (): void => {\r\n const locateIcons = document.getElementsByClassName(\"esri-icon-locate\");\r\n if (locateIcons && locateIcons.length === 1) {\r\n locateIcons[0].classList.value += \" esri-icon-navigation\";\r\n }\r\n};\r\n\r\nconst getPinModePopupContent = (\r\n mapView: MapView,\r\n streetAddress: string,\r\n removePinModeGraphics: () => void\r\n): any => {\r\n return renderPopup({\r\n address: streetAddress,\r\n markerAttributes: {\r\n lampType: EBracketTypes.UNKNOWN,\r\n markerStatus: EMarkerStatuses.COMPLETED,\r\n bracketType: EBracketTypes.UNKNOWN,\r\n GISID: null,\r\n },\r\n reportedDate: null,\r\n sapNotificationId: null,\r\n onClose: () => {\r\n removePinModeGraphics();\r\n mapView.popup.close();\r\n },\r\n });\r\n};\r\n\r\nconst getRoutingPopupContent = (\r\n mapView: MapView,\r\n streetAddress: string,\r\n outage: OutageViewModel,\r\n removeMapViewGraphics: () => void\r\n): any => {\r\n const { utility, location, markerStatus } = outage;\r\n const reportedDateString = new Date(outage.reportedDateTime as string);\r\n const reportedDate = new Intl.DateTimeFormat(\"en-US\", {\r\n timeStyle: \"short\",\r\n dateStyle: \"long\",\r\n } as any).format(reportedDateString);\r\n\r\n return renderPopup({\r\n address: streetAddress,\r\n markerAttributes: {\r\n lampType: utility?.lampType as string,\r\n markerStatus: markerStatus,\r\n bracketType: utility?.bracketType as any,\r\n GISID: location?.locationId,\r\n },\r\n reportedDate,\r\n sapNotificationId: outage.sapNotification as string,\r\n onClose: () => {\r\n removeMapViewGraphics();\r\n mapView.popup.close();\r\n },\r\n });\r\n};\r\n\r\nconst getGrandRapidsPopupContent = (\r\n dispatch: AppDispatch,\r\n mapView: MapView,\r\n popup: Popup,\r\n featureLayerID: string\r\n): any => {\r\n return async (feature: { graphic: any }): Promise => {\r\n const { graphic } = feature;\r\n const { geometry, layer } = graphic;\r\n\r\n const geoLocResponse = await fetchGeoLocData(geometry);\r\n const xStreetsResponse = await fetchCrossStreets(geometry);\r\n const { streetAddress, geoLocPayload } = buildGeoLocPayload(\r\n geoLocResponse,\r\n xStreetsResponse\r\n );\r\n\r\n // Update state\r\n dispatch(updateMarkerGeoLoc(geoLocPayload));\r\n\r\n return renderPopup({\r\n address: streetAddress,\r\n markerAttributes: {\r\n lampType: LampTypeDisplayMap.UNK,\r\n markerStatus: EMarkerStatuses.NON_CE,\r\n bracketType: EBracketTypes.COBRA,\r\n GISID: null,\r\n },\r\n reportedDate: null,\r\n sapNotificationId: null,\r\n layerId: layer.id,\r\n onClose: () => {\r\n mapView.graphics.removeAll();\r\n popup.close();\r\n },\r\n });\r\n };\r\n};\r\n\r\nconst getPopupContent = (\r\n dispatch: AppDispatch,\r\n mapView: MapView,\r\n popup: Popup,\r\n featureLayerID: string\r\n) => {\r\n return async (feature: { graphic: any }): Promise => {\r\n const { graphic } = feature;\r\n const { ui } = getGlobalState();\r\n\r\n if (ui.pinMode.enabled && graphic.sourceLayer.id === featureLayerID) {\r\n return;\r\n }\r\n\r\n const { geometry } = graphic;\r\n const ESRI_ATTRIBUTES = graphic.attributes;\r\n\r\n let reportedDate = null;\r\n let sapNotificationId = null;\r\n let attributes: {\r\n markerStatus?: any;\r\n GISID?: any;\r\n LAMPTYPE?: any;\r\n FIXTURESUP?: any;\r\n LATITUDE?: any;\r\n LONGITUDE?: any;\r\n } | null = null;\r\n\r\n // IF we dont have a GISID, we can safely assume\r\n // we have a dropped pin. IF so, we need the attributes\r\n // from the selectedMarker, OTHERWISE, we can use the\r\n // standard ESRI Attributes.\r\n\r\n if (!ESRI_ATTRIBUTES.GISID) {\r\n const { selectedMarker } = ui;\r\n const { streetLightData } = selectedMarker;\r\n\r\n if (streetLightData) {\r\n attributes = {\r\n ...ESRI_ATTRIBUTES,\r\n ...streetLightData.attributes,\r\n };\r\n }\r\n } else {\r\n attributes = {\r\n ...ESRI_ATTRIBUTES,\r\n };\r\n }\r\n\r\n const geoLocResponse = await fetchGeoLocData(geometry);\r\n const xStreetsResponse = await fetchCrossStreets(geometry);\r\n const { streetAddress, geoLocPayload } = buildGeoLocPayload(\r\n geoLocResponse,\r\n xStreetsResponse\r\n );\r\n\r\n // Update state\r\n dispatch(updateMarkerGeoLoc(geoLocPayload));\r\n\r\n if (attributes && attributes.markerStatus !== EMarkerStatuses.COMPLETED) {\r\n const outagesState = getOutagesState();\r\n const { outageCollection } = outagesState;\r\n\r\n Object.values(outageCollection).forEach((outage: OutageViewModel) => {\r\n if (\r\n (outage.location?.locationId &&\r\n outage.location?.locationId === attributes?.GISID) ||\r\n (outage.location?.coordinates?.latitude === attributes?.LATITUDE &&\r\n outage.location?.coordinates?.longitude === attributes?.LONGITUDE)\r\n ) {\r\n const reportedDateString = new Date(\r\n outage.reportedDateTime as string\r\n );\r\n\r\n sapNotificationId = outage.sapNotification;\r\n reportedDate = new Intl.DateTimeFormat(\"en-US\", {\r\n timeStyle: \"short\",\r\n dateStyle: \"long\",\r\n } as any).format(reportedDateString);\r\n }\r\n });\r\n }\r\n\r\n return renderPopup({\r\n address: streetAddress,\r\n markerAttributes: {\r\n lampType: attributes?.LAMPTYPE,\r\n markerStatus: attributes?.markerStatus,\r\n bracketType: attributes?.FIXTURESUP,\r\n GISID: attributes?.GISID,\r\n },\r\n reportedDate,\r\n sapNotificationId,\r\n onClose: () => {\r\n mapView.graphics.removeAll();\r\n popup.close();\r\n },\r\n });\r\n };\r\n};\r\n\r\n/**\r\n * getMarkerByStatus\r\n * @param {string} markerStatus\r\n * @param {boolean} selected\r\n * @return {*} {PictureMarkerSymbol}\r\n */\r\nconst getMarkerByStatus = (\r\n markerStatus: string,\r\n selected = false\r\n): PictureMarkerSymbol => {\r\n let symbol = null;\r\n switch (markerStatus) {\r\n case EMarkerStatuses.REPORTED:\r\n symbol = new PictureMarkerSymbol({\r\n url: selected ? SelectedReportedMarker : ReportedMarker,\r\n width: 12,\r\n height: 12,\r\n });\r\n break;\r\n case EMarkerStatuses.IN_PROGRESS:\r\n symbol = new PictureMarkerSymbol({\r\n url: selected ? SelectedReportedMarker : ReportedMarker,\r\n width: 12,\r\n height: 12,\r\n });\r\n break;\r\n case EMarkerStatuses.EXTENDED_REPAIR:\r\n symbol = new PictureMarkerSymbol({\r\n url: selected ? SelectedExtendedRepairMarker : ExtendedRepairMarker,\r\n width: 12,\r\n height: 12,\r\n });\r\n break;\r\n case EMarkerStatuses.NON_CE:\r\n symbol = new PictureMarkerSymbol({\r\n url: selected ? SelectedNonCEMarker : NonCEMarker,\r\n width: 12,\r\n height: 12,\r\n });\r\n break;\r\n\r\n default:\r\n symbol = new PictureMarkerSymbol({\r\n url: selected ? SelectedStreetlightMarker : StreetlightMarker,\r\n width: 12,\r\n height: 12,\r\n });\r\n break;\r\n }\r\n\r\n return symbol;\r\n};\r\n\r\nexport default {\r\n buildGeoLocPayload,\r\n fetchGeoLocData,\r\n fetchCrossStreets,\r\n getLocationError,\r\n getPointLatLong,\r\n getPinModePopupContent,\r\n getGrandRapidsPopupContent,\r\n getPopupContent,\r\n getRoutingPopupContent,\r\n getMarkerByStatus,\r\n processExtent,\r\n projectLatLngFromExtent,\r\n renderLocationButtonIcon,\r\n};\r\n","import styled from \"@emotion/styled\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst CESoarButton = styled(Button)`\r\n &.ce-soar-button {\r\n border-radius: 0;\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n padding: 12px 20px;\r\n text-align: center;\r\n transition: all 300ms ease-in-out;\r\n &.block {\r\n width: 100%;\r\n }\r\n\r\n &.btn-primary {\r\n background-color: ${(props) => props.theme.colors?.essential.buttonGreen};\r\n border: 1px solid ${(props) => props.theme.colors?.essential.buttonGreen};\r\n color: ${(props) => props.theme.colors?.essential.white};\r\n &:hover {\r\n &:not(:disabled) {\r\n background-color: ${(props) => props.theme.colors?.cta.primary};\r\n border: 1px solid ${(props) => props.theme.colors?.cta.primary};\r\n &:not(.no-scale) {\r\n transform: scale(1.05);\r\n }\r\n }\r\n }\r\n }\r\n\r\n &.btn-secondary {\r\n background-color: ${(props) => props.theme.colors?.essential.white};\r\n border: 1px solid ${(props) => props.theme.colors?.essential.buttonGreen};\r\n color: ${(props) => props.theme.colors?.essential.buttonGreen};\r\n &:hover {\r\n &:not(:disabled) {\r\n border: 1px solid ${(props) => props.theme.colors?.cta.primary};\r\n color: ${(props) => props.theme.colors?.cta.primary};\r\n &:not(.no-scale) {\r\n transform: scale(1.05);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst ButtonContainer = styled.div`\r\n &.button-container {\r\n display: inline-block;\r\n text-align: center;\r\n padding: 12px;\r\n width: 100%;\r\n }\r\n`;\r\n\r\nconst LinkButton = styled.button`\r\n &.link-button {\r\n background-color: transparent;\r\n appearance: none;\r\n border: 0 none;\r\n cursor: pointer;\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n &,\r\n &:hover,\r\n &:focus,\r\n &:active {\r\n color: ${({ theme }) => theme.colors?.brand?.primary};\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n CESoarButton,\r\n LinkButton,\r\n ButtonContainer,\r\n};\r\n","import {\r\n ILogMessage,\r\n LoggingService,\r\n} from \"../../../shared/services/Logging.service\";\r\nimport { AppDispatch } from \"../../store\";\r\n\r\n/**\r\n * @export\r\n * @class DispatchLogger\r\n *\r\n * Utility class that allows you to dispatch an action,\r\n * and log a meessage at the same time.\r\n */\r\nexport class DispatchLogger {\r\n private dispatch: AppDispatch;\r\n private static instance: DispatchLogger;\r\n private loggingService: LoggingService;\r\n private testId: string | null;\r\n\r\n private constructor(dispatch: AppDispatch, testId: string | null) {\r\n this.dispatch = dispatch;\r\n this.loggingService = LoggingService.getInstance(dispatch);\r\n this.testId = testId;\r\n }\r\n\r\n static getInstance(\r\n dispatch: AppDispatch,\r\n testId: string | null = null\r\n ): DispatchLogger {\r\n if (!DispatchLogger.instance) {\r\n DispatchLogger.instance = new DispatchLogger(dispatch, testId);\r\n }\r\n\r\n return DispatchLogger.instance;\r\n }\r\n\r\n getTestId(): string | null {\r\n return this.testId;\r\n }\r\n\r\n /**\r\n * @todo: Come up with types for these params\r\n *\r\n * @param {*} action\r\n * @param {*} payload\r\n * @param {ILogMessage} log\r\n * @memberof DispatchLogger\r\n */\r\n fire(action: any, payload: any, log: ILogMessage): void {\r\n // @todo make action and payload optional\r\n if (action && payload) {\r\n this.dispatch(action(payload));\r\n }\r\n\r\n this.loggingService.logMessage(log);\r\n }\r\n}\r\n","export enum ESearchWizardSteps {\r\n SEARCH = \"search\",\r\n RESULTS = \"results\",\r\n DETAIL = \"detail\",\r\n}\r\n","import { IFontFamilies, IFontSizes } from \"../theme.types\";\r\n\r\nexport const fontSizes: IFontSizes = {\r\n large: 18,\r\n base: 16,\r\n small: 14,\r\n smallest: 12,\r\n};\r\n\r\nexport const fontFamilies: IFontFamilies = {\r\n regular: \"Open Sans Regular\",\r\n semiBold: \"Open Sans Semi Bold\",\r\n};\r\n","import Colors from \"./colors/Colors.palette\";\r\nimport { ITheme } from \"./theme.types\";\r\nimport { fontSizes, fontFamilies } from \"./typography/font-sizes\";\r\nimport { breakpoints } from \"./layout/breakpoints\";\r\nimport {\r\n getFontThemeSize,\r\n increaseFontSize,\r\n decreaseFontSize,\r\n} from \"./utils/Font.utils\";\r\n\r\nimport { getThemeBreakpoint } from \"./utils/Breakpoint.utils\";\r\nimport { layoutProperties } from \"./layout/properties\";\r\nimport {\r\n isEdge,\r\n isFirefox,\r\n isMobile,\r\n isSamsungBrowser,\r\n isMobileSafari,\r\n} from \"react-device-detect\";\r\n\r\nconst CE_THEME: ITheme = {\r\n namespace: \"ce-soar\",\r\n colors: {\r\n alerts: Colors.Alerts,\r\n brand: Colors.Brand,\r\n cta: Colors.CTA,\r\n grays: Colors.Grays,\r\n essential: Colors.Essential,\r\n mapMarkers: Colors.MapMarkers,\r\n },\r\n breakpoints,\r\n fontSizes,\r\n fontFamilies,\r\n layoutProperties: {\r\n ...layoutProperties,\r\n },\r\n utils: {\r\n getFontThemeSize,\r\n increaseFontSize,\r\n decreaseFontSize,\r\n getThemeBreakpoint,\r\n browserUtils: {\r\n isEdge,\r\n isMobile,\r\n isFirefox,\r\n isSamsungBrowser,\r\n isMobileSafari,\r\n },\r\n },\r\n};\r\n\r\nexport default { CE_THEME };\r\n","import { ILayoutProperties } from \"../theme.types\";\r\n\r\nexport const layoutProperties: ILayoutProperties = {\r\n outageDrawerWidth: 400,\r\n headerHeight: 75,\r\n logoWidthDesktop: 125,\r\n logoWidthMobile: 30,\r\n};\r\n","import { IFontSizes } from \"../theme.types\";\r\nimport { fontSizes } from \"../typography/font-sizes\";\r\n\r\nexport const getFontThemeSize = (key: keyof IFontSizes): string =>\r\n `${fontSizes[key]}px`;\r\n\r\nexport const increaseFontSize = (size: number): string => {\r\n const { base } = fontSizes;\r\n return `${base + size}px`;\r\n};\r\n\r\nexport const decreaseFontSize = (size: number): string => {\r\n const { base } = fontSizes;\r\n return `${base - size}px`;\r\n};\r\n","import { breakpoints } from \"../layout/breakpoints\";\r\nimport { IBreakpoints } from \"../theme.types\";\r\n\r\nexport const getThemeBreakpoint = (key: keyof IBreakpoints): string =>\r\n `${breakpoints[key]}px`;\r\n","import { IApiTestParams } from \"../shared/types/testing.types\";\r\nimport {\r\n ADMIN_OUTAGES_ENDPOINT,\r\n LOOKUPS_ENDPOINT,\r\n OUTAGES_ENDPOINT,\r\n SEARCH_OUTAGES_ENDPOINT,\r\n VERSION_ENDPOINT,\r\n} from \"./constants/urls.constants\";\r\n\r\nexport enum EApiTypes {\r\n LOOKUPS = \"lookups\",\r\n OUTAGES = \"outages\",\r\n SEARCH_OUTAGES = \"outages/search\",\r\n ADMIN_OUTAGES = \"outages/admin\",\r\n VERSION = \"version\",\r\n}\r\n\r\nexport enum EEnvironments {\r\n DEV = \"dev\",\r\n QA = \"qa\",\r\n PROD = \"prod\",\r\n}\r\n\r\nconst getEndpoint = (apiName: string, params?: IApiTestParams): string => {\r\n let endpoint;\r\n switch (apiName) {\r\n case EApiTypes.LOOKUPS:\r\n endpoint = LOOKUPS_ENDPOINT;\r\n break;\r\n case EApiTypes.OUTAGES:\r\n endpoint = OUTAGES_ENDPOINT;\r\n break;\r\n case EApiTypes.SEARCH_OUTAGES:\r\n endpoint = SEARCH_OUTAGES_ENDPOINT;\r\n break;\r\n case EApiTypes.ADMIN_OUTAGES:\r\n endpoint = ADMIN_OUTAGES_ENDPOINT;\r\n break;\r\n case EApiTypes.VERSION:\r\n endpoint = VERSION_ENDPOINT;\r\n break;\r\n default:\r\n endpoint = \"/\";\r\n break;\r\n }\r\n\r\n if (params) {\r\n if (params.testHttpError) {\r\n return `${endpoint}?testHttpError=${params.testHttpError}`;\r\n } else if (params.id) {\r\n return `${endpoint}/${params.id}`;\r\n } else {\r\n return endpoint;\r\n }\r\n } else {\r\n return endpoint;\r\n }\r\n};\r\n\r\nexport default { getEndpoint };\r\n","import axios, { AxiosError, AxiosInstance, AxiosResponse } from \"axios\";\r\nimport { IAppConfig } from \"../shared/types/config.types\";\r\nimport { IApiTestParams } from \"../shared/types/testing.types\";\r\nimport { LOCAL_BASE_API_URL, LOCAL_BASE_URL } from \"./constants/urls.constants\";\r\nimport {\r\n CreateOutageViewModel,\r\n LookupsResponse,\r\n LookupsViewModel,\r\n OutagesResponse,\r\n OutageViewModel,\r\n OutageViewModelWithContacts,\r\n Version,\r\n VersionResponse,\r\n} from \"./generated/models\";\r\nimport APIUtils, { EApiTypes } from \"./utils.api\";\r\nimport MapUtils from \"../components/map/Map.utils\";\r\nimport { IExtent } from \"../components/map/Map.types\";\r\nimport store from \"../state-management/store\";\r\n\r\ninterface ILookUpsAPI {\r\n getLookups: (\r\n params?: IApiTestParams | undefined\r\n ) => Promise;\r\n}\r\n\r\ninterface IOutagesAPI {\r\n getOutageById: (\r\n outageId: number,\r\n params?: IApiTestParams | undefined\r\n ) => Promise;\r\n getOutagesByExtent: (\r\n params?: IApiTestParams | undefined\r\n ) => Promise>;\r\n submitOutage: (\r\n outage: CreateOutageViewModel,\r\n hasImage: boolean,\r\n fileData?: File,\r\n params?: IApiTestParams | undefined\r\n ) => Promise>;\r\n searchOutages: (\r\n searchTerm: string,\r\n page_size?: number,\r\n page_number?: number,\r\n params?: IApiTestParams | undefined\r\n ) => Promise>;\r\n searchAdminOutages: (\r\n page_size?: number,\r\n page_number?: number,\r\n params?: IApiTestParams | undefined\r\n ) => Promise>;\r\n updateAdminOutage: (\r\n outage: OutageViewModel,\r\n locationId?: number,\r\n completedReason?: string,\r\n params?: IApiTestParams | undefined\r\n ) => Promise>;\r\n}\r\n\r\ninterface IVersionAPI {\r\n getVersion: (params?: IApiTestParams | undefined) => Promise;\r\n}\r\n\r\nexport class ApiService {\r\n private static instance: ApiService;\r\n private _appConfig!: IAppConfig;\r\n private _lookupsApi!: ILookUpsAPI;\r\n private _outagesApi!: IOutagesAPI;\r\n private _versionApi!: IVersionAPI;\r\n private lookupsAxiosInstance!: AxiosInstance;\r\n private outagesAxiosInstance!: AxiosInstance;\r\n private versionAxiosInstance!: AxiosInstance;\r\n\r\n public getBaseAPIUrl(): string {\r\n let baseURL;\r\n\r\n if (\r\n process.env.NODE_ENV === \"development\" ||\r\n process.env.NODE_ENV === \"test\"\r\n ) {\r\n if (process.env.REACT_APP_ENABLE_LOCAL === \"true\") {\r\n baseURL = LOCAL_BASE_API_URL;\r\n } else {\r\n baseURL = this.appConfig.apiUrl;\r\n }\r\n } else {\r\n baseURL = this.appConfig.apiUrl;\r\n }\r\n\r\n return baseURL;\r\n }\r\n\r\n public getBaseUrl(): string {\r\n let baseURL;\r\n\r\n if (\r\n process.env.NODE_ENV === \"development\" ||\r\n process.env.NODE_ENV === \"test\"\r\n ) {\r\n baseURL = LOCAL_BASE_URL;\r\n } else {\r\n baseURL = this.appConfig.apiUrl.replace(\"/api\", \"\");\r\n }\r\n\r\n return baseURL;\r\n }\r\n\r\n private buildAxiosInstance(): AxiosInstance {\r\n return axios.create({\r\n baseURL: this.getBaseAPIUrl(),\r\n headers: {\r\n \"Ocp-Apim-Subscription-Key\": this.appConfig.apimSubscriptionKey,\r\n },\r\n });\r\n }\r\n\r\n private initLookupsApi() {\r\n this.lookupsAxiosInstance = this.buildAxiosInstance();\r\n this._lookupsApi = {\r\n getLookups: async (\r\n params?: IApiTestParams\r\n ): Promise => {\r\n return this.lookupsAxiosInstance({\r\n method: \"GET\",\r\n url: APIUtils.getEndpoint(EApiTypes.LOOKUPS, params),\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n },\r\n };\r\n }\r\n\r\n private initOutagesApi(): void {\r\n this.outagesAxiosInstance = this.buildAxiosInstance();\r\n this._outagesApi = {\r\n getOutageById: async (\r\n outageId: number,\r\n params?: IApiTestParams\r\n ): Promise => {\r\n return this.outagesAxiosInstance({\r\n method: \"GET\",\r\n url: `${APIUtils.getEndpoint(EApiTypes.OUTAGES, params)}/${outageId}`,\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n },\r\n getOutagesByExtent: async (\r\n params?: IApiTestParams\r\n ): Promise> => {\r\n const currentExtent = params?.currentExtent;\r\n let latLongExtent: IExtent;\r\n\r\n if (currentExtent) {\r\n latLongExtent = MapUtils.projectLatLngFromExtent(currentExtent);\r\n\r\n return this.outagesAxiosInstance({\r\n method: \"GET\",\r\n url: APIUtils.getEndpoint(EApiTypes.OUTAGES, params),\r\n params: {\r\n top_left_lat: latLongExtent.ymin,\r\n top_left_long: latLongExtent.xmax,\r\n bottom_right_lat: latLongExtent.ymax,\r\n bottom_right_long: latLongExtent.xmin,\r\n },\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n } else {\r\n return Promise.reject();\r\n }\r\n },\r\n submitOutage: async (\r\n outage: CreateOutageViewModel,\r\n hasImage: boolean,\r\n fileData?: File,\r\n params?: IApiTestParams\r\n ): Promise> => {\r\n if (hasImage && fileData) {\r\n return this.outagesAxiosInstance({\r\n method: \"POST\",\r\n data: outage,\r\n url: APIUtils.getEndpoint(EApiTypes.OUTAGES, params),\r\n headers: {\r\n // image type will always be .jpg since we convert all files in imageUploadService\r\n \"SOAR-UploadImage\": \"jpg\",\r\n },\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n }\r\n\r\n return this.outagesAxiosInstance({\r\n method: \"POST\",\r\n data: outage,\r\n url: APIUtils.getEndpoint(EApiTypes.OUTAGES, params),\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n },\r\n searchOutages: async (\r\n searchTerm: string,\r\n page_size?: number,\r\n page_number?: number,\r\n params?: IApiTestParams\r\n ): Promise> => {\r\n return this.outagesAxiosInstance({\r\n method: \"GET\",\r\n url: APIUtils.getEndpoint(EApiTypes.SEARCH_OUTAGES, params),\r\n params: {\r\n searchvalue: searchTerm,\r\n page_size: page_size || 50,\r\n page_number: page_number || 1,\r\n },\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n },\r\n searchAdminOutages: async (\r\n page_size?: number,\r\n page_number?: number,\r\n params?: IApiTestParams\r\n ): Promise> => {\r\n const authState = store.getState().globalState.auth.entraAuthState;\r\n const token = authState?.accessToken;\r\n return this.outagesAxiosInstance({\r\n method: \"GET\",\r\n url: APIUtils.getEndpoint(EApiTypes.ADMIN_OUTAGES, params),\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n params: {\r\n page_size: page_size || 50,\r\n page_number: page_number || 1,\r\n },\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n },\r\n updateAdminOutage: async (\r\n outage: OutageViewModel,\r\n locationId?: number,\r\n completedReason?: string,\r\n params?: IApiTestParams\r\n ): Promise> => {\r\n const authState = store.getState().globalState.auth.entraAuthState;\r\n const token = authState?.accessToken;\r\n let updatePayload = null;\r\n if (locationId) {\r\n updatePayload = { ...outage };\r\n } else if (completedReason) {\r\n //outage.completedReason = completedReason;\r\n updatePayload = {\r\n ...outage,\r\n completedReason: completedReason,\r\n location: {\r\n ...outage.location,\r\n locationId: 0,\r\n },\r\n };\r\n } else {\r\n return Promise.reject();\r\n }\r\n\r\n return this.outagesAxiosInstance({\r\n method: \"PUT\",\r\n url: `outages/${outage.outageId}/adminstatus`,\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n data: updatePayload,\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n },\r\n };\r\n }\r\n\r\n private initVersionApi(): void {\r\n this.versionAxiosInstance = this.buildAxiosInstance();\r\n this._versionApi = {\r\n getVersion: async (params?: IApiTestParams): Promise => {\r\n return this.versionAxiosInstance({\r\n method: \"GET\",\r\n url: APIUtils.getEndpoint(EApiTypes.VERSION, params),\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n return error;\r\n });\r\n },\r\n };\r\n }\r\n\r\n public static getInstance(): ApiService {\r\n if (!ApiService.instance) {\r\n ApiService.instance = new ApiService();\r\n }\r\n\r\n return ApiService.instance;\r\n }\r\n\r\n public initializeAPIs(): void {\r\n this.initLookupsApi();\r\n this.initOutagesApi();\r\n this.initVersionApi();\r\n }\r\n\r\n public set appConfig(appConfig: IAppConfig) {\r\n this._appConfig = appConfig;\r\n }\r\n\r\n public get appConfig(): IAppConfig {\r\n return this._appConfig;\r\n }\r\n\r\n public get lookupsApi(): ILookUpsAPI {\r\n return this._lookupsApi;\r\n }\r\n\r\n public get outagesApi(): IOutagesAPI {\r\n return this._outagesApi;\r\n }\r\n\r\n public get versionApi(): IVersionAPI {\r\n return this._versionApi;\r\n }\r\n}\r\n","export const groupCollectionByKey = (\r\n key: string,\r\n collection: Array\r\n): Array => {\r\n return collection.reduce((objectsByKeyValue, obj) => {\r\n const { attributes } = obj;\r\n const value = attributes[key];\r\n objectsByKeyValue[value] = (objectsByKeyValue[value] || []).concat(\r\n attributes\r\n );\r\n return objectsByKeyValue;\r\n }, {});\r\n};\r\n\r\nexport const getKeyByValue = (object: any, value: string): any => {\r\n return Object.keys(object).find((key) => object[key] === value);\r\n};\r\n\r\nexport const isNullOrUndefined = (\r\n obj: T | null | undefined\r\n): obj is null | undefined => {\r\n return typeof obj === \"undefined\" || obj === null;\r\n};\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport { AppThunk } from \"../../store\";\r\nimport { Version, VersionResponse } from \"../../../api/generated/models\";\r\nimport { IStandardError } from \"../../../shared/types/error.types\";\r\nimport { ApiService } from \"../../../api/api.service\";\r\n\r\nexport interface IVersionState {\r\n version: Version;\r\n versionError: IStandardError | null;\r\n}\r\n\r\nconst initialState: IVersionState = {\r\n version: { version: null },\r\n versionError: null,\r\n};\r\n\r\nconst versionSlice = createSlice({\r\n name: \"version\",\r\n initialState,\r\n reducers: {\r\n getVersionSuccess(state, action: PayloadAction) {\r\n state.version = action.payload;\r\n state.versionError = null;\r\n },\r\n getVersionFailed(state, action: PayloadAction) {\r\n const { version, errors } = action.payload;\r\n state.version = version;\r\n state.versionError = errors;\r\n },\r\n },\r\n});\r\n\r\nexport const { getVersionSuccess, getVersionFailed } = versionSlice.actions;\r\n\r\nexport const fetchVersion = (): any => async (\r\n dispatch: (arg0: { payload: any; type: string }) => void,\r\n getState: any\r\n) => {\r\n const apiService: ApiService = ApiService.getInstance();\r\n const { versionApi } = apiService;\r\n try {\r\n const results = await versionApi.getVersion();\r\n dispatch(getVersionSuccess(results));\r\n } catch (error) {\r\n dispatch(getVersionFailed(error));\r\n }\r\n};\r\n\r\nexport default versionSlice.reducer;\r\n","import { combineReducers } from \"@reduxjs/toolkit\";\r\nimport globalReducer from \"./slices/global/global.slice\";\r\nimport lookupReducer from \"./slices/lookups/lookups.slice\";\r\nimport outagesReducer from \"./slices/outages/outages.slice\";\r\nimport versionReducer from \"./slices/version/version.slice\";\r\n\r\nconst rootReducer = combineReducers({\r\n globalState: globalReducer,\r\n lookups: lookupReducer,\r\n outages: outagesReducer,\r\n version: versionReducer,\r\n});\r\n\r\nexport type RootState = ReturnType;\r\nexport default rootReducer;\r\n","import { configureStore, Action, ThunkAction } from \"@reduxjs/toolkit\";\r\nimport rootReducer, { RootState } from \"./root-reducer\";\r\n\r\nconst store = configureStore({\r\n reducer: rootReducer,\r\n});\r\n\r\nif (process.env.NODE_ENV === \"development\" && module.hot) {\r\n module.hot.accept(\"./root-reducer\", () => {\r\n const newRootReducer = require(\"./root-reducer\").default;\r\n store.replaceReducer(newRootReducer);\r\n });\r\n}\r\n\r\nexport type AppDispatch = typeof store.dispatch;\r\n\r\n/**\r\n * @type AppThunk\r\n * @description The AppThunk type declares that the \"action\" that we're using is specifically a thunk function.\r\n * The thunk is customized with some additional type parameters:\r\n * - Return value: the thunk doesn't return anything\r\n * - State type for `getState`: returns our RootState type\r\n * - \"Extra argument\": the thunk middleware can be customized to pass in an extra value, but we aren't ussing that currently\r\n * - Action types accepted by `dispatch`: any action whose type is a string.\r\n *\r\n */\r\nexport type AppThunk = ThunkAction>;\r\n\r\nexport default store;\r\n","import {\r\n IThemeColor,\r\n IThemeEssentialColor,\r\n IThemeMarkerColor,\r\n} from \"../theme.types\";\r\n\r\nconst Alerts: IThemeColor = {\r\n primary: \"#c32b2a\",\r\n secondary: \"#eb871b\",\r\n tertiary: \"#ffc425\",\r\n quaternary: \"#fbe6b5\",\r\n quinary: undefined,\r\n senary: undefined,\r\n septenary: undefined,\r\n octonary: \"#0179C0\",\r\n};\r\n\r\nconst Brand: IThemeColor = {\r\n primary: \"#0079c1\",\r\n secondary: \"#2f97d6\",\r\n tertiary: \"#6ab7e4\",\r\n quaternary: \"#c5e5f0\",\r\n quinary: \"#dcf6ff\",\r\n senary: undefined,\r\n septenary: undefined,\r\n};\r\n\r\nconst CTA: IThemeColor = {\r\n primary: \"#639d36\",\r\n secondary: \"#7dca42\",\r\n tertiary: \"#9ed872\",\r\n quaternary: \"#c7e6af\",\r\n quinary: \"#caf1ca\",\r\n senary: \"#e4fee4\",\r\n septenary: undefined,\r\n};\r\n\r\nconst Grays: IThemeColor = {\r\n primary: \"#929292\",\r\n secondary: \"#b3b3b3\",\r\n tertiary: \"#cecece\",\r\n quaternary: \"#f6f6f6\",\r\n quinary: \"#000000\",\r\n senary: \"#e5e5e5\",\r\n septenary: \"#666666\",\r\n};\r\n\r\nconst Essential: IThemeEssentialColor = {\r\n black: \"#000000\",\r\n grayDark: \"#666666\",\r\n grayLight: \"#f6f6f6\",\r\n white: \"#ffffff\",\r\n buttonGreen: \"#4d6e33\",\r\n};\r\n\r\nconst MapMarkers: IThemeMarkerColor = {\r\n extendedRepairFill: \"#ffd1d1\",\r\n extendedRepairStroke: \"#c22b2a\",\r\n nonCEFill: \"#929292\",\r\n nonCEStroke: \"#929292\",\r\n};\r\n\r\nexport default {\r\n Alerts,\r\n Brand,\r\n CTA,\r\n Grays,\r\n Essential,\r\n MapMarkers,\r\n};\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nexport const StreetlightIcon = styled.svg`\r\n &.streetlight-icon {\r\n .light {\r\n fill: none;\r\n stroke-linecap: round;\r\n stroke-width: 12.785px;\r\n }\r\n }\r\n`;\r\n\r\nexport default { StreetlightIcon };\r\n","import React from \"react\";\r\nimport { IStreetlightIconProps } from \"../Icon.types\";\r\nimport IconStyles from \"../Icon.styles\";\r\nimport theme from \"../../../theme\";\r\n\r\nconst COBRA_ICON: React.FC = (\r\n props: IStreetlightIconProps\r\n) => {\r\n const { reported, className, type } = props;\r\n let { bgFill, fill } = props;\r\n\r\n if (!bgFill) {\r\n bgFill = reported\r\n ? theme.CE_THEME.colors.alerts.secondary\r\n : theme.CE_THEME.colors.brand.primary;\r\n }\r\n\r\n if (!fill) {\r\n fill = \"#ffffff\";\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default COBRA_ICON;\r\n","import React from \"react\";\r\nimport theme from \"../../../theme\";\r\nimport IconStyles from \"../Icon.styles\";\r\nimport { IStreetlightIconProps } from \"../Icon.types\";\r\n\r\nconst HANGING_ICON: React.FC = (\r\n props: IStreetlightIconProps\r\n) => {\r\n const { reported, className, type } = props;\r\n let { bgFill, fill } = props;\r\n\r\n if (!bgFill) {\r\n bgFill = reported\r\n ? theme.CE_THEME.colors.alerts.secondary\r\n : theme.CE_THEME.colors.brand.primary;\r\n }\r\n\r\n if (!fill) {\r\n fill = \"#ffffff\";\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HANGING_ICON;\r\n","import React from \"react\";\r\nimport theme from \"../../../theme\";\r\nimport IconStyles from \"../Icon.styles\";\r\nimport { IStreetlightIconProps } from \"../Icon.types\";\r\n\r\nconst DECORATIVE_ICON: React.FC = (\r\n props: IStreetlightIconProps\r\n) => {\r\n const { reported, className, type } = props;\r\n let { bgFill, fill } = props;\r\n\r\n if (!bgFill) {\r\n bgFill = reported\r\n ? theme.CE_THEME.colors.alerts.secondary\r\n : theme.CE_THEME.colors.brand.primary;\r\n }\r\n\r\n if (!fill) {\r\n fill = \"#ffffff\";\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DECORATIVE_ICON;\r\n","import React from \"react\";\r\nimport COBRA_ICON from \"./CobraIcon\";\r\nimport HANGING_ICON from \"./HangingIcon\";\r\nimport DECORATIVE_ICON from \"./DecorativeIcon\";\r\nimport {\r\n BracketTypeDisplayMap,\r\n EBracketTypes,\r\n} from \"../../../shared/enums/utility.enums\";\r\nimport { StreetlightIconType, IStreetlightIconProps } from \"../Icon.types\";\r\n\r\nconst renderIcon = (\r\n className: string,\r\n reported: number,\r\n type: StreetlightIconType,\r\n bgFill: string | undefined,\r\n fill: string | undefined\r\n) => {\r\n if (type === BracketTypeDisplayMap.COB) {\r\n type = EBracketTypes.COBRA;\r\n }\r\n\r\n if (type === BracketTypeDisplayMap.PT) {\r\n type = EBracketTypes.POST_TOP;\r\n }\r\n\r\n if (type === BracketTypeDisplayMap.CS) {\r\n type = EBracketTypes.CENTER_SUSPENSION;\r\n }\r\n\r\n if (type === EBracketTypes.CENTER_SUSPENSION)\r\n return (\r\n \r\n );\r\n\r\n if (type === EBracketTypes.POST_TOP)\r\n return (\r\n \r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst STREETLIGHT_ICON: React.FC = (\r\n props: IStreetlightIconProps\r\n) => {\r\n const { type, reported, className, bgFill, fill } = props;\r\n return renderIcon(\r\n `${className} streetlight-icon`,\r\n reported,\r\n type,\r\n bgFill,\r\n fill\r\n );\r\n};\r\n\r\nexport default STREETLIGHT_ICON;\r\n","import { IGlobalState } from \"../../state-management/slices/global/global.slice\";\r\nimport { ILookupsState } from \"../../state-management/slices/lookups/lookups.slice\";\r\nimport { IOutagesState } from \"../../state-management/slices/outages/outages.slice\";\r\nimport store from \"../../state-management/store\";\r\n\r\nexport const getGlobalState = (): IGlobalState => {\r\n const state = store.getState();\r\n return state.globalState;\r\n};\r\n\r\nexport const getOutagesState = (): IOutagesState => {\r\n const state = store.getState();\r\n return state.outages;\r\n};\r\n\r\nexport const getLookupsState = (): ILookupsState => {\r\n const state = store.getState();\r\n return state.lookups;\r\n};\r\n\r\nexport class TestWorker {\r\n url: string;\r\n onmessage: (msg?: string) => void;\r\n\r\n constructor(stringUrl: string) {\r\n this.url = stringUrl;\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n this.onmessage = () => {};\r\n }\r\n\r\n postMessage(msg: string): void {\r\n this.onmessage(msg);\r\n }\r\n}\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../../../theme/theme.types\";\r\n\r\ninterface AlignmentProps {\r\n justify?: string;\r\n}\r\n\r\nconst MainContainer = styled.div`\r\n &.popup-container {\r\n display: flex;\r\n font-family: ${(props) => props.theme?.fontFamilies?.regular};\r\n padding: 6px 10px 4px 0;\r\n > * + * {\r\n margin-left: 10px;\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n padding: 0;\r\n\r\n .close-button-container {\r\n margin-left: 0;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst IconContainer = styled.div`\r\n align-items: flex-start;\r\n display: flex;\r\n justify-content: ${({ justify }) => (justify ? justify : \"flex-start\")};\r\n width: 50px;\r\n\r\n &.close-button-container {\r\n justify-content: flex-end;\r\n }\r\n\r\n .corner-icon {\r\n height: 50px;\r\n margin-top: -6px;\r\n width: 50px;\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n .corner-icon {\r\n margin-top: 0;\r\n }\r\n }\r\n`;\r\n\r\nconst ContentContainer = styled.div`\r\n align-items: flex-start;\r\n flex: 1;\r\n margin-left: 10px;\r\n flex-direction: column;\r\n .title-container {\r\n .streetlight-id {\r\n margin-bottom: 8px;\r\n }\r\n }\r\n\r\n .sub-text {\r\n color: ${({ theme }) => theme.colors?.essential.grayDark};\r\n }\r\n .link-button-container {\r\n padding-bottom: 0;\r\n }\r\n`;\r\n\r\nconst ReportedContainer = styled.div`\r\n &.reported-container,\r\n &.extended-repair-container,\r\n &.non-ce-container {\r\n border-top: 1px solid ${({ theme }) => theme.colors?.grays.senary};\r\n align-items: flex-start;\r\n flex: 1;\r\n margin: 12px 10px 4px;\r\n padding-top: 12px;\r\n flex-direction: column;\r\n margin-left: -30px;\r\n ul {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n font-family: ${(props) => props.theme.fontFamilies.regular};\r\n font-size: ${({ theme }) => theme.utils.getFontThemeSize(\"small\")};\r\n .label {\r\n padding-right: 12px;\r\n width: 108px;\r\n display: inline-block;\r\n }\r\n }\r\n }\r\n\r\n &.reported-container {\r\n min-height: 100px;\r\n ul {\r\n .value {\r\n color: ${({ theme }) => theme.colors?.alerts.secondary};\r\n font-family: ${(props) => props.theme.fontFamilies.semiBold};\r\n }\r\n }\r\n }\r\n &.extended-repair-container {\r\n min-height: 128px;\r\n ul {\r\n .value {\r\n color: ${({ theme }) => theme.colors?.alerts.primary};\r\n font-family: ${(props) => props.theme.fontFamilies.semiBold};\r\n }\r\n }\r\n p {\r\n color: ${({ theme }) => theme.colors?.essential.grayDark};\r\n margin-top: 12px;\r\n max-width: 320px;\r\n font-size: ${({ theme }) => theme.utils.getFontThemeSize(\"smallest\")};\r\n font-style: italic;\r\n position: absolute;\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n max-width: 100%;\r\n }\r\n }\r\n }\r\n &.non-ce-container {\r\n min-height: 76px;\r\n p {\r\n color: ${({ theme }) => theme.colors?.essential.grayDark};\r\n margin-top: 0px;\r\n max-width: 300px;\r\n padding-bottom: 0;\r\n font-size: ${({ theme }) => theme.utils.getFontThemeSize(\"smallest\")};\r\n font-style: italic;\r\n position: absolute;\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n max-width: 100%;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst CloseButton = styled.button`\r\n background-color: transparent;\r\n border: 0 none;\r\n margin-top: 4px;\r\n padding: 0;\r\n`;\r\n\r\nexport default {\r\n CloseButton,\r\n ContentContainer,\r\n ReportedContainer,\r\n IconContainer,\r\n MainContainer,\r\n};\r\n","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 2266;","import styled from \"@emotion/styled\";\r\nimport { Col } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst Header = styled.header`\r\n &.ce-soar-header {\r\n background-color: ${(props) => props.theme?.colors?.brand.primary};\r\n height: ${(props) => props.theme?.layoutProperties?.headerHeight}px;\r\n padding: 20px;\r\n .container-fluid {\r\n padding-left: 16px;\r\n }\r\n\r\n &.mobile {\r\n .container-fluid {\r\n padding-left: 0;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst LogoColumn = styled(Col)`\r\n &.logo-column {\r\n display: inline-block;\r\n }\r\n`;\r\n\r\nconst TitleColumn = styled(Col)`\r\n &.title-column {\r\n display: inline-block;\r\n text-align: center;\r\n padding: 0 ${(props) => props.theme?.layoutProperties?.logoWidthDesktop}px 0\r\n 0;\r\n\r\n h1 {\r\n margin: 0;\r\n padding-right: ${(props) =>\r\n props.theme?.layoutProperties?.logoWidthDesktop}px;\r\n color: ${(props) => props.theme?.colors?.essential.white};\r\n font-size: ${(props) => props.theme.utils?.increaseFontSize(8)};\r\n font-weight: 900;\r\n }\r\n\r\n &.mobile {\r\n padding: 6px\r\n ${(props) => props.theme?.layoutProperties?.logoWidthMobile}px 0 0;\r\n h1 {\r\n font-size: ${(props) => props.theme.utils?.getFontThemeSize(\"base\")};\r\n padding-right: 0;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default { Header, TitleColumn, LogoColumn };\r\n","import Colors from \"../../theme/colors/Colors.palette\";\r\n\r\nexport interface ILogoProps {\r\n color?: string;\r\n width?: number;\r\n}\r\nexport interface ILogoStoryProps extends ILogoProps {\r\n backgroundColor?: string;\r\n isMobile?: boolean;\r\n}\r\n\r\nexport const DefaultLogoProps = {\r\n color: Colors.Essential.white,\r\n width: 150,\r\n};\r\n","import React, { ReactElement } from \"react\";\r\nimport { DefaultLogoProps, ILogoProps } from \"./Logo.types\";\r\n\r\nconst renderLogo = (props: ILogoProps): ReactElement => {\r\n const { color, width } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst DESKTOP_LOGO: React.FC = (props: ILogoProps) => {\r\n return renderLogo(props);\r\n};\r\n\r\nDESKTOP_LOGO.defaultProps = DefaultLogoProps;\r\nexport default DESKTOP_LOGO;\r\n","import React, { ReactElement } from \"react\";\r\nimport colors from \"../../theme/colors/Colors.palette\";\r\nimport { DefaultLogoProps, ILogoProps } from \"./Logo.types\";\r\n\r\nconst renderLogo = (props: ILogoProps): ReactElement => {\r\n const { color, width } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst MOBILE_LOGO: React.FC = (props: ILogoProps) => {\r\n return renderLogo(props);\r\n};\r\n\r\nMOBILE_LOGO.defaultProps = DefaultLogoProps;\r\nexport default MOBILE_LOGO;\r\n","import React from \"react\";\r\nimport { Container, Row } from \"react-bootstrap\";\r\nimport { DefaultHeaderProps, IHeaderProps } from \"./Header.types\";\r\nimport HeaderStyles from \"./Header.styles\";\r\nimport AppMedia from \"../../theme/utils/AppMedia\";\r\nimport DESKTOP_LOGO from \"../logo/DesktopLogo.component\";\r\nimport MOBILE_LOGO from \"../logo/MobileLogo.component\";\r\n\r\nconst { Media } = AppMedia;\r\n\r\nconst HEADER: React.FC = (props: IHeaderProps) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n

Streetlight Outages

\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n

Streetlight Outages

\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nHEADER.defaultProps = DefaultHeaderProps;\r\nexport default HEADER;\r\n","import { ITestableComponentProps } from \"../../shared/types/testing.types\";\r\n\r\nexport interface IHeaderProps extends ITestableComponentProps {\r\n isMobile?: boolean;\r\n}\r\n\r\nexport const DefaultHeaderProps = {\r\n isMobile: false,\r\n};\r\n","import React from \"react\";\r\nimport HEADER from \"../header/Header.component\";\r\nimport { IBaseLayoutProps } from \"./Layout.types\";\r\nimport LayoutStyles from \"./Layout.styles\";\r\n\r\nconst BASE_LAYOUT: React.FC = (props: IBaseLayoutProps) => {\r\n return (\r\n <>\r\n
\r\n {props.children}\r\n \r\n );\r\n};\r\nexport default BASE_LAYOUT;\r\n","import styled from \"@emotion/styled/macro\";\r\nimport { Container } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../theme/theme.types\";\r\n\r\nexport const ViewContainer = styled(Container)`\r\n &.cms-soar-view-container {\r\n margin: 1.5em initial;\r\n }\r\n`;\r\n","export default __webpack_public_path__ + \"static/media/zoom_in.4eceb8b1.svg\";","export default __webpack_public_path__ + \"static/media/zoom_out.e2529164.svg\";","export default __webpack_public_path__ + \"static/media/location_on.4bdf72e9.svg\";","export default __webpack_public_path__ + \"static/media/location_off.524874ca.svg\";","export default __webpack_public_path__ + \"static/media/search.c49d0694.svg\";","export default __webpack_public_path__ + \"static/media/cancel_dark.c4931ef8.svg\";","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\nimport ZoomInIcon from \"../../theme/assets/map-controls/zoom_in.svg\";\r\nimport ZoomOutIcon from \"../../theme/assets/map-controls/zoom_out.svg\";\r\nimport LocationOnIcon from \"../../theme/assets/map-controls/location_on.svg\";\r\nimport LocationOffIcon from \"../../theme/assets/map-controls/location_off.svg\";\r\nimport SearchIcon from \"../../theme/assets/map-controls/search.svg\";\r\nimport CancelIcon from \"../../theme/assets/map-controls/cancel_dark.svg\";\r\n\r\nconst MapContainer = styled.div`\r\n &.map-container {\r\n margin: 0;\r\n padding: 0;\r\n position: absolute;\r\n top: 75px;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n }\r\n`;\r\n\r\nconst BasemapGalleryContainer = styled.div`\r\n &.basemap-gallery-container {\r\n margin: 0;\r\n padding: 0;\r\n position: absolute;\r\n top: 184px;\r\n right: 56px;\r\n height: 300px;\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n height: 200px;\r\n right: 48px;\r\n top: 218px;\r\n }\r\n }\r\n`;\r\n\r\nconst SearchContainer = styled.div`\r\n &.search-container {\r\n background-color: #fff;\r\n width: 460px;\r\n margin: 20px;\r\n padding-left: 20px;\r\n height: 50px;\r\n\r\n .esri-icon-search {\r\n &:before {\r\n content: url(${SearchIcon});\r\n }\r\n }\r\n\r\n .esri-icon-close {\r\n &:before {\r\n content: url(${CancelIcon});\r\n }\r\n }\r\n\r\n .esri-input {\r\n font-family: ${(props) => props.theme?.fontFamilies?.regular};\r\n &:focus {\r\n outline: none;\r\n box-shadow: 0 0 5px 0 ${(props) => props.theme.colors?.brand.primary};\r\n }\r\n }\r\n\r\n .esri-search__suggestions-menu {\r\n font-family: ${(props) => props.theme?.fontFamilies?.regular};\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n width: 100%;\r\n margin: 0;\r\n .esri-input {\r\n font-size: ${(props) => props.theme.utils.getFontThemeSize(\"small\")};\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst LocationContainer = styled.div`\r\n &.location-container {\r\n &.user-enabled {\r\n .esri-icon-locate {\r\n &:before {\r\n content: url(${LocationOnIcon});\r\n }\r\n }\r\n }\r\n\r\n &.user-disabled {\r\n .esri-icon-locate {\r\n &:before {\r\n content: url(${LocationOffIcon});\r\n }\r\n }\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n display: block !important;\r\n top: 60px;\r\n right: 10px;\r\n\r\n .esri-icon {\r\n &.esri-icon-locate {\r\n margin-top: ${(props) =>\r\n props.theme.utils.browserUtils.isMobile ? \"8px\" : 0};\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst ZoomContainer = styled.div`\r\n &.zoom-container {\r\n .esri-icon-plus {\r\n &:before {\r\n content: url(${ZoomInIcon});\r\n }\r\n }\r\n .esri-icon-minus {\r\n height: 25px;\r\n &:before {\r\n content: url(${ZoomOutIcon});\r\n }\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n right: 10px;\r\n top: 102px;\r\n }\r\n\r\n // keep arouond in case we want to disable zooom\r\n /* &.disabled {\r\n background-color: #f3f3f3;\r\n .esri-widget--button {\r\n background-color: #f3f3f3;\r\n &:hover {\r\n background-color: #f3f3f3;\r\n cursor: initial;\r\n }\r\n\r\n .esri-icon-plus,\r\n .esri-icon-minus {\r\n color: #6e6e6e;\r\n opacity: 0.5;\r\n }\r\n }\r\n } */\r\n }\r\n`;\r\n\r\nconst PinModeContainer = styled.div`\r\n &.pin-mode-container {\r\n width: 32px;\r\n height: 32px;\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\r\n margin: 0;\r\n padding: 0;\r\n position: absolute;\r\n top: 216px;\r\n right: 20px;\r\n\r\n &.in-modal {\r\n position: initial;\r\n display: inline-block;\r\n margin: 0 6px;\r\n top: 0;\r\n left: 0;\r\n }\r\n\r\n &.inactive {\r\n background-color: ${(props) => props.theme.colors?.essential.white};\r\n &:hover {\r\n background-color: ${(props) => props.theme.colors?.essential.grayLight};\r\n }\r\n }\r\n\r\n &.active {\r\n box-shadow: 0 0 5px 0 #0179c0;\r\n background-color: ${(props) => props.theme.colors?.essential.grayLight};\r\n }\r\n\r\n .pin-mode-button {\r\n appearance: none;\r\n background: none;\r\n border: none;\r\n outline: none;\r\n margin: 0;\r\n padding: 0;\r\n width: 32px;\r\n height: 32px;\r\n position: relative;\r\n top: -5px;\r\n left: -5px;\r\n &:hover {\r\n appearance: none;\r\n background: none;\r\n border: none;\r\n outline: none;\r\n }\r\n\r\n .pin-icon {\r\n height: 42px;\r\n }\r\n\r\n .plus-icon {\r\n height: 12px;\r\n position: absolute;\r\n bottom: -10px;\r\n right: -10px;\r\n }\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n right: 10px;\r\n top: 252px;\r\n }\r\n }\r\n`;\r\n\r\nconst BasemapToggleContainer = styled.div`\r\n &.basemap-toggle-container {\r\n width: 32px;\r\n height: 32px;\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\r\n margin: 0;\r\n padding: 0;\r\n position: absolute;\r\n top: 260px;\r\n right: 20px;\r\n\r\n &.inactive {\r\n background-color: ${(props) => props.theme.colors?.essential.white};\r\n &:hover {\r\n background-color: ${(props) => props.theme.colors?.essential.grayLight};\r\n }\r\n }\r\n\r\n &.active {\r\n box-shadow: 0 0 5px 0 #0179c0;\r\n background-color: ${(props) => props.theme.colors?.essential.grayLight};\r\n }\r\n\r\n .basemap-toggle-button {\r\n appearance: none;\r\n background: none;\r\n border: none;\r\n outline: none;\r\n margin: 0;\r\n padding: 0;\r\n width: 32px;\r\n height: 32px;\r\n &:hover {\r\n appearance: none;\r\n background: none;\r\n border: none;\r\n outline: none;\r\n }\r\n\r\n img {\r\n margin-bottom: 2px;\r\n height: 24px;\r\n }\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n right: 10px;\r\n top: 296px;\r\n }\r\n }\r\n`;\r\n\r\nconst SearchOutagesContainer = styled.div`\r\n &.search-outages-container {\r\n position: absolute;\r\n bottom: 36px;\r\n left: 0;\r\n transition: all 300ms ease-out;\r\n opacity: 1;\r\n padding-left: 20px;\r\n button.lookup-button {\r\n color: ${(props) => props.theme.colors.brand.primary};\r\n border-color: ${(props) => props.theme.colors.brand.primary};\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\r\n\r\n &:hover {\r\n color: ${(props) => props.theme.colors.brand.secondary}!important;\r\n border-color: ${(props) =>\r\n props.theme.colors.brand.secondary}!important;\r\n cursor: pointer;\r\n }\r\n\r\n img {\r\n margin-right: 4px;\r\n width: 26px;\r\n }\r\n }\r\n\r\n &.hidden {\r\n opacity: 0;\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n bottom: 48px;\r\n text-align: initial;\r\n padding-right: 12px;\r\n padding-left: 12px;\r\n width: 100%;\r\n button.lookup-button {\r\n width: 100%;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst AdminFooterContainer = styled.div`\r\n &.admin-footer-container {\r\n background-color: ${(props) => props.theme.colors.essential.white};\r\n bottom: 16px;\r\n margin: 0;\r\n position: absolute;\r\n padding: 0;\r\n right: 0;\r\n\r\n footer {\r\n text-align: center;\r\n font-size: ${(props) => props.theme.fontSizes.smallest}px;\r\n padding: 4px;\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n left: 0;\r\n right: initial;\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n AdminFooterContainer,\r\n BasemapToggleContainer,\r\n MapContainer,\r\n BasemapGalleryContainer,\r\n SearchContainer,\r\n LocationContainer,\r\n ZoomContainer,\r\n PinModeContainer,\r\n SearchOutagesContainer,\r\n};\r\n","export const consoleSuccessStyle = `padding: 6px; color: green; border: 1px dotted green;`;\r\nexport const consoleErrorStyle = `padding: 6px; color: red; border: 1px dotted red;`;\r\n","import Locator from \"@arcgis/core/tasks/Locator\";\r\nimport MapView from \"@arcgis/core/views/MapView\";\r\nimport Locate from \"@arcgis/core/widgets/Locate\";\r\nimport { consoleSuccessStyle } from \"../../../shared/constants/logging.constants\";\r\nimport { LoggingService } from \"../../../shared/services/Logging.service\";\r\nimport {\r\n setUserLocationError,\r\n updateUserLocation,\r\n updateUserLocationError,\r\n} from \"../../../state-management/slices/global/global.slice\";\r\nimport { AppDispatch } from \"../../../state-management/store\";\r\nimport { LOCATOR_URL } from \"../Map.constants\";\r\nimport { IUserLocation } from \"../Map.types\";\r\nimport MapUtils from \"../Map.utils\";\r\n\r\n/*\r\n * @export\r\n * @class LocationWidget\r\n */\r\nexport class LocationWidget {\r\n private static instance: LocationWidget;\r\n private dispatch: AppDispatch;\r\n private mapView: MapView;\r\n private loggingService: LoggingService;\r\n private locatorTask: Locator;\r\n private locate!: Locate;\r\n\r\n /**\r\n * Creates an instance of LocationWidget.\r\n * @param {MapView} mapView\r\n * @param {AppDispatch} dispatch\r\n * @memberof LocationWidget\r\n */\r\n private constructor(mapView: MapView, dispatch: AppDispatch) {\r\n this.mapView = mapView;\r\n this.dispatch = dispatch;\r\n\r\n this.locatorTask = new Locator({\r\n url: LOCATOR_URL,\r\n });\r\n\r\n this.loggingService = LoggingService.getInstance(dispatch);\r\n this.buildLocationWidget();\r\n }\r\n\r\n /**\r\n * @private buildLocationWidget\r\n * @memberof LocationWidget\r\n */\r\n private buildLocationWidget(): void {\r\n this.locate = new Locate({\r\n container: \"locationContainer\",\r\n view: this.mapView,\r\n useHeadingEnabled: false,\r\n iconClass: \"esri-icon-navigation\",\r\n goToOverride: function (view, options) {\r\n options.target.scale = 1500;\r\n return view.goTo(options.target);\r\n },\r\n });\r\n\r\n this.mapView.ui.add(this.locate, {\r\n position: \"top-left\",\r\n index: 200,\r\n });\r\n\r\n // eslint-disable-next-line no-console\r\n console.info(\"%cLocation Widget Initialized\", consoleSuccessStyle);\r\n }\r\n\r\n /**\r\n * getLocate\r\n * @return {*} {Locate}\r\n * @memberof LocationWidget\r\n */\r\n public getLocate(): Locate {\r\n return this.locate;\r\n }\r\n\r\n /**\r\n * getLocatorTask\r\n * @return {*} {Locator}\r\n * @memberof LocationWidget\r\n */\r\n public getLocatorTask(): Locator {\r\n return this.locatorTask;\r\n }\r\n\r\n /**\r\n * getUserLocation\r\n * @memberof LocationWidget\r\n */\r\n public getUserLocation(): void {\r\n this.locate\r\n .locate()\r\n .then((position: GeolocationPosition) => {\r\n const userLocation: IUserLocation = {\r\n timestamp: position.timestamp,\r\n lat: position.coords.latitude,\r\n lng: position.coords.longitude,\r\n };\r\n\r\n this.dispatch(updateUserLocation(userLocation));\r\n })\r\n .catch((error: GeolocationPositionError) => {\r\n const locationError = MapUtils.getLocationError(error);\r\n // @todo: Add thunk to add logging of errors.\r\n this.dispatch(updateUserLocationError(locationError));\r\n });\r\n }\r\n\r\n /**\r\n * @static getInstance\r\n * @param {MapView} mapView\r\n * @param {AppDispatch} dispatch\r\n * @return {*} {LocationWidget}\r\n * @memberof LocationWidget\r\n */\r\n public static getInstance(\r\n mapView: MapView,\r\n dispatch: AppDispatch\r\n ): LocationWidget {\r\n if (!LocationWidget.instance) {\r\n LocationWidget.instance = new LocationWidget(mapView, dispatch);\r\n }\r\n\r\n return LocationWidget.instance;\r\n }\r\n}\r\n","import Zoom from \"@arcgis/core/widgets/Zoom\";\r\nimport MapView from \"@arcgis/core/views/MapView\";\r\nimport { consoleSuccessStyle } from \"../../../shared/constants/logging.constants\";\r\n\r\nexport class ZoomService {\r\n private static instance: ZoomService;\r\n private zoomWidget!: Zoom;\r\n private mapView: MapView;\r\n\r\n private constructor(mapView: MapView) {\r\n this.mapView = mapView;\r\n this.buildZoomWidget();\r\n }\r\n\r\n private buildZoomWidget(): void {\r\n this.zoomWidget = new Zoom({\r\n view: this.mapView,\r\n container: \"zoomContainer\",\r\n });\r\n\r\n this.mapView.ui.add(this.zoomWidget, {\r\n position: \"top-left\",\r\n index: 300,\r\n });\r\n\r\n // eslint-disable-next-line no-console\r\n console.info(\"%cZoom Widget Initialized\", consoleSuccessStyle);\r\n }\r\n\r\n public static getInstance(mapView: MapView): ZoomService {\r\n if (!ZoomService.instance) {\r\n ZoomService.instance = new ZoomService(mapView);\r\n }\r\n return ZoomService.instance;\r\n }\r\n\r\n public getZoomWidget(): Zoom {\r\n return this.zoomWidget;\r\n }\r\n}\r\n","import Search from \"@arcgis/core/widgets/Search\";\r\nimport { AppDispatch } from \"../../../state-management/store\";\r\nimport MapView from \"@arcgis/core/views/MapView\";\r\nimport { LoggingService } from \"../../../shared/services/Logging.service\";\r\nimport { ELogTypes } from \"../../../shared/enums/logging.enums\";\r\nimport { SearchSelectResultEvent } from \"../Map.types\";\r\nimport { consoleSuccessStyle } from \"../../../shared/constants/logging.constants\";\r\n\r\n/**\r\n * @export\r\n * @class SearchWidget\r\n */\r\nexport class SearchWidget {\r\n private static instance: SearchWidget;\r\n private searchWidget!: Search;\r\n private mapView: MapView;\r\n private loggingService: LoggingService;\r\n private dispatch: AppDispatch;\r\n private sendDataToGTM: any;\r\n\r\n /**\r\n * Creates an instance of SearchWidget.\r\n * @param {MapView} mapView\r\n * @param {AppDispatch} dispatch\r\n * @memberof SearchWidget\r\n */\r\n private constructor(\r\n mapView: MapView,\r\n dispatch: AppDispatch,\r\n sendDataToGTM: any\r\n ) {\r\n this.mapView = mapView;\r\n this.dispatch = dispatch;\r\n this.sendDataToGTM = sendDataToGTM;\r\n\r\n this.loggingService = LoggingService.getInstance(dispatch);\r\n this.buildSearchWidget();\r\n }\r\n\r\n /**\r\n * @private buildSearchWidget\r\n * @memberof SearchWidget\r\n */\r\n private buildSearchWidget(): void {\r\n this.searchWidget = new Search({\r\n view: this.mapView,\r\n container: \"searchContainer\",\r\n minSuggestCharacters: 3,\r\n popupEnabled: false,\r\n locationEnabled: false,\r\n goToOverride: function (view, options) {\r\n options.target.scale = 1500;\r\n return view.goTo(options.target);\r\n },\r\n });\r\n\r\n // Search widget does not have a placeholder prop, so\r\n // this is a trick to override that.\r\n this.searchWidget.watch(\"activeSource\", function (ctrl) {\r\n ctrl.placeholder = \"Search for a location\";\r\n });\r\n\r\n this.searchWidget.on(\"select-result\", (event: SearchSelectResultEvent) => {\r\n const { result } = event as any;\r\n const resultData = {\r\n name: result.name,\r\n feature: result.feature.toJSON(),\r\n extent: result.extent.toJSON(),\r\n };\r\n\r\n this.loggingService.logMessage({\r\n type: ELogTypes.SEARCH,\r\n message: `Search Query: ${result.name}`,\r\n data: resultData,\r\n });\r\n\r\n this.sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: `Search query executed ${result.name}`,\r\n });\r\n });\r\n\r\n this.mapView.ui.add(this.searchWidget, {\r\n position: \"top-left\",\r\n index: 300,\r\n });\r\n\r\n // eslint-disable-next-line no-console\r\n console.info(\"%cSearch Widget Initialized\", consoleSuccessStyle);\r\n }\r\n\r\n /**\r\n * @static getInstance\r\n * @param {MapView} mapView\r\n * @param {AppDispatch} dispatch\r\n * @return {*} {SearchWidget}\r\n * @memberof SearchWidget\r\n */\r\n public static getInstance(\r\n mapView: MapView,\r\n dispatch: AppDispatch,\r\n sendDataToGTM: any\r\n ): SearchWidget {\r\n if (!SearchWidget.instance) {\r\n SearchWidget.instance = new SearchWidget(\r\n mapView,\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n }\r\n return SearchWidget.instance;\r\n }\r\n\r\n /**\r\n * getSearchWidget\r\n * @return {*} {Search}\r\n * @memberof SearchWidget\r\n */\r\n public getSearchWidget(): Search {\r\n return this.searchWidget;\r\n }\r\n}\r\n","export default __webpack_public_path__ + \"static/media/pin-mode-marker.1cd28014.svg\";","export enum ECompletedReasons {\r\n DOES_NOT_EXIST = \"Streetlight DNE\",\r\n NON_CE = \"Non-CE Streetlight\",\r\n}\r\n","import Graphic from \"@arcgis/core/Graphic\";\r\nimport FeatureLayer from \"@arcgis/core/layers/FeatureLayer\";\r\nimport Map from \"@arcgis/core/Map\";\r\nimport UniqueValueRenderer from \"@arcgis/core/renderers/UniqueValueRenderer\";\r\nimport MapView from \"@arcgis/core/views/MapView\";\r\nimport Popup from \"@arcgis/core/widgets/Popup\";\r\nimport QueryTask from \"@arcgis/core/tasks/QueryTask\";\r\nimport Query from \"@arcgis/core/rest/support/Query\";\r\nimport Extent from \"@arcgis/core/geometry/Extent\";\r\nimport { Action, Dispatch } from \"@reduxjs/toolkit\";\r\nimport store, { AppDispatch } from \"../../state-management/store\";\r\nimport {\r\n EMarkerStatuses,\r\n MIN_SCALE,\r\n OUT_FIELDS,\r\n OVERLAY_LAYER_ID,\r\n PIN_MODE_LAYER_ID,\r\n} from \"./Map.constants\";\r\nimport {\r\n FeatureSet,\r\n IPolyFill,\r\n IStreetlightFields,\r\n ISymbol,\r\n SpatialReference,\r\n} from \"./Map.types\";\r\nimport { LocationWidget } from \"./widgets/LocationWidget\";\r\nimport StreetLightMarker from \"../../theme/assets/map-markers/dot_streetlight.svg\";\r\nimport ReportedStreetLightMarker from \"../../theme/assets/map-markers/dot_reported.svg\";\r\nimport ExtendedRepairMarker from \"../../theme/assets/map-markers/dot_extended-repair.svg\";\r\nimport NonCEMarker from \"../../theme/assets/map-markers/dot_non-ce.svg\";\r\nimport { OutageViewModel } from \"../../api/generated/models\";\r\n\r\nimport * as watchUtils from \"@arcgis/core/core/watchUtils\";\r\nimport { IAppConfig } from \"../../shared/types/config.types\";\r\nimport GraphicsLayer from \"@arcgis/core/layers/GraphicsLayer\";\r\nimport MapUtils from \"./Map.utils\";\r\nimport PinModeMarker from \"../../theme/assets/pin-mode-marker.svg\";\r\nimport SimpleRenderer from \"@arcgis/core/renderers/SimpleRenderer\";\r\nimport {\r\n setFeatureLayerInitialized,\r\n setOutageNotFound,\r\n updatePin,\r\n setRoutingOutage,\r\n setRoutingRoutineComplete,\r\n updateMarkerData,\r\n setRestrictedLayerInitialized,\r\n setGrandRapidsLayerInitialized,\r\n setSaginawLayerInitialized,\r\n setJacksonLayerInitialized,\r\n} from \"../../state-management/slices/global/global.slice\";\r\nimport Point from \"@arcgis/core/geometry/Point\";\r\nimport { ApiService } from \"../../api/api.service\";\r\nimport { isNullOrUndefined } from \"../../shared/utils/data.utils\";\r\nimport { ECompletedReasons } from \"../../shared/enums/outage.enums\";\r\n\r\nexport class FeatureLayerService {\r\n private static instance: FeatureLayerService;\r\n private dispatch: AppDispatch;\r\n private mapView: MapView;\r\n private locationWidget: LocationWidget;\r\n private pinModeLayer!: FeatureLayer;\r\n private streetlightLayer!: FeatureLayer;\r\n private restrictedLayer!: FeatureLayer;\r\n private grandRapidsLayer!: FeatureLayer;\r\n private saginawLayer!: FeatureLayer;\r\n private jacksonLayer!: FeatureLayer;\r\n private streetlightFields!: IStreetlightFields;\r\n private streetLightRenderer!: UniqueValueRenderer;\r\n private pinModeRenderer!: SimpleRenderer;\r\n private grandRapidsRenderer!: SimpleRenderer;\r\n private saginawRenderer!: SimpleRenderer;\r\n private jacksonRenderer!: SimpleRenderer;\r\n private streetlightSpatialReference!: SpatialReference;\r\n private overlayLayer!: GraphicsLayer;\r\n private popup!: Popup;\r\n private map!: Map;\r\n private streetlightSymbol!: ISymbol;\r\n private reportedSymbol!: ISymbol;\r\n private extendedRepairSymbol!: ISymbol;\r\n private nonCESymbol!: ISymbol;\r\n private pinModeSymbol!: ISymbol;\r\n private overlayFill!: IPolyFill;\r\n private featureLayerURL: string;\r\n private featureLayerID: string;\r\n private restrictedLayerURL: string;\r\n private grandRapidsLayerID: string;\r\n private grandRapidsLayerURL: string;\r\n private saginawLayerId: string;\r\n private saginlayerURL: string;\r\n private jacksonLayerId: string;\r\n private jacksonlayerURL: string;\r\n private restrictedLayerID: string;\r\n private appConfig: IAppConfig;\r\n private queryTask: QueryTask;\r\n private APIService: ApiService;\r\n\r\n /**\r\n * Creates an instance of FeatureLayerService.\r\n * @param {MapView} mapView\r\n * @param {AppDispatch} dispatch\r\n * @memberof FeatureLayerService\r\n */\r\n private constructor(\r\n map: Map,\r\n mapView: MapView,\r\n dispatch: AppDispatch,\r\n appConfig: IAppConfig,\r\n locationWidget: LocationWidget\r\n ) {\r\n this.map = map;\r\n this.mapView = mapView;\r\n this.dispatch = dispatch;\r\n this.APIService = ApiService.getInstance();\r\n\r\n this.appConfig = appConfig;\r\n this.featureLayerID = this.appConfig.esriStreetlightLayerId;\r\n this.restrictedLayerID = this.appConfig.esriRestrictedLayerId;\r\n this.grandRapidsLayerID = this.appConfig.esriGrandRapidsLayerId;\r\n this.saginawLayerId = this.appConfig.esriSaginawLayerId;\r\n this.jacksonLayerId = this.appConfig.esriJacksonLayerId;\r\n this.restrictedLayerURL = this.appConfig.esriRestrictedFeatureLayerUrl;\r\n this.grandRapidsLayerURL = this.appConfig.esriGrandRapidsLayerUrl;\r\n this.saginlayerURL = this.appConfig.esriSaginawLayerUrl;\r\n this.jacksonlayerURL = this.appConfig.esriJacksonLayerUrl;\r\n this.featureLayerURL = this.appConfig.esriFeatureLayerUrl;\r\n this.locationWidget = locationWidget;\r\n\r\n this.queryTask = new QueryTask({ url: `${this.featureLayerURL}` });\r\n\r\n this.buildPopup();\r\n this.buildSymbolMarkers();\r\n this.buildStreetlightRenderer();\r\n this.buildGrandRapidsRenderer();\r\n this.buildSaginawRenderer();\r\n this.buildJacksonRenderer();\r\n this.buildPinModeRenderer();\r\n }\r\n\r\n /**\r\n * @private buildPopup\r\n * @memberof FeatureLayerService\r\n */\r\n private buildPopup(): void {\r\n this.popup = new Popup({\r\n alignment: \"auto\",\r\n autoCloseEnabled: false,\r\n spinnerEnabled: false,\r\n id: \"DefaultPopup\",\r\n });\r\n this.mapView.popup = this.popup;\r\n }\r\n\r\n /**\r\n * @private buildSymbolMarkers\r\n * @memberof FeatureLayerService\r\n */\r\n private buildSymbolMarkers(): void {\r\n this.streetlightSymbol = {\r\n type: \"picture-marker\",\r\n url: StreetLightMarker,\r\n height: 12,\r\n width: 12,\r\n };\r\n\r\n this.reportedSymbol = {\r\n type: \"picture-marker\",\r\n url: ReportedStreetLightMarker,\r\n height: 12,\r\n width: 12,\r\n };\r\n\r\n this.extendedRepairSymbol = {\r\n type: \"picture-marker\",\r\n url: ExtendedRepairMarker,\r\n height: 12,\r\n width: 12,\r\n };\r\n\r\n this.nonCESymbol = {\r\n type: \"picture-marker\",\r\n url: NonCEMarker,\r\n height: 12,\r\n width: 12,\r\n };\r\n\r\n this.overlayFill = {\r\n type: \"simple-fill\",\r\n color: [0, 0, 0, 0.25],\r\n outline: null,\r\n };\r\n\r\n this.pinModeSymbol = {\r\n type: \"picture-marker\",\r\n url: PinModeMarker,\r\n height: 30,\r\n width: 21,\r\n };\r\n }\r\n\r\n /**\r\n * @private buildStreetlightRenderer\r\n * @memberof FeatureLayerService\r\n */\r\n private buildStreetlightRenderer(): void {\r\n this.streetLightRenderer = new UniqueValueRenderer({\r\n field: \"markerStatus\",\r\n defaultSymbol: this.streetlightSymbol,\r\n uniqueValueInfos: [\r\n {\r\n value: EMarkerStatuses.COMPLETED,\r\n symbol: this.streetlightSymbol,\r\n },\r\n {\r\n value: EMarkerStatuses.REPORTED,\r\n symbol: this.reportedSymbol,\r\n },\r\n {\r\n value: EMarkerStatuses.IN_PROGRESS,\r\n symbol: this.reportedSymbol,\r\n },\r\n {\r\n value: EMarkerStatuses.EXTENDED_REPAIR,\r\n symbol: this.extendedRepairSymbol,\r\n },\r\n {\r\n value: EMarkerStatuses.NON_CE,\r\n symbol: this.nonCESymbol,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n /**\r\n * @private buildPinModeRenderer\r\n * @memberof FeatureLayerService\r\n */\r\n private buildPinModeRenderer(): void {\r\n this.pinModeRenderer = new SimpleRenderer({\r\n symbol: this.pinModeSymbol,\r\n });\r\n }\r\n\r\n /**\r\n * @private buildGrandRapidsRenderer\r\n * @memberof FeatureLayerService\r\n */\r\n private buildGrandRapidsRenderer(): void {\r\n this.grandRapidsRenderer = new SimpleRenderer({\r\n symbol: this.nonCESymbol,\r\n });\r\n }\r\n\r\n /**\r\n * @private buildSaginawRenderer\r\n * @memberof FeatureLayerService\r\n */\r\n private buildSaginawRenderer(): void {\r\n this.saginawRenderer = new SimpleRenderer({\r\n symbol: this.nonCESymbol,\r\n });\r\n }\r\n\r\n /**\r\n * @private buildJacksonRenderer\r\n * @memberof FeatureLayerService\r\n */\r\n private buildJacksonRenderer(): void {\r\n this.jacksonRenderer = new SimpleRenderer({\r\n symbol: this.nonCESymbol,\r\n });\r\n }\r\n\r\n /**\r\n * buildOverlayLayer\r\n * @memberof FeatureLayerService\r\n */\r\n public buildOverlayLayer(): void {\r\n if (this.overlayLayer) {\r\n this.map.remove(this.overlayLayer);\r\n }\r\n\r\n const polygonGraphic = new Graphic({\r\n geometry: {\r\n type: \"polygon\",\r\n rings: [\r\n [-125.59570313, 49.66762782],\r\n [-65.04318237, 49.00634835],\r\n [-65.53001404, 24.50027046],\r\n [-123.92990112, 24.50027046],\r\n ],\r\n } as any,\r\n symbol: this.overlayFill,\r\n });\r\n\r\n this.overlayLayer = new GraphicsLayer({\r\n id: OVERLAY_LAYER_ID,\r\n graphics: [polygonGraphic],\r\n opacity: 0.0,\r\n });\r\n }\r\n\r\n /**\r\n * addOverlayLayer\r\n * @memberof FeatureLayerService\r\n */\r\n public addOverlayLayer(): void {\r\n this.map.add(this.overlayLayer, 1);\r\n }\r\n\r\n /**\r\n * removeOverlayLayer\r\n * @memberof FeatureLayerService\r\n */\r\n public removeOverlayLayer(): void {\r\n this.map.remove(this.overlayLayer);\r\n }\r\n\r\n /**\r\n * removePinModeGraphics\r\n * @memberof FeatureLayerService\r\n */\r\n public removePinModeGraphics = (): void => {\r\n this.pinModeLayer\r\n .queryFeatures(this.pinModeLayer.createQuery())\r\n .then((results) => {\r\n if (results.features.length) {\r\n this.pinModeLayer.applyEdits({\r\n deleteFeatures: results.features,\r\n });\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * removeNonCEGraphics\r\n * @memberof FeatureLayerService\r\n */\r\n public removeNonCEGraphics = (): void => {\r\n this.streetlightLayer\r\n .queryFeatures(this.streetlightLayer.createQuery())\r\n .then((results) => {\r\n const nonCELights: Graphic[] = [];\r\n if (results.features.length) {\r\n results.features.forEach((marker) => {\r\n const { markerStatus, GISID } = marker.attributes;\r\n if (\r\n markerStatus === EMarkerStatuses.DOES_NOT_EXIST ||\r\n isNullOrUndefined(GISID)\r\n ) {\r\n nonCELights.push(marker);\r\n }\r\n });\r\n }\r\n\r\n if (nonCELights.length) {\r\n this.streetlightLayer.applyEdits({\r\n deleteFeatures: nonCELights,\r\n });\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * removeMapViewGraphics\r\n * @memberof FeatureLayerService\r\n */\r\n public removeMapViewGraphics = (): void => {\r\n this.mapView.graphics.removeAll();\r\n };\r\n\r\n /**\r\n * fadeOverlay\r\n * @param {(\"on\" | \"off\")} opacity\r\n * @memberof FeatureLayerService\r\n */\r\n public fadeOverlay = (opacity: \"on\" | \"off\"): void => {\r\n const overlay = this.overlayLayer;\r\n const finalOpacity = opacity === \"on\" ? 1 : 0;\r\n const mapInstance = this.map;\r\n let animating = true;\r\n let currentOpacity = opacity === \"on\" ? 0 : 1;\r\n\r\n overlay.opacity = currentOpacity;\r\n function incrementOpacityByFrame() {\r\n if (opacity === \"on\") {\r\n if (currentOpacity >= finalOpacity && animating) {\r\n animating = false;\r\n return;\r\n }\r\n } else {\r\n if (currentOpacity <= finalOpacity && animating) {\r\n animating = false;\r\n mapInstance.remove(overlay);\r\n return;\r\n }\r\n }\r\n\r\n if (opacity === \"on\") {\r\n currentOpacity += 0.05;\r\n } else {\r\n currentOpacity -= 0.05;\r\n }\r\n\r\n overlay.opacity = currentOpacity;\r\n\r\n // Continue the animation at the next frame\r\n requestAnimationFrame(incrementOpacityByFrame);\r\n }\r\n\r\n this.mapView.whenLayerView(overlay).then((layerView) => {\r\n watchUtils.whenFalseOnce(layerView, \"updating\", (updating) => {\r\n requestAnimationFrame(incrementOpacityByFrame);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * @private buildRestrictedLayer\r\n * @memberof FeatureLayerService\r\n */\r\n private buildRestrictedLayer(): void {\r\n this.restrictedLayer = new FeatureLayer({\r\n id: this.restrictedLayerID,\r\n url: this.restrictedLayerURL,\r\n opacity: 0.2,\r\n });\r\n\r\n this.map.add(this.restrictedLayer, 1);\r\n this.dispatch(setRestrictedLayerInitialized(true));\r\n this.buildGrandRapidsLayer();\r\n this.buildSaginawLayer();\r\n this.buildJacksonLayer();\r\n }\r\n\r\n private buildGrandRapidsLayer(): void {\r\n this.grandRapidsLayer = new FeatureLayer({\r\n id: this.grandRapidsLayerID,\r\n outFields: OUT_FIELDS,\r\n minScale: MIN_SCALE,\r\n renderer: this.grandRapidsRenderer,\r\n url: this.grandRapidsLayerURL,\r\n geometryType: \"point\",\r\n popupTemplate: {\r\n actions: [],\r\n content: MapUtils.getGrandRapidsPopupContent(\r\n this.dispatch,\r\n this.mapView,\r\n this.popup,\r\n this.grandRapidsLayerID\r\n ),\r\n },\r\n });\r\n\r\n this.map.add(this.grandRapidsLayer, 2);\r\n this.dispatch(setGrandRapidsLayerInitialized(true));\r\n }\r\n\r\n private buildSaginawLayer(): void {\r\n this.saginawLayer = new FeatureLayer({\r\n id: this.saginawLayerId,\r\n outFields: OUT_FIELDS,\r\n minScale: MIN_SCALE,\r\n renderer: this.saginawRenderer,\r\n url: this.saginlayerURL,\r\n geometryType: \"point\",\r\n popupTemplate: {\r\n actions: [],\r\n content: MapUtils.getGrandRapidsPopupContent(\r\n this.dispatch,\r\n this.mapView,\r\n this.popup,\r\n this.saginawLayerId\r\n ),\r\n },\r\n });\r\n\r\n this.map.add(this.saginawLayer, 2);\r\n this.dispatch(setSaginawLayerInitialized(true));\r\n }\r\n\r\n private buildJacksonLayer(): void {\r\n this.jacksonLayer = new FeatureLayer({\r\n id: this.jacksonLayerId,\r\n outFields: OUT_FIELDS,\r\n minScale: MIN_SCALE,\r\n renderer: this.jacksonRenderer,\r\n url: this.jacksonlayerURL,\r\n geometryType: \"point\",\r\n popupTemplate: {\r\n actions: [],\r\n content: MapUtils.getGrandRapidsPopupContent(\r\n this.dispatch,\r\n this.mapView,\r\n this.popup,\r\n this.jacksonLayerId\r\n ),\r\n },\r\n });\r\n\r\n this.map.add(this.jacksonLayer, 2);\r\n this.dispatch(setJacksonLayerInitialized(true));\r\n }\r\n\r\n /**\r\n * buildFeatureLayer\r\n * @private\r\n * @memberof FeatureLayerService\r\n */\r\n private buildFeatureLayer(): void {\r\n const currentState = store.getState();\r\n const { routing } = currentState.globalState.ui;\r\n const { outageCollection } = currentState.outages;\r\n\r\n this.streetlightLayer = new FeatureLayer({\r\n id: this.featureLayerID,\r\n outFields: OUT_FIELDS,\r\n minScale: MIN_SCALE,\r\n fields: this.streetlightFields,\r\n renderer: this.streetLightRenderer,\r\n spatialReference: this.streetlightSpatialReference,\r\n geometryType: \"point\",\r\n popupTemplate: {\r\n actions: [],\r\n content: MapUtils.getPopupContent(\r\n this.dispatch,\r\n this.mapView,\r\n this.popup,\r\n this.featureLayerID\r\n ),\r\n },\r\n });\r\n\r\n this.streetlightLayer.source = [] as any;\r\n this.map.add(this.streetlightLayer, 0);\r\n\r\n this.dispatch(setFeatureLayerInitialized(true));\r\n this.buildRestrictedLayer();\r\n\r\n if (\r\n !isNullOrUndefined(routing.outageId) &&\r\n !routing.routeNavigationComplete\r\n ) {\r\n const { outagesApi } = this.APIService;\r\n const outageId = parseInt(routing.outageId);\r\n let routeOutage: any = null;\r\n\r\n outagesApi\r\n .getOutageById(outageId)\r\n .then((outage: OutageViewModel) => {\r\n if (outage && outage.location && outage.location.coordinates) {\r\n routeOutage = outage;\r\n }\r\n })\r\n .finally(() => {\r\n if (routeOutage) {\r\n this.centerMapToLocation(routeOutage);\r\n } else {\r\n this.dispatch(setOutageNotFound(true));\r\n this.locationWidget.getUserLocation();\r\n }\r\n });\r\n } else {\r\n this.locationWidget.getUserLocation();\r\n }\r\n }\r\n\r\n /**\r\n * @private buildPinModeLayer\r\n * @memberof FeatureLayerService\r\n */\r\n public async buildPinModeLayer(): Promise {\r\n this.pinModeLayer = new FeatureLayer({\r\n id: PIN_MODE_LAYER_ID,\r\n outFields: OUT_FIELDS,\r\n minScale: MIN_SCALE,\r\n fields: this.streetlightFields,\r\n renderer: this.pinModeRenderer,\r\n spatialReference: this.streetlightSpatialReference,\r\n geometryType: \"point\",\r\n popupTemplate: {\r\n actions: [],\r\n content: MapUtils.getPopupContent(\r\n this.dispatch,\r\n this.mapView,\r\n this.popup,\r\n this.featureLayerID\r\n ),\r\n },\r\n });\r\n\r\n this.pinModeLayer.source = [] as any;\r\n this.map.add(this.pinModeLayer, 2);\r\n }\r\n\r\n /**\r\n * queryFeatureLayer\r\n * @param {Extent} currentExtent\r\n * @return {*} {Promise}\r\n * @memberof FeatureLayerService\r\n *\r\n * @note First, we query the feature layer once so that we\r\n * can THEN get the fields and spatialReference from the featureLayer and store them.\r\n * FINALLY, we build the feature layer\r\n */\r\n public async queryFeatureLayer(currentExtent: Extent): Promise {\r\n const params = new Query({\r\n geometry: currentExtent,\r\n returnGeometry: true,\r\n returnExceededLimitFeatures: true,\r\n orderByFields: [\"OBJECTID\"],\r\n num: 1,\r\n outFields: [\"*\"],\r\n where: \"1 = 1\",\r\n });\r\n\r\n await this.queryTask\r\n .execute(params)\r\n .then((featureSet: FeatureSet) => {\r\n const { fields, spatialReference } = featureSet;\r\n this.streetlightSpatialReference = spatialReference;\r\n this.streetlightFields = [\r\n ...fields,\r\n {\r\n name: \"markerStatus\",\r\n type: \"string\",\r\n },\r\n ];\r\n })\r\n .catch((error) => {\r\n if (error) {\r\n console.log(error);\r\n }\r\n return Promise.reject();\r\n })\r\n .finally(() => {\r\n this.buildFeatureLayer();\r\n return Promise.resolve();\r\n });\r\n }\r\n\r\n public centerMapToLocation(outage: OutageViewModel): void {\r\n const latitude = outage.location?.coordinates?.latitude;\r\n const longitude = outage.location?.coordinates?.longitude;\r\n\r\n if (!latitude || !longitude) {\r\n return;\r\n }\r\n\r\n this.mapView\r\n .goTo({\r\n center: [longitude, latitude],\r\n scale: 1000,\r\n })\r\n .finally(async () => {\r\n this.dispatch(setRoutingOutage(outage));\r\n });\r\n }\r\n\r\n private renderRoutingPopup = async (\r\n gisOutageData: any,\r\n outageData: OutageViewModel\r\n ): Promise => {\r\n const { attributes } = gisOutageData;\r\n\r\n const mapPoint = new Point({\r\n latitude: attributes.LATITUDE,\r\n longitude: attributes.LONGITUDE,\r\n });\r\n\r\n const geoLocResponse = await MapUtils.fetchGeoLocData(mapPoint);\r\n const xStreetsResponse = await MapUtils.fetchCrossStreets(mapPoint);\r\n const { streetAddress, geoLocPayload } = MapUtils.buildGeoLocPayload(\r\n geoLocResponse,\r\n xStreetsResponse\r\n );\r\n\r\n this.mapView.popup.open({\r\n location: mapPoint,\r\n content: MapUtils.getRoutingPopupContent(\r\n this.mapView,\r\n streetAddress,\r\n outageData,\r\n this.removeMapViewGraphics\r\n ) as any,\r\n });\r\n };\r\n\r\n /**\r\n * @private updateFeatureLayer\r\n * @param {Array} data\r\n * @memberof FeatureLayerService\r\n */\r\n private updateFeatureLayer = async (\r\n data: Array,\r\n outages: Array\r\n ): Promise => {\r\n // If we dont have data... reject and return\r\n if ((!data || !data.length) && (!outages || !outages.length))\r\n return Promise.reject();\r\n\r\n let droppedPins = null;\r\n let updates = null;\r\n let droppedPinUpdates = null;\r\n let features: any[] | null = null;\r\n\r\n /**\r\n * IF we have outages in azure, we filter out any that are dropped pins.\r\n * THEN, IF we have dropped pins, we create a new Graphic object for each one of them,\r\n * and create a new ARRAY out of them\r\n *\r\n * @todo: Consider creating a seperate utility for this\r\n * @let droppedPinUpdates\r\n */\r\n if (outages.length) {\r\n droppedPins = outages.filter((outage: OutageViewModel) => {\r\n const { completedReason } = outage;\r\n\r\n return (\r\n isNullOrUndefined(outage.location?.locationId) &&\r\n (completedReason === ECompletedReasons.NON_CE ||\r\n isNullOrUndefined(completedReason))\r\n );\r\n });\r\n\r\n if (droppedPins.length) {\r\n droppedPinUpdates = droppedPins.map((pin) => {\r\n return new Graphic({\r\n geometry: new Point({\r\n longitude: pin.location?.coordinates?.longitude,\r\n latitude: pin.location?.coordinates?.latitude,\r\n }),\r\n attributes: {\r\n LATITUDE: pin.location?.coordinates?.latitude,\r\n LONGITUDE: pin.location?.coordinates?.longitude,\r\n LAMPTYPE: pin.utility?.lampType,\r\n FIXTURESUP: pin.utility?.bracketType,\r\n markerStatus: pin.markerStatus,\r\n },\r\n symbol: this.reportedSymbol,\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * We map over all of our data from GIS.\r\n * FOR EACH item in GIS data, WE map over azure data and check\r\n * for a match based on LOCATION ID(Azure) and GISID(GIS).\r\n * We build a new Graphic object for each record,\r\n * adding markerStatus attribute for the ones that are a match.\r\n *\r\n * @constant updates\r\n */\r\n\r\n if (data && data.length) {\r\n updates = data.map((feature: any) => {\r\n const { geometry, attributes } = feature;\r\n let markerStatus: EMarkerStatuses = EMarkerStatuses.COMPLETED;\r\n if (outages.length) {\r\n outages.forEach((outage: OutageViewModel) => {\r\n if (outage.location?.locationId === attributes.GISID) {\r\n // eslint-disable-next-line prefer-destructuring\r\n markerStatus = outage.markerStatus as EMarkerStatuses;\r\n }\r\n });\r\n }\r\n\r\n return new Graphic({\r\n geometry,\r\n attributes: {\r\n ...attributes,\r\n markerStatus,\r\n },\r\n });\r\n });\r\n }\r\n\r\n // IF we have dropped pin markers, we merge those into our\r\n // updates ARRAY that was built above. Otherwise, we just use\r\n // the updates ARRAY. If we've made it here and we have no data,\r\n // Reject the promise and return.\r\n if (droppedPinUpdates?.length) {\r\n if (updates?.length) {\r\n features = updates.concat(droppedPinUpdates);\r\n } else {\r\n features = droppedPinUpdates;\r\n }\r\n } else {\r\n if (updates?.length) {\r\n features = updates;\r\n } else {\r\n return Promise.reject();\r\n }\r\n }\r\n\r\n // APPLY Updates to map feature layer.\r\n return this.streetlightLayer\r\n .applyEdits({\r\n addFeatures: [...features],\r\n })\r\n .finally(() => {\r\n // FINALLY, once our feature layer was updated, we check to\r\n // see if we are in our ROUTING ROUTINE, meaning, if we are\r\n // currently routing by URL Parameter. IF we are, we select\r\n // that marker, and open it's popup.\r\n const { ui } = store.getState().globalState;\r\n const {\r\n routeNavigationComplete,\r\n selectedOutage,\r\n routingRoutineComplete,\r\n } = ui.routing;\r\n\r\n if (\r\n routeNavigationComplete &&\r\n selectedOutage &&\r\n !routingRoutineComplete\r\n ) {\r\n let gisOutageData = null;\r\n\r\n if (features && features.length) {\r\n gisOutageData = features.find(\r\n (gisOutage: any, index: number, obj: any[]) => {\r\n const { attributes } = gisOutage;\r\n const { location } = selectedOutage;\r\n\r\n /**\r\n * If we do not have a locationID, that means it's\r\n * a dropped pin so we need to compare latitude and longitude\r\n */\r\n if (location && !location.locationId) {\r\n if (\r\n location?.coordinates?.latitude === attributes.LATITUDE &&\r\n location?.coordinates?.longitude === attributes.LONGITUDE\r\n ) {\r\n return gisOutage;\r\n }\r\n }\r\n /**\r\n * If we have a locationID, then we compare the locationId to\r\n * GISID for a match\r\n */\r\n if (\r\n location &&\r\n location?.locationId &&\r\n attributes.GISID === location?.locationId\r\n ) {\r\n return gisOutage;\r\n }\r\n }\r\n );\r\n }\r\n\r\n if (gisOutageData) {\r\n const { attributes } = gisOutageData;\r\n gisOutageData.symbol = MapUtils.getMarkerByStatus(\r\n attributes.markerStatus,\r\n true\r\n );\r\n\r\n this.removeMapViewGraphics();\r\n this.mapView.graphics.add(gisOutageData);\r\n this.dispatch(\r\n updateMarkerData({\r\n attributes: gisOutageData.attributes,\r\n })\r\n );\r\n\r\n this.renderRoutingPopup(gisOutageData, selectedOutage);\r\n this.dispatch(setRoutingRoutineComplete(true));\r\n }\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * addMarker\r\n * @param {__esri.Point} mapPoint\r\n * @memberof FeatureLayerService\r\n */\r\n public addMarker = async (mapPoint: __esri.Point): Promise => {\r\n const attributes = {\r\n LATITUDE: mapPoint.latitude,\r\n LONGITUDE: mapPoint.longitude,\r\n markerStatus: \"\",\r\n };\r\n\r\n const markerData = {\r\n attributes,\r\n };\r\n\r\n await this.pinModeLayer\r\n .queryFeatures(this.pinModeLayer.createQuery())\r\n .then((results) => {\r\n if (results.features.length) {\r\n this.pinModeLayer.applyEdits({\r\n deleteFeatures: results.features,\r\n });\r\n }\r\n\r\n this.pinModeLayer.applyEdits({\r\n addFeatures: [\r\n new Graphic({\r\n geometry: new Point({\r\n longitude: mapPoint.longitude,\r\n latitude: mapPoint.latitude,\r\n }),\r\n attributes,\r\n symbol: this.pinModeSymbol,\r\n }),\r\n ],\r\n });\r\n })\r\n .finally(async () => {\r\n const geoLocResponse = await MapUtils.fetchGeoLocData(mapPoint);\r\n const xStreetsResponse = await MapUtils.fetchCrossStreets(mapPoint);\r\n const { streetAddress, geoLocPayload } = MapUtils.buildGeoLocPayload(\r\n geoLocResponse,\r\n xStreetsResponse\r\n );\r\n\r\n // Update state\r\n this.dispatch(updatePin(geoLocPayload, markerData));\r\n\r\n this.mapView.popup.open({\r\n location: mapPoint,\r\n content: MapUtils.getPinModePopupContent(\r\n this.mapView,\r\n streetAddress,\r\n this.removePinModeGraphics\r\n ) as any,\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * fetchFeatureLayer\r\n * @param {Extent} currentExtent\r\n * @memberof FeatureLayerService\r\n */\r\n public fetchFeatureLayer = async (\r\n currentExtent: Extent,\r\n outages: Array\r\n ): Promise => {\r\n if (!this.streetlightLayer) {\r\n return Promise.resolve();\r\n }\r\n\r\n const params = new Query({\r\n geometry: currentExtent,\r\n returnGeometry: true,\r\n returnExceededLimitFeatures: true,\r\n outFields: [\"*\"],\r\n orderByFields: [\"OBJECTID\"],\r\n where: \"1 = 1\",\r\n });\r\n\r\n await this.queryTask\r\n .execute(params)\r\n .then((featureSet: FeatureSet) =>\r\n this.updateFeatureLayer(featureSet.features, outages)\r\n )\r\n .catch((error) => {\r\n if (error) {\r\n console.log(error);\r\n }\r\n })\r\n .finally(() => {\r\n return Promise.resolve();\r\n });\r\n };\r\n\r\n public getFeatureById = async (\r\n gisID: number\r\n ): Promise => {\r\n return await this.streetlightLayer\r\n .queryFeatures(this.streetlightLayer.createQuery())\r\n .then((results) => {\r\n const { features } = results;\r\n return features.find((feature) => {\r\n return feature.attributes.GISID === gisID;\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * getStreetlightsLayer\r\n * @return {*} {FeatureLayer}\r\n * @memberof FeatureLayerService\r\n */\r\n public getStreetlightsLayer(): FeatureLayer {\r\n return this.streetlightLayer;\r\n }\r\n\r\n /**\r\n * getPinModeLayer\r\n * @return {*} {FeatureLayer}\r\n * @memberof FeatureLayerService\r\n */\r\n public getPinModeLayer(): FeatureLayer {\r\n return this.pinModeLayer;\r\n }\r\n\r\n /**\r\n * getRestrictedLayer\r\n * @return {*} {FeatureLayer}\r\n * @memberof FeatureLayerService\r\n */\r\n public getRestrictedLayer(): FeatureLayer {\r\n return this.restrictedLayer;\r\n }\r\n\r\n /**\r\n * getGrandRapidsLayer\r\n * @return {*} {FeatureLayer}\r\n * @memberof FeatureLayerService\r\n */\r\n public getGrandRapidsLayer(): FeatureLayer {\r\n return this.grandRapidsLayer;\r\n }\r\n\r\n /**\r\n * @static\r\n * @param {MapView} mapView\r\n * @param {Dispatch>} dispatch\r\n * @return {*} {FeatureLayerService}\r\n * @memberof FeatureLayerService\r\n */\r\n public static getInstance(\r\n map: Map,\r\n mapView: MapView,\r\n dispatch: Dispatch>,\r\n appConfig: IAppConfig,\r\n locationWidget: LocationWidget\r\n ): FeatureLayerService {\r\n if (!FeatureLayerService.instance) {\r\n FeatureLayerService.instance = new FeatureLayerService(\r\n map,\r\n mapView,\r\n dispatch,\r\n appConfig,\r\n locationWidget\r\n );\r\n }\r\n\r\n return FeatureLayerService.instance;\r\n }\r\n}\r\n","import MapView from \"@arcgis/core/views/MapView\";\r\nimport Map from \"@arcgis/core/Map\";\r\nimport {\r\n DEFAULT_CENTER_POINT,\r\n DEFAULT_ZOOM_LEVEL_DESKTOP,\r\n DEFAULT_ZOOM_LEVEL_MOBILE,\r\n EMarkerStatuses,\r\n PIN_MODE_LAYER_ID,\r\n} from \"./Map.constants\";\r\nimport {\r\n MapHitTestResultResults,\r\n MapRefContainer,\r\n MapViewClickEvent,\r\n MapViewPointerMoveEvent,\r\n} from \"./Map.types\";\r\nimport Basemap from \"@arcgis/core/Basemap\";\r\nimport BasemapGallery from \"@arcgis/core/widgets/BasemapGallery\";\r\nimport FeatureLayer from \"@arcgis/core/layers/FeatureLayer\";\r\nimport * as watchUtils from \"@arcgis/core/core/watchUtils\";\r\nimport { Action, Dispatch } from \"@reduxjs/toolkit\";\r\nimport store, { AppDispatch } from \"../../state-management/store\";\r\nimport { LocationWidget } from \"./widgets/LocationWidget\";\r\nimport { ZoomService } from \"./widgets/ZoomWidget\";\r\n\r\nimport { SearchWidget } from \"./widgets/SearchWidget\";\r\nimport {\r\n setBaseMapInitialized,\r\n updateMarkerData,\r\n} from \"../../state-management/slices/global/global.slice\";\r\nimport { FeatureLayerService } from \"./FeatureLayer.service\";\r\nimport { ApiService } from \"../../api/api.service\";\r\nimport { DispatchLogger } from \"../../state-management/utils/dispatch-logger/DispatchLogger\";\r\nimport MapUtils from \"./Map.utils\";\r\nimport Extent from \"@arcgis/core/geometry/Extent\";\r\nimport { isMobile } from \"react-device-detect\";\r\nimport { EGoogleEventTypes, ELogTypes } from \"../../shared/enums/logging.enums\";\r\nimport { IAppConfig } from \"../../shared/types/config.types\";\r\nimport { getGlobalState } from \"../../shared/utils/testing.utils\";\r\nimport PinModeMarker from \"../../theme/assets/pin-mode-marker.svg\";\r\n\r\nimport {\r\n consoleErrorStyle,\r\n consoleSuccessStyle,\r\n} from \"../../shared/constants/logging.constants\";\r\n\r\nexport class BaseMapService {\r\n private static instance: BaseMapService;\r\n private streetlightsLayer!: FeatureLayer;\r\n private pinModeLayer!: FeatureLayer;\r\n private restrictedLayer!: FeatureLayer;\r\n private grandRapidsLayer!: FeatureLayer;\r\n private mapView!: MapView;\r\n private searchWidget!: SearchWidget;\r\n private locationWidget!: LocationWidget;\r\n private basemapGallery!: BasemapGallery;\r\n private featureLayerService!: FeatureLayerService;\r\n private zoomWidget!: ZoomService;\r\n private currentExtent!: any;\r\n private appConfig!: IAppConfig;\r\n private featureLayerID!: string;\r\n private restrictedLayerID!: string;\r\n private grandRapidsLayerID!: string;\r\n private map: Map;\r\n private dispatch: AppDispatch;\r\n private APIService: ApiService;\r\n private dispatchLogger: DispatchLogger;\r\n private sendDataToGTM: any;\r\n\r\n /**\r\n * Creates an instance of BaseMapService.\r\n * @param {AppDispatch} dispatch\r\n * @memberof BaseMapService\r\n */\r\n private constructor(dispatch: AppDispatch, sendDataToGTM: any) {\r\n this.dispatch = dispatch;\r\n this.sendDataToGTM = sendDataToGTM;\r\n this.dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n this.APIService = ApiService.getInstance();\r\n this.map = this.buildMap();\r\n }\r\n\r\n /**\r\n * @private buildMap\r\n * @return {*} {WebMap}\r\n * @memberof BaseMapService\r\n */\r\n private buildMap(): Map {\r\n return new Map({\r\n basemap: \"gray-vector\",\r\n });\r\n }\r\n\r\n /**\r\n * initializeMapView\r\n * @param {MapRefContainer} mapContainer\r\n * @param {IAppConfig} appConfig\r\n * @memberof BaseMapService\r\n */\r\n public initializeMapView(\r\n mapContainer: MapRefContainer,\r\n basemapGalleryContainer: MapRefContainer,\r\n appConfig: IAppConfig\r\n ): void {\r\n if (this.mapView) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\"[WARNING] MAP VIEW ALREADY INITIALIZED: \", {\r\n ...this.mapView,\r\n });\r\n return;\r\n }\r\n\r\n this.appConfig = appConfig;\r\n this.featureLayerID = appConfig.esriStreetlightLayerId;\r\n this.grandRapidsLayerID = appConfig.esriGrandRapidsLayerId;\r\n this.restrictedLayerID = appConfig.esriRestrictedLayerId;\r\n\r\n this.mapView = new MapView({\r\n map: this.map,\r\n container: mapContainer.current,\r\n center: DEFAULT_CENTER_POINT,\r\n zoom: isMobile ? DEFAULT_ZOOM_LEVEL_MOBILE : DEFAULT_ZOOM_LEVEL_DESKTOP,\r\n constraints: {\r\n rotationEnabled: false,\r\n minZoom: isMobile\r\n ? DEFAULT_ZOOM_LEVEL_MOBILE\r\n : DEFAULT_ZOOM_LEVEL_DESKTOP,\r\n maxZoom: 20,\r\n },\r\n highlightOptions: {\r\n fillOpacity: 0,\r\n haloOpacity: 0,\r\n },\r\n ui: {\r\n components: [\"attribution\"],\r\n },\r\n });\r\n\r\n this.buildWidgets(basemapGalleryContainer);\r\n this.initializeFeatureLayerService();\r\n this.addHandlers();\r\n }\r\n\r\n /**\r\n * @private addHandlers\r\n * @memberof BaseMapService\r\n * @description Attaches handlers for mapView life cycle and interaction events\r\n */\r\n private addHandlers() {\r\n this.mapView\r\n .when(() => this.mapViewLoadComplete())\r\n .finally(() => {\r\n // eslint-disable-next-line no-console\r\n console.info(\"%cMapView Initialized\", consoleSuccessStyle);\r\n this.dispatch(setBaseMapInitialized(true));\r\n })\r\n .catch((reason: any) => this.mapViewLoadErrorHandler(reason));\r\n\r\n this.mapView.on(\"click\", (event) => this.mapViewClickHandler(event));\r\n this.mapView.on(\"pointer-move\", (event) =>\r\n this.mapViewPointerMovedHandler(event)\r\n );\r\n\r\n watchUtils.whenTrue(this.mapView, \"stationary\", () =>\r\n this.mapViewMoveComplete()\r\n );\r\n }\r\n\r\n /**\r\n * @private mapViewLoadComplete\r\n * @memberof BaseMapService\r\n * @description Called when mapView is completely loaded. Only called once on initial load.\r\n */\r\n private mapViewLoadComplete = (): Promise => {\r\n MapUtils.renderLocationButtonIcon();\r\n this.currentExtent = this.mapView.extent;\r\n this.featureLayerService.queryFeatureLayer(this.currentExtent);\r\n return Promise.resolve();\r\n };\r\n\r\n /**\r\n * @private mapViewMoveComplete\r\n * @memberof BaseMapService\r\n * @description Called when the map is stationary after any map movement has occured.\r\n * Gets the new extent of the view only when view is stationary.\r\n */\r\n private mapViewMoveComplete = (): void => {\r\n const currentState = store.getState();\r\n const { routing } = currentState.globalState.ui;\r\n\r\n if (routing.outageId && !routing.routeNavigationComplete) {\r\n return;\r\n }\r\n\r\n if (this.mapView.extent) {\r\n this.currentExtent = this.mapView.extent;\r\n this.processExtent();\r\n }\r\n };\r\n\r\n /**\r\n * @private mapViewLoadErrorHandler\r\n * @param {*} reason\r\n * @memberof BaseMapService\r\n * @description Called if there is a problem loading the mapView\r\n */\r\n private mapViewLoadErrorHandler = (reason: any): void => {\r\n // eslint-disable-next-line no-console\r\n console.error(\r\n `MapView Initialization Failed: ${reason}`,\r\n consoleErrorStyle\r\n );\r\n\r\n this.dispatchLogger.fire(null, reason, {\r\n message: \"Map View Loading Failed\",\r\n type: ELogTypes.ERROR,\r\n data: { reason },\r\n });\r\n\r\n this.sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: `Map Load Error: Reason: ${reason}`,\r\n });\r\n };\r\n\r\n /**\r\n * @private mapViewPointerMovedHandler\r\n * @param {MapViewPointerMoveEvent} event\r\n * @memberof BaseMapService\r\n * @description Called every time the user's pointer moves over the map. We then call a\r\n * hitTest method that allows us to detect features below the pointer and change the user's cursor\r\n */\r\n private mapViewPointerMovedHandler = (event: MapViewPointerMoveEvent) => {\r\n this.mapView.hitTest(event).then((response) => {\r\n const container = document.getElementById(\"MapContainer\");\r\n const { ui } = getGlobalState();\r\n const pinModeEnabled = ui.pinMode.enabled;\r\n\r\n if (response.results.length) {\r\n const streetlightLayer = response.results.filter((feature) => {\r\n return feature.graphic.layer.id === this.featureLayerID;\r\n });\r\n const grandRapidsLayer = response.results.filter((feature) => {\r\n return feature.graphic.layer.id === this.grandRapidsLayerID;\r\n });\r\n const restrictedLayer = response.results.filter((feature) => {\r\n return feature.graphic.layer.id === this.restrictedLayerID;\r\n });\r\n\r\n if (container) {\r\n if (pinModeEnabled) {\r\n if (restrictedLayer.length) {\r\n container.style.cursor = \"not-allowed\";\r\n } else {\r\n container.style.cursor = `url(${PinModeMarker}) 12 16, pointer`;\r\n }\r\n } else {\r\n if (streetlightLayer.length || grandRapidsLayer.length) {\r\n container.style.cursor = \"pointer\";\r\n } else if (restrictedLayer.length) {\r\n container.style.cursor = \"not-allowed\";\r\n } else {\r\n container.style.cursor = \"default\";\r\n }\r\n }\r\n }\r\n } else {\r\n if (container) {\r\n container.style.cursor = \"default\";\r\n }\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @private mapViewClickHandler\r\n * @param {MapViewClickEvent} event\r\n * @memberof BaseMapService\r\n * @description Called when the map is clicked. We then call a hitTest method that allows\r\n * us to detect which streetlight was clicked\r\n */\r\n private mapViewClickHandler = (event: MapViewClickEvent): void => {\r\n const globalState = getGlobalState();\r\n const { pinMode } = globalState.ui;\r\n const { mapPoint } = event;\r\n\r\n this.mapView\r\n .hitTest(event, {\r\n include: [\r\n this.getStreetlightsLayer(),\r\n this.getGrandRapidsLayer(),\r\n this.getPinModeLayer(),\r\n this.getRestrictedLayer(),\r\n ],\r\n })\r\n .then(async (hitTest: any) => {\r\n // Get selected streetLight markers\r\n const streetlightMarkers = hitTest.results.filter(\r\n (result: MapHitTestResultResults) => {\r\n return result.graphic.layer.id === this.featureLayerID;\r\n }\r\n );\r\n\r\n const grandRapidsMarkers = hitTest.results.filter(\r\n (result: MapHitTestResultResults) => {\r\n return result.graphic.layer.id === this.grandRapidsLayerID;\r\n }\r\n );\r\n\r\n // Get the restricted layer\r\n const restrictedLayer = hitTest.results.filter(\r\n (result: MapHitTestResultResults) => {\r\n return result.graphic.layer.id === this.restrictedLayerID;\r\n }\r\n );\r\n\r\n // If we're in pin-mode, and an existing streetlight was clicked, stop event and do nothing.\r\n // Otherwise, drop a pin at the selected location.\r\n if (pinMode.enabled) {\r\n if (streetlightMarkers.length || restrictedLayer.length) {\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n const droppedPin = hitTest.results.filter(\r\n (result: MapHitTestResultResults) => {\r\n return result.graphic.layer.id === PIN_MODE_LAYER_ID;\r\n }\r\n );\r\n\r\n if (!droppedPin.length) {\r\n this.featureLayerService.addMarker(mapPoint);\r\n }\r\n }\r\n\r\n if (streetlightMarkers.length || grandRapidsMarkers.length) {\r\n let data;\r\n if (streetlightMarkers.length) {\r\n data = streetlightMarkers;\r\n } else if (grandRapidsMarkers.length) {\r\n data = grandRapidsMarkers;\r\n } else {\r\n data = null;\r\n }\r\n\r\n if (data) {\r\n data.forEach((layer: any, index: number, array: any) => {\r\n if (index === 0) {\r\n const { attributes } = layer.graphic;\r\n const selectionGraphic = layer.graphic;\r\n\r\n if (grandRapidsMarkers.length) {\r\n attributes.markerStatus = EMarkerStatuses.NON_CE;\r\n }\r\n\r\n const markerData = {\r\n attributes,\r\n };\r\n\r\n selectionGraphic.symbol = MapUtils.getMarkerByStatus(\r\n attributes.markerStatus,\r\n true\r\n );\r\n\r\n const eventLabel =\r\n attributes.markerStatus === EMarkerStatuses.REPORTED ||\r\n attributes.markerStatus === EMarkerStatuses.IN_PROGRESS\r\n ? `${EGoogleEventTypes.MAP_MARKER_CLICKED} Reported`\r\n : `${EGoogleEventTypes.MAP_MARKER_CLICKED} Not-Reported`;\r\n\r\n this.sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: eventLabel,\r\n });\r\n\r\n this.removeMapViewGraphics();\r\n this.mapView.graphics.add(selectionGraphic);\r\n this.dispatch(updateMarkerData(markerData));\r\n }\r\n });\r\n }\r\n } else {\r\n this.removeMapViewGraphics();\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @private initializeFeatureLayerService\r\n * @memberof BaseMapService\r\n * @description Creates and initializes the FeatureLayerService\r\n */\r\n private initializeFeatureLayerService() {\r\n this.featureLayerService = FeatureLayerService.getInstance(\r\n this.map,\r\n this.mapView,\r\n this.dispatch,\r\n this.appConfig,\r\n this.locationWidget\r\n );\r\n }\r\n\r\n /**\r\n * @private buildWidgets\r\n * @memberof BaseMapService\r\n */\r\n private buildWidgets(basemapGalleryContainer: MapRefContainer): void {\r\n this.searchWidget = SearchWidget.getInstance(\r\n this.mapView,\r\n this.dispatch,\r\n this.sendDataToGTM\r\n );\r\n\r\n this.locationWidget = LocationWidget.getInstance(\r\n this.mapView,\r\n this.dispatch\r\n );\r\n\r\n this.zoomWidget = ZoomService.getInstance(this.mapView);\r\n\r\n this.basemapGallery = new BasemapGallery({\r\n view: this.mapView,\r\n container: basemapGalleryContainer.current,\r\n source: [\r\n Basemap.fromId(\"gray-vector\"),\r\n Basemap.fromId(\"satellite\"),\r\n Basemap.fromId(\"hybrid\"),\r\n Basemap.fromId(\"topo-vector\"),\r\n Basemap.fromId(\"streets-vector\"),\r\n Basemap.fromId(\"streets-navigation-vector\"),\r\n ],\r\n visible: false,\r\n });\r\n\r\n this.mapView.ui.add(this.basemapGallery);\r\n }\r\n\r\n /**\r\n * getMapView\r\n * @return {*} {MapView}\r\n * @memberof BaseMapService\r\n */\r\n public getMapView(): MapView {\r\n return this.mapView;\r\n }\r\n\r\n /**\r\n * getMap\r\n * @return {*} {WebMap}\r\n * @memberof BaseMapService\r\n */\r\n public getMap(): Map {\r\n return this.map;\r\n }\r\n\r\n public openBasemapGallery(): void {\r\n this.basemapGallery.visible = true;\r\n }\r\n\r\n public closeBasemapGallery(): void {\r\n this.basemapGallery.visible = false;\r\n }\r\n\r\n /**\r\n * getLocationWidget\r\n * @return {*} {LocationWidget}\r\n * @memberof BaseMapService\r\n */\r\n public getLocationWidget(): LocationWidget {\r\n return this.locationWidget;\r\n }\r\n /**\r\n * getStreetlightsLayer\r\n * @return {*} {FeatureLayer}\r\n * @memberof BaseMapService\r\n */\r\n public getStreetlightsLayer(): FeatureLayer {\r\n if (!this.streetlightsLayer) {\r\n this.streetlightsLayer = this.featureLayerService.getStreetlightsLayer();\r\n }\r\n return this.streetlightsLayer;\r\n }\r\n\r\n /**\r\n * getPinModeLayer\r\n * @return {*} {FeatureLayer}\r\n * @memberof BaseMapService\r\n */\r\n public getPinModeLayer(): FeatureLayer {\r\n if (!this.pinModeLayer) {\r\n this.pinModeLayer = this.featureLayerService.getPinModeLayer();\r\n }\r\n\r\n return this.pinModeLayer;\r\n }\r\n\r\n /**\r\n * getRestrictedLayer\r\n * @return {*} {FeatureLayer}\r\n * @memberof BaseMapService\r\n */\r\n public getRestrictedLayer(): FeatureLayer {\r\n if (!this.restrictedLayer) {\r\n this.restrictedLayer = this.featureLayerService.getRestrictedLayer();\r\n }\r\n\r\n return this.restrictedLayer;\r\n }\r\n\r\n public getGrandRapidsLayer(): FeatureLayer {\r\n if (!this.grandRapidsLayer) {\r\n this.grandRapidsLayer = this.featureLayerService.getGrandRapidsLayer();\r\n }\r\n\r\n return this.grandRapidsLayer;\r\n }\r\n\r\n /**\r\n * removeMapViewGraphics\r\n * @memberof BaseMapService\r\n */\r\n public removeMapViewGraphics = (): void => {\r\n this.mapView.graphics.removeAll();\r\n };\r\n\r\n public getCurrentExtent = (): Extent => {\r\n return this.currentExtent;\r\n };\r\n\r\n public getFeatureLayerService = (): FeatureLayerService => {\r\n return this.featureLayerService;\r\n };\r\n\r\n public processExtent = (): void => {\r\n MapUtils.processExtent(\r\n this.currentExtent,\r\n this.APIService,\r\n this.dispatchLogger,\r\n this.featureLayerService\r\n );\r\n };\r\n\r\n /**\r\n * @static getInstance\r\n * @param {Dispatch>} dispatch\r\n * @return {*} {BaseMapService}\r\n * @memberof BaseMapService\r\n */\r\n public static getInstance(\r\n dispatch: Dispatch>,\r\n sendDataToGTM: any\r\n ): BaseMapService {\r\n if (!BaseMapService.instance) {\r\n BaseMapService.instance = new BaseMapService(dispatch, sendDataToGTM);\r\n }\r\n\r\n return BaseMapService.instance;\r\n }\r\n}\r\n","import styled from \"@emotion/styled\";\r\nimport { Alert, Container, Modal } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst AlertList = styled.ul`\r\n &.alert-list {\r\n list-style: none;\r\n margin: 0 25%;\r\n padding: 0;\r\n position: absolute;\r\n top: 165px;\r\n width: 50%;\r\n z-index: 200;\r\n\r\n .generic-alert {\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n top: 136px;\r\n left: 0;\r\n width: 86%;\r\n margin: 0 2%;\r\n }\r\n }\r\n`;\r\n\r\nconst GenericAlert = styled(Alert)`\r\n &.generic-alert {\r\n border-radius: 0;\r\n border: 1px solid\r\n ${(props) =>\r\n props.variant === \"primary\"\r\n ? props.theme.colors?.alerts.octonary\r\n : props.theme.colors?.alerts.primary};\r\n color: ${(props) =>\r\n props.variant === \"primary\"\r\n ? props.theme.colors?.alerts.octonary\r\n : props.theme.colors?.alerts.primary};\r\n\r\n button.close {\r\n &:hover {\r\n color: ${(props) =>\r\n props.variant === \"primary\"\r\n ? props.theme.colors?.alerts.octonary\r\n : props.theme.colors?.alerts.primary};\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst AlertContentContainer = styled(Container)`\r\n &.generic-alert-container {\r\n padding: 0;\r\n .generic-alert-column {\r\n padding-left: 12px;\r\n &.icon-container {\r\n text-align: right;\r\n padding-right: 12px;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default { GenericAlert, AlertList, AlertContentContainer };\r\n","import { AlertProps } from \"react-bootstrap\";\r\nimport { ITestableComponentProps } from \"../../shared/types/testing.types\";\r\n\r\nexport interface IGenericAlertProps\r\n extends ITestableComponentProps,\r\n AlertProps {\r\n message?: string;\r\n onClose?: (event: React.MouseEvent) => void;\r\n}\r\n\r\nexport interface IAlertListProps extends ITestableComponentProps {\r\n className?: string;\r\n}\r\n\r\nexport const DefaultGenericAlertProps = {\r\n message: \"\",\r\n enabletestid: false,\r\n testid: \"location-alert\",\r\n};\r\n","import React from \"react\";\r\nimport { Col, Row } from \"react-bootstrap\";\r\nimport AlertStyles from \"./Alert.styles\";\r\nimport { DefaultGenericAlertProps, IGenericAlertProps } from \"./Alert.types\";\r\n\r\nconst GENERIC_ALERT: React.FC = (\r\n props: IGenericAlertProps\r\n) => {\r\n const { onClose, message, enabletestid, testid, variant, className } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {message}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nGENERIC_ALERT.defaultProps = DefaultGenericAlertProps;\r\nexport default GENERIC_ALERT;\r\n","import React from \"react\";\r\nimport { Col, Row } from \"react-bootstrap\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../state-management/root-reducer\";\r\nimport { clearLocationError } from \"../../state-management/slices/global/global.slice\";\r\nimport { clearLookupsError } from \"../../state-management/slices/lookups/lookups.slice\";\r\nimport { clearOutageError } from \"../../state-management/slices/outages/outages.slice\";\r\n\r\nimport AlertStyles from \"./Alert.styles\";\r\nimport { IAlertListProps } from \"./Alert.types\";\r\nimport GENERIC_ALERT from \"./GenericAlert.component\";\r\n\r\nconst ALERT_LIST: React.FC = (props: IAlertListProps) => {\r\n const dispatch = useDispatch();\r\n const { outagesError } = useSelector((state: RootState) => state.outages);\r\n const { locationServicesError } = useSelector(\r\n (state: RootState) => state.globalState.locationServices\r\n );\r\n const { lookupCollectionError } = useSelector(\r\n (state: RootState) => state.lookups\r\n );\r\n\r\n return (\r\n \r\n {locationServicesError && (\r\n
  • \r\n ) => {\r\n dispatch(clearLocationError());\r\n }}\r\n />\r\n
  • \r\n )}\r\n {(lookupCollectionError || outagesError) && (\r\n
  • \r\n ) => {\r\n dispatch(clearOutageError());\r\n dispatch(clearLookupsError());\r\n }}\r\n />\r\n
  • \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default ALERT_LIST;\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../../../theme/theme.types\";\r\n\r\nconst LegendContainer = styled.div`\r\n &.legend-container {\r\n background-color: ${(props) => props.theme.colors.essential.white};\r\n position: absolute;\r\n top: 157px;\r\n z-index: 100;\r\n left: 20px;\r\n padding: 8px 20px;\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\r\n\r\n ul {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n li {\r\n display: inline;\r\n margin-right: 10px;\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n\r\n img {\r\n margin-top: -1px;\r\n height: 21px;\r\n }\r\n\r\n span {\r\n font-size: ${(props) => props.theme.utils.getFontThemeSize(\"small\")};\r\n padding-left: 2px;\r\n }\r\n }\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n top: 135px;\r\n left: 10px;\r\n padding: 8px;\r\n ul {\r\n li {\r\n display: list-item;\r\n span {\r\n font-size: ${(props) =>\r\n props.theme.utils.getFontThemeSize(\"smallest\")};\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default { LegendContainer };\r\n","import { render } from \"@testing-library/react\";\r\nimport React from \"react\";\r\nimport { ILegendProps } from \"./Legend.types\";\r\nimport LegendStyles from \"./Legend.styles\";\r\nimport ReportedIcon from \"../../../../theme/assets/map-markers/dot_reported.svg\";\r\nimport NotReportedIcon from \"../../../../theme/assets/map-markers/dot_streetlight.svg\";\r\nimport ExtendedRepairIcon from \"../../../../theme/assets/map-markers/dot_extended-repair.svg\";\r\nimport NonCEIcon from \"../../../../theme/assets/map-markers/dot_non-ce.svg\";\r\nimport { Image } from \"react-bootstrap\";\r\n\r\nconst LEGEND: React.FC = () => {\r\n return (\r\n \r\n
      \r\n
    • \r\n \r\n Not Reported\r\n
    • \r\n
    • \r\n \r\n Reported/In Progress\r\n
    • \r\n
    • \r\n \r\n Extended Repair\r\n
    • \r\n
    • \r\n \r\n Other\r\n
    • \r\n
    \r\n \r\n );\r\n};\r\n\r\nexport default LEGEND;\r\n","export default __webpack_public_path__ + \"static/media/add_light_new.bf4af2fd.svg\";","export default __webpack_public_path__ + \"static/media/plus.e9c1b623.svg\";","export default __webpack_public_path__ + \"static/media/check_status.239eccd6.svg\";","export default __webpack_public_path__ + \"static/media/layers.ac4b6690.svg\";","export default __webpack_public_path__ + \"static/media/close.b9739ae6.svg\";","import { ButtonProps } from \"react-bootstrap\";\r\nimport { ITestableComponentProps } from \"../../shared/types/testing.types\";\r\n\r\nexport interface IButtonProps extends ITestableComponentProps, ButtonProps {\r\n label?: string;\r\n}\r\n\r\nexport const DefaultButtonProps = {\r\n label: undefined,\r\n};\r\n","import React from \"react\";\r\nimport ButtonStyles from \"./Button.styles\";\r\nimport { DefaultButtonProps, IButtonProps } from \"./Button.types\";\r\n\r\nconst renderButton = (props: IButtonProps) => {\r\n const { label, children, type, disabled, size, onClick, className } = props;\r\n const variant = props.variant ? props.variant : \"primary\";\r\n if (label) {\r\n return (\r\n \r\n {label}\r\n \r\n );\r\n } else if (children) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n CE SOAR BUTTON\r\n \r\n );\r\n }\r\n};\r\n\r\nconst BUTTON: React.FC = (props: IButtonProps) => {\r\n return renderButton(props);\r\n};\r\n\r\nBUTTON.defaultProps = DefaultButtonProps;\r\nexport default BUTTON;\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst LoadingOverlayContainer = styled.div`\r\n &.loading-overlay {\r\n background-color: rgba(0, 0, 0, 0.75);\r\n opacity: 0;\r\n position: absolute;\r\n top: 75px;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n z-index: 500;\r\n }\r\n`;\r\n\r\nconst LoadingIconContainer = styled.div`\r\n &.loading-icon-container {\r\n align-items: center;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n height: 100%;\r\n width: 100%;\r\n\r\n .svg-container {\r\n background-color: #ffffff;\r\n width: 60px;\r\n height: 60px;\r\n border-radius: 50%;\r\n right: 6px;\r\n position: relative;\r\n margin-top: -75px;\r\n opacity: 0;\r\n transform: scale(0);\r\n svg {\r\n width: 60px;\r\n height: 60px;\r\n position: absolute;\r\n opacity: 0;\r\n }\r\n }\r\n .loading-message-container {\r\n margin: 8px auto;\r\n text-align: center;\r\n width: 168px;\r\n h1 {\r\n color: white;\r\n font-size: 16px;\r\n opacity: 0;\r\n position: absolute;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default { LoadingOverlayContainer, LoadingIconContainer };\r\n","import anime from \"animejs\";\r\n\r\nexport const startLoadingAnimation = (): void => {\r\n const loadingTimeline = anime.timeline({\r\n easing: \"easeOutCubic\",\r\n loop: true,\r\n });\r\n\r\n const overlayTimeline = anime.timeline({\r\n easing: \"easeInCubic\",\r\n });\r\n\r\n const containerTimeline = anime.timeline({\r\n easing: \"easeInCubic\",\r\n });\r\n\r\n overlayTimeline.add({\r\n targets: \".loading-overlay\",\r\n opacity: 1.0,\r\n duration: 1200,\r\n complete: function () {\r\n containerTimeline.add({\r\n targets: \".svg-container\",\r\n easing: \"easeInCubic\",\r\n duration: 500,\r\n opacity: 1.0,\r\n scale: [0, 1.0],\r\n complete: function () {\r\n loadingTimeline\r\n .add({\r\n targets: [\".cobra-loading\", \".loading-message\"],\r\n easing: \"easeInCubic\",\r\n opacity: 1.0,\r\n })\r\n .add({\r\n targets: \".cobra-loading\",\r\n easing: \"easeOutCubic\",\r\n delay: 1000,\r\n opacity: 0,\r\n })\r\n .add({\r\n targets: \".hanging-loading\",\r\n easing: \"easeInCubic\",\r\n opacity: 1.0,\r\n })\r\n .add({\r\n targets: [\".hanging-loading\", \".loading-message\"],\r\n easing: \"easeOutCubic\",\r\n delay: 1000,\r\n opacity: 0,\r\n })\r\n .add({\r\n targets: [\".decorative-loading\", \".loading-sub-message\"],\r\n easing: \"easeInCubic\",\r\n opacity: 1.0,\r\n })\r\n .add({\r\n targets: [\".decorative-loading\", \".loading-sub-message\"],\r\n easing: \"easeOutCubic\",\r\n delay: 1000,\r\n opacity: 0,\r\n });\r\n },\r\n });\r\n },\r\n });\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport {\r\n DefaultLoadingOverlayProps,\r\n ILoadingOverlayProps,\r\n} from \"./LoadingOverlay.types\";\r\nimport LoadingStyles from \"./LoadingOverlay.styles\";\r\nimport STREETLIGHT_ICON from \"../icon/streetlight-icon/StreetlightIcon.component\";\r\nimport { EBracketTypes } from \"../../shared/enums/utility.enums\";\r\nimport { startLoadingAnimation } from \"./LoadingOverlay.animations\";\r\n\r\nconst LOADING_OVERLAY: React.FC = () => {\r\n useEffect(() => {\r\n startLoadingAnimation();\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n

    Streetlights Loading...

    \r\n

    One Moment Please...

    \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n\r\nLOADING_OVERLAY.defaultProps = DefaultLoadingOverlayProps;\r\nexport default LOADING_OVERLAY;\r\n","import { ITestableComponentProps } from \"../../shared/types/testing.types\";\r\n\r\nexport interface ILoadingOverlayProps extends ITestableComponentProps {\r\n show?: boolean;\r\n}\r\n\r\nexport const DefaultLoadingOverlayProps: ILoadingOverlayProps = {\r\n show: false,\r\n testid: \"loading-overlay\",\r\n};\r\n","import { ESearchWizardSteps } from \"../../shared/enums/search.enums\";\r\nimport {\r\n IAcceptOutageValues,\r\n IFormValues,\r\n IOutageSearchProps,\r\n ISearchFormValues,\r\n} from \"./Form.types\";\r\n\r\nconst phoneRegExp =\r\n /^\\(?([2-9][0-8][0-9])\\)?[-. ]?([2-9][0-9]{2})[-. ]?([0-9]{4})$/;\r\n// /^(\\+?\\d{0,4})?\\s?-?\\s?(\\(?\\d{3}\\)?)\\s?-?\\s?(\\(?\\d{3}\\)?)\\s?-?\\s?(\\(?\\d{4}\\)?)?$/;\r\n\r\nconst nameRegExp = /^[a-zA-Z\\s]*$/;\r\n\r\nconst commentsRegExp =\r\n /^[^\\p{Extended_Pictographic}\\u{1F3FB}-\\u{1F3FF}\\u{1F9B0}-\\u{1F9B3}]*$/gu;\r\n\r\nconst FeedbackMessages = {\r\n additionalDetailsMax: \"Cannot exceed 190 characters\",\r\n nameMin: \"Name must be at least 6 characters\",\r\n nameMax: \"Name cannot exceed 20 characters\",\r\n nameMatch: \"Name cannot contain special characters\",\r\n nameRequired: \"Name is required\",\r\n phoneMax: \"Phone number cannot exceed 12 characters\",\r\n phoneMatch: \"Area code and exchange cannot begin with '1'\",\r\n phoneRequired: \"Phone number is required\",\r\n emailMax: \"Email cannot exceed 60 characters\",\r\n emailMatch: \"Email addresses should be in the form user@email.com\",\r\n emailRequired: \"Email address is required\",\r\n dropdownOptionRequired: \"Please select the nature of your outage\",\r\n bracketTypeRequired: \"Light style selection required\",\r\n searchTextRequired: \"This is a required field\",\r\n adminGisIdRequired: \"GISID is required\",\r\n emojisRestricted: \"Emoji(s) are not allowed. Please remove and try again\",\r\n};\r\n\r\nconst InitialValues: IFormValues = {\r\n outageFormDropdown: \"\",\r\n outageFormComments: \"\",\r\n outageFormName: \"\",\r\n outageFormPhone: \"\",\r\n outageFormEmail: \"\",\r\n outageFormBracketType: \"\",\r\n};\r\n\r\nconst InitialSearchValues: ISearchFormValues = {\r\n searchFormText: \"\",\r\n};\r\n\r\nconst InitialAcceptOutageValues: IAcceptOutageValues = {\r\n acceptOutageFormGISID: undefined,\r\n};\r\n\r\nexport default {\r\n FeedbackMessages,\r\n InitialValues,\r\n InitialSearchValues,\r\n InitialAcceptOutageValues,\r\n phoneRegExp,\r\n nameRegExp,\r\n commentsRegExp,\r\n};\r\n","import * as yup from \"yup\";\r\nimport FormConstants from \"./Form.constants\";\r\n\r\nexport const outageSchema = yup.object().shape({\r\n outageFormName: yup\r\n .string()\r\n .min(6, FormConstants.FeedbackMessages.nameMin)\r\n .max(20, FormConstants.FeedbackMessages.nameMax)\r\n .matches(FormConstants.nameRegExp, FormConstants.FeedbackMessages.nameMatch)\r\n .required(FormConstants.FeedbackMessages.nameRequired),\r\n outageFormPhone: yup\r\n .string()\r\n .max(12, FormConstants.FeedbackMessages.phoneMax)\r\n .matches(\r\n FormConstants.phoneRegExp,\r\n FormConstants.FeedbackMessages.phoneMatch\r\n )\r\n .required(FormConstants.FeedbackMessages.phoneRequired),\r\n outageFormEmail: yup\r\n .string()\r\n .email(FormConstants.FeedbackMessages.emailMatch)\r\n .max(60, FormConstants.FeedbackMessages.emailMax)\r\n .required(FormConstants.FeedbackMessages.emailRequired),\r\n outageFormComments: yup\r\n .string()\r\n .min(1)\r\n .max(190, FormConstants.FeedbackMessages.additionalDetailsMax)\r\n .matches(\r\n FormConstants.commentsRegExp,\r\n FormConstants.FeedbackMessages.emojisRestricted\r\n ),\r\n outageFormDropdown: yup\r\n .string()\r\n .required(FormConstants.FeedbackMessages.dropdownOptionRequired),\r\n});\r\n\r\nexport const pinModeSchema = yup.object().shape({\r\n outageFormName: yup\r\n .string()\r\n .min(6, FormConstants.FeedbackMessages.nameMin)\r\n .max(20, FormConstants.FeedbackMessages.nameMax)\r\n .matches(FormConstants.nameRegExp, FormConstants.FeedbackMessages.nameMatch)\r\n .required(FormConstants.FeedbackMessages.nameRequired),\r\n outageFormPhone: yup\r\n .string()\r\n .max(12, FormConstants.FeedbackMessages.phoneMax)\r\n .matches(\r\n FormConstants.phoneRegExp,\r\n FormConstants.FeedbackMessages.phoneMatch\r\n )\r\n .required(FormConstants.FeedbackMessages.phoneRequired),\r\n outageFormEmail: yup\r\n .string()\r\n .email(FormConstants.FeedbackMessages.emailMatch)\r\n .max(60, FormConstants.FeedbackMessages.emailMax)\r\n .required(FormConstants.FeedbackMessages.emailRequired),\r\n outageFormComments: yup\r\n .string()\r\n .min(1)\r\n .max(190, FormConstants.FeedbackMessages.additionalDetailsMax)\r\n .matches(\r\n FormConstants.commentsRegExp,\r\n FormConstants.FeedbackMessages.emojisRestricted\r\n ),\r\n outageFormDropdown: yup\r\n .string()\r\n .required(FormConstants.FeedbackMessages.dropdownOptionRequired),\r\n outageFormBracketType: yup\r\n .string()\r\n .required(FormConstants.FeedbackMessages.bracketTypeRequired),\r\n});\r\n\r\nexport const searchSchema = yup.object().shape({\r\n searchFormText: yup\r\n .string()\r\n .max(100)\r\n .required(FormConstants.FeedbackMessages.searchTextRequired),\r\n});\r\n\r\nexport const acceptOutageSchema = yup.object().shape({\r\n acceptOutageFormGISID: yup\r\n .number()\r\n .required(FormConstants.FeedbackMessages.adminGisIdRequired),\r\n});\r\n\r\nconst getBlobFromDataURI = (dataURI: string): Blob => {\r\n const byteString = atob(dataURI.split(\",\")[1]);\r\n const mimeType = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0];\r\n const ab = new ArrayBuffer(byteString.length);\r\n const ia = new Uint8Array(ab);\r\n\r\n for (let i = 0; i < byteString.length; i++) {\r\n ia[i] = byteString.charCodeAt(i);\r\n }\r\n\r\n return new Blob([ab], { type: mimeType });\r\n};\r\n\r\nconst getDataUriFromBlob = (blob: Blob | Blob[], callback: any): void => {\r\n const fr = new FileReader();\r\n fr.onload = function (e: ProgressEvent) {\r\n callback(e.target?.result);\r\n };\r\n\r\n fr.readAsDataURL(blob as Blob);\r\n};\r\n\r\nconst getBlobSizeInMB = (blob: Blob): number => {\r\n return blob.size / 1024 / 1024;\r\n};\r\n\r\nexport default {\r\n outageSchema,\r\n pinModeSchema,\r\n searchSchema,\r\n acceptOutageSchema,\r\n getBlobFromDataURI,\r\n getDataUriFromBlob,\r\n getBlobSizeInMB,\r\n};\r\n","import { FormikHelpers } from \"formik\";\r\nimport {\r\n OutagesResponse,\r\n OutageViewModel,\r\n} from \"../../../api/generated/models\";\r\nimport {\r\n IFormValues,\r\n ISearchFormValues,\r\n} from \"../../../components/form/Form.types\";\r\nimport { ELogTypes } from \"../../../shared/enums/logging.enums\";\r\nimport { IStandardError } from \"../../../shared/types/error.types\";\r\nimport { AppThunk } from \"../../store\";\r\nimport { DispatchLogger } from \"../../utils/dispatch-logger/DispatchLogger\";\r\nimport {\r\n setIsLoading,\r\n submitOutagesFailed,\r\n submitOutagesSuccess,\r\n getOutagesFailed,\r\n getOutagesSuccess,\r\n searchOutagesFailed,\r\n searchOutagesSuccess,\r\n adminOutagesFailed,\r\n adminOutagesSuccess,\r\n setIsAdminLoading,\r\n updateAdminOutagesFailed,\r\n} from \"./outages.slice\";\r\nimport ErrorConstants from \"../../../api/constants/error.constants\";\r\nimport { ApiService } from \"../../../api/api.service\";\r\nimport Extent from \"@arcgis/core/geometry/Extent\";\r\nimport {\r\n buildSubmitPayload,\r\n getBracketTypeDisplayLabel,\r\n getLampTypeLabel,\r\n} from \"../../utils/state/outages.utils\";\r\nimport { IGTMEventFunction } from \"../../../shared/types/logging.types\";\r\nimport {\r\n setLoading,\r\n setShowAdminModal,\r\n updateSearchView,\r\n} from \"../global/global.slice\";\r\nimport { ESearchWizardSteps } from \"../../../shared/enums/search.enums\";\r\nimport { Dispatch, AnyAction } from \"@reduxjs/toolkit\";\r\nimport { isNullOrUndefined } from \"../../../shared/utils/data.utils\";\r\nimport {\r\n BlobServiceClient,\r\n BlockBlobUploadResponse,\r\n} from \"@azure/storage-blob\";\r\nimport FormUtils from \"../../../components/form/Form.utils\";\r\nimport { BaseMapService } from \"../../../components/map/BaseMap.service\";\r\nimport Graphic from \"@arcgis/core/Graphic\";\r\nimport MapUtils from \"../../../components/map/Map.utils\";\r\nimport Point from \"@arcgis/core/geometry/Point\";\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * THUNKS\r\n * --------------------------------------------------------------------------\r\n */\r\nexport const fetchOutagesByExtent =\r\n (currentExtent: Extent): any =>\r\n async (dispatch: Dispatch) => {\r\n dispatch(setIsLoading(true));\r\n const apiService: ApiService = ApiService.getInstance();\r\n const { outagesApi } = apiService;\r\n try {\r\n const results = (await outagesApi.getOutagesByExtent({\r\n currentExtent,\r\n })) as OutagesResponse;\r\n\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n\r\n if (results.isAxiosError || results.name === \"Error\") {\r\n const axiosError = results.toJSON();\r\n const error: IStandardError = {\r\n message: axiosError.message,\r\n code: axiosError.code,\r\n displayMessage: ErrorConstants.GENERIC_ERROR_MESSAGE,\r\n };\r\n\r\n dispatch(setLoading(false));\r\n dispatchLogger.fire(\r\n getOutagesFailed,\r\n { ...error },\r\n {\r\n message: \"Fetch Outages Failed\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n } else {\r\n dispatchLogger.fire(\r\n getOutagesSuccess,\r\n { ...results },\r\n {\r\n message: \"Outages Fetched\",\r\n type: ELogTypes.API,\r\n data: { results },\r\n }\r\n );\r\n }\r\n\r\n dispatch(setIsLoading(false));\r\n return results;\r\n } catch (error) {\r\n dispatch(getOutagesFailed(error));\r\n dispatch(setIsLoading(false));\r\n dispatch(setLoading(false));\r\n }\r\n };\r\n\r\n/**\r\n * submitOutage\r\n * @param outage\r\n * @param formActions\r\n * @returns Promise\r\n */\r\nexport const submitOutage =\r\n (\r\n formValues: IFormValues,\r\n formActions: FormikHelpers,\r\n sendDataToGTM: IGTMEventFunction\r\n ): any =>\r\n async (\r\n dispatch: Dispatch,\r\n getState: () => { globalState: any; outages: any }\r\n ) => {\r\n dispatch(setIsLoading(true));\r\n formActions.setSubmitting(true);\r\n\r\n const apiService: ApiService = ApiService.getInstance();\r\n const { outagesApi } = apiService;\r\n\r\n const { globalState, outages } = getState();\r\n\r\n const { ui } = globalState;\r\n const { pinMode } = ui;\r\n const { imageUpload } = outages;\r\n\r\n const payload = pinMode.enabled\r\n ? buildSubmitPayload(formValues, pinMode.pin)\r\n : buildSubmitPayload(formValues, ui.selectedMarker);\r\n\r\n const hasImage =\r\n !isNullOrUndefined(imageUpload.imgDataUrl) &&\r\n !isNullOrUndefined(imageUpload.fileData);\r\n\r\n let results: OutagesResponse;\r\n\r\n try {\r\n results = (await outagesApi.submitOutage(\r\n payload,\r\n hasImage,\r\n imageUpload.fileData\r\n )) as OutagesResponse;\r\n } catch (error) {\r\n dispatch(getOutagesFailed(error));\r\n formActions.setSubmitting(false);\r\n }\r\n\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n\r\n if (results.isAxiosError || results.name === \"Error\") {\r\n const axiosError = results.toJSON();\r\n const error: IStandardError = {\r\n message: axiosError.message,\r\n code: axiosError.code,\r\n displayMessage: ErrorConstants.GENERIC_ERROR_MESSAGE,\r\n };\r\n\r\n dispatchLogger.fire(\r\n submitOutagesFailed,\r\n { ...error },\r\n {\r\n message: \"Outage Submit Failed\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Outage Submission Failed\",\r\n });\r\n } else {\r\n formActions.resetForm();\r\n const { imageUploadUri } = results;\r\n\r\n if (!isNullOrUndefined(imageUploadUri)) {\r\n const { fileData } = imageUpload;\r\n\r\n const serviceClient = new BlobServiceClient(imageUploadUri);\r\n const containerClient = serviceClient.getContainerClient(\".\");\r\n\r\n const blockBlobClient = containerClient.getBlockBlobClient(\r\n `${results.outageId}.jpg`\r\n );\r\n\r\n const imageBlob = FormUtils.getBlobFromDataURI(imageUpload.imgDataUrl);\r\n\r\n blockBlobClient\r\n .upload(imageBlob, fileData.size)\r\n .then((response: BlockBlobUploadResponse) => {\r\n console.log(\"Blob Upload Complete:\", response);\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n dispatchLogger.fire(\r\n submitOutagesSuccess,\r\n { ...results },\r\n {\r\n message: \"Outage Submitted\",\r\n type: ELogTypes.API,\r\n data: { results },\r\n }\r\n );\r\n\r\n const submittedLabel = pinMode.enabled\r\n ? \"Outage Submitted - Pin Mode\"\r\n : \"Outage Submitted\";\r\n\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: submittedLabel,\r\n });\r\n\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: `Outage Reason - ${results.outageReason}`,\r\n });\r\n }\r\n\r\n formActions.setSubmitting(false);\r\n };\r\n\r\nexport const searchOutages =\r\n (\r\n formValues: ISearchFormValues,\r\n formActions: FormikHelpers,\r\n sendDataToGTM: IGTMEventFunction\r\n ): any =>\r\n async (dispatch: Dispatch, getState: any) => {\r\n dispatch(setIsLoading(true));\r\n formActions.setSubmitting(true);\r\n\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n const apiService: ApiService = ApiService.getInstance();\r\n const { outagesApi } = apiService;\r\n const { searchFormText } = formValues;\r\n\r\n try {\r\n const results = (await outagesApi.searchOutages(\r\n searchFormText\r\n )) as OutagesResponse;\r\n\r\n if (results.isAxiosError || results.name === \"Error\") {\r\n const axiosError = results.toJSON();\r\n const error: IStandardError = {\r\n message: axiosError.message,\r\n code: axiosError.code,\r\n displayMessage: ErrorConstants.GENERIC_ERROR_MESSAGE,\r\n };\r\n\r\n dispatchLogger.fire(\r\n searchOutagesFailed,\r\n { ...error },\r\n {\r\n message: \"Outage Search Failed\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Outage Search Failed\",\r\n });\r\n } else {\r\n formActions.resetForm();\r\n dispatchLogger.fire(\r\n searchOutagesSuccess,\r\n { results },\r\n {\r\n message: \"Outage Search\",\r\n type: ELogTypes.API,\r\n data: { results },\r\n }\r\n );\r\n\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Outage Look Up Search\",\r\n });\r\n }\r\n\r\n formActions.setSubmitting(false);\r\n dispatch(updateSearchView(ESearchWizardSteps.RESULTS));\r\n } catch (error) {\r\n dispatch(searchOutagesFailed(error));\r\n formActions.setSubmitting(false);\r\n }\r\n };\r\n\r\nexport const fetchAdminOutages =\r\n (pageSize = 50, pageNumber = 1): any =>\r\n async (dispatch: Dispatch, getState: any) => {\r\n dispatch(setIsAdminLoading(true));\r\n\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n const apiService: ApiService = ApiService.getInstance();\r\n const { outagesApi } = apiService;\r\n\r\n try {\r\n const results = (await outagesApi.searchAdminOutages(\r\n pageSize,\r\n pageNumber\r\n )) as OutagesResponse;\r\n\r\n if (results.isAxiosError || results.name === \"Error\") {\r\n const axiosError = results.toJSON();\r\n const error: IStandardError = {\r\n message: axiosError.message,\r\n code: axiosError.code,\r\n displayMessage: ErrorConstants.GENERIC_ERROR_MESSAGE,\r\n };\r\n\r\n dispatchLogger.fire(\r\n adminOutagesFailed,\r\n { ...error },\r\n {\r\n message: \"Fetching Admin Outages Failed\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n } else {\r\n dispatchLogger.fire(\r\n adminOutagesSuccess,\r\n { results },\r\n {\r\n message: \"Admin Outages Fetched\",\r\n type: ELogTypes.API,\r\n data: { results },\r\n }\r\n );\r\n }\r\n } catch (error) {\r\n dispatch(adminOutagesFailed(error));\r\n }\r\n };\r\n\r\nexport const updateAdminOutage =\r\n (\r\n selectedOutage: OutageViewModel,\r\n baseMapService: BaseMapService,\r\n sendDataToGTM: any,\r\n gisFeature?: Graphic,\r\n locationId?: number,\r\n completedReason?: string\r\n ): any =>\r\n async (dispatch: Dispatch, getState: any) => {\r\n dispatch(setIsAdminLoading(true));\r\n\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n const apiService: ApiService = ApiService.getInstance();\r\n const { outagesApi } = apiService;\r\n\r\n const { outageId } = selectedOutage;\r\n\r\n let results;\r\n let mergedPayload: OutageViewModel = selectedOutage;\r\n\r\n if (gisFeature) {\r\n const { geometry, attributes } = gisFeature;\r\n const mapPoint = new Point({\r\n latitude: attributes.LATITUDE,\r\n longitude: attributes.LONGITUDE,\r\n });\r\n const geoLocResponse = await MapUtils.fetchGeoLocData(mapPoint);\r\n const xStreetsResponse = await MapUtils.fetchCrossStreets(geometry);\r\n const { geoLocPayload } = MapUtils.buildGeoLocPayload(\r\n geoLocResponse,\r\n xStreetsResponse\r\n );\r\n mergedPayload = {\r\n ...selectedOutage,\r\n location: {\r\n ...selectedOutage.location,\r\n county: attributes.COUNTY,\r\n contractAccountNumber: attributes.CONTRACT_A,\r\n coordinates: {\r\n ...selectedOutage?.location?.coordinates,\r\n latitude: attributes.LATITUDE,\r\n longitude: attributes.LONGITUDE,\r\n },\r\n locationId: attributes.GISID,\r\n township: attributes.TOWNSHIP,\r\n trs: attributes.TRS,\r\n //Address unknown occurance should not occur unless crossstreet is null\r\n address: geoLocPayload.address?.Address || \"Address Unknown\",\r\n crossStreets: geoLocPayload.crossStreets,\r\n },\r\n utility: {\r\n ...selectedOutage.utility,\r\n lampType: getLampTypeLabel(attributes.LAMPTYPE),\r\n bracketType: getBracketTypeDisplayLabel(attributes.FIXTURESUP),\r\n wattage: attributes.WATTAGE.toString(),\r\n },\r\n };\r\n }\r\n\r\n try {\r\n // @todo: Still need to send the correct obj/values to the back-end.\r\n // If we are accepting, send mergedPayload. Otherwise send outageId,\r\n // locationId, and completedReason.\r\n if (outageId) {\r\n results = (await outagesApi.updateAdminOutage(\r\n mergedPayload,\r\n locationId,\r\n completedReason\r\n )) as OutagesResponse;\r\n }\r\n\r\n if (results.isAxiosError || results.name === \"Error\") {\r\n const axiosError = results.toJSON();\r\n const error: IStandardError = {\r\n message: axiosError.message,\r\n code: axiosError.code,\r\n displayMessage: ErrorConstants.GENERIC_ERROR_MESSAGE,\r\n };\r\n\r\n dispatchLogger.fire(\r\n updateAdminOutagesFailed,\r\n { ...error },\r\n {\r\n message: \"Updating Admin Outage Failed\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n\r\n if (locationId) {\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Admin Outage Accept Failed\",\r\n });\r\n } else {\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Admin Outage Reject Failed\",\r\n });\r\n }\r\n } else {\r\n const featureLayerService = baseMapService.getFeatureLayerService();\r\n dispatchLogger.fire(\r\n fetchAdminOutages,\r\n { results },\r\n {\r\n message: \"Admin Outages Fetched\",\r\n type: ELogTypes.API,\r\n data: { results },\r\n }\r\n );\r\n\r\n featureLayerService.removeNonCEGraphics();\r\n baseMapService.processExtent();\r\n\r\n dispatch(setIsAdminLoading(false));\r\n dispatch(setShowAdminModal({ show: false }));\r\n\r\n if (locationId) {\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: `Admin Outage Accepted - Outage ID: ${outageId}`,\r\n });\r\n } else if (completedReason) {\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: `Admin Outage Rejected - Outage ID: ${outageId} Rejected Reason: ${completedReason} `,\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n dispatch(adminOutagesFailed(error));\r\n }\r\n };\r\n","/* istanbul ignore file */\r\nimport { IPublicClientApplication } from \"@azure/msal-browser\";\r\n\r\nimport { AppDispatch } from \"../../state-management/store\";\r\n// eslint-disable-next-line node/no-extraneous-import\r\nimport { History } from \"history\";\r\nimport {\r\n setLoggedIn,\r\n updateAdminModeState,\r\n} from \"../../state-management/slices/global/global.slice\";\r\nimport { IAppConfig } from \"../types/config.types\";\r\n\r\nexport class AuthSericeEntra {\r\n private dispatch: AppDispatch;\r\n private static instance: AuthSericeEntra;\r\n public msalInstance: IPublicClientApplication;\r\n\r\n private constructor(\r\n dispatch: AppDispatch,\r\n msalInstance: IPublicClientApplication\r\n ) {\r\n this.dispatch = dispatch;\r\n this.msalInstance = msalInstance;\r\n }\r\n\r\n public static getInstance(\r\n dispatch: AppDispatch,\r\n msalInstance: IPublicClientApplication\r\n ): AuthSericeEntra {\r\n if (!AuthSericeEntra.instance) {\r\n AuthSericeEntra.instance = new AuthSericeEntra(dispatch, msalInstance);\r\n }\r\n\r\n return AuthSericeEntra.instance;\r\n }\r\n\r\n public async signin(appConfig: IAppConfig): Promise {\r\n const tenantId = appConfig.azureTenantId;\r\n const clientId = appConfig.azureClientId;\r\n const scope = appConfig.azureScope;\r\n const accounts = this.msalInstance.getAllAccounts();\r\n if (accounts.length == 1) {\r\n const account = accounts[0];\r\n if (account?.tenantId === tenantId) {\r\n this.msalInstance.setActiveAccount(account);\r\n }\r\n }\r\n try {\r\n const loginRequest = {\r\n scopes: [`api://${clientId}/${scope}`],\r\n };\r\n\r\n this.msalInstance.loginRedirect(loginRequest);\r\n } catch (err) {\r\n console.log(err);\r\n }\r\n }\r\n\r\n public async signOut(history: History): Promise {\r\n const basename =\r\n window.location.origin + history.createHref({ pathname: \"/\" });\r\n\r\n try {\r\n this.msalInstance.logout({ postLogoutRedirectUri: basename });\r\n this.dispatch(updateAdminModeState(false));\r\n this.dispatch(setLoggedIn(false));\r\n } catch (err) {\r\n console.log({ err });\r\n throw err;\r\n }\r\n }\r\n}\r\n","import React, { useRef, useEffect, useState } from \"react\";\r\nimport MapStyles from \"./Map.styles\";\r\nimport { MapRefContainer, SetPinModeAction } from \"./Map.types\";\r\nimport { BaseMapService } from \"./BaseMap.service\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport ALERT_LIST from \"../alert/AlertList.component\";\r\nimport LEGEND from \"./widgets/Legend/Legend.component\";\r\nimport { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport { RootState } from \"../../state-management/root-reducer\";\r\nimport {\r\n setLoading,\r\n updateAdminModeState,\r\n updateDrawerState,\r\n updatePinModeState,\r\n updateSearchModeState,\r\n} from \"../../state-management/slices/global/global.slice\";\r\nimport PinModeIcon from \"../../theme/assets/map-controls/add_light_new.svg\";\r\nimport PlusIcon from \"../../theme/assets/map-controls/plus.svg\";\r\nimport CheckStatusIcon from \"../../theme/assets/map-controls/check_status.svg\";\r\nimport LayersIcon from \"../../theme/assets/map-controls/layers.svg\";\r\nimport CloseIcon from \"../../theme/assets/map-controls/close.svg\";\r\nimport { AppDispatch } from \"../../state-management/store\";\r\nimport { FeatureLayerService } from \"./FeatureLayer.service\";\r\nimport MapView from \"@arcgis/core/views/MapView\";\r\nimport BUTTON from \"../button/Button.component\";\r\nimport LOADING_OVERLAY from \"../loading/LoadingOverlay.component\";\r\nimport ButtonStyles from \"../button/Button.styles\";\r\nimport { ClickEvent } from \"../../shared/types/event.types\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { fetchAdminOutages } from \"../../state-management/slices/outages/outages.thunk\";\r\nimport { useIsAuthenticated, useMsal } from \"@azure/msal-react\";\r\nimport { AuthSericeEntra } from \"../../shared/services/Auth.service.entra\";\r\n\r\nconst togglePinMode = (\r\n pinModeActive: boolean,\r\n mapView: MapView,\r\n featureLayerService: FeatureLayerService,\r\n dispatch: AppDispatch,\r\n setPinMode: SetPinModeAction,\r\n sendDataToGTM: any\r\n) => {\r\n if (pinModeActive) {\r\n if (mapView.popup.visible) {\r\n mapView.popup.close();\r\n featureLayerService.removePinModeGraphics();\r\n }\r\n\r\n featureLayerService.fadeOverlay(\"off\");\r\n dispatch(setPinMode(false));\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Pin Mode Disabled\",\r\n });\r\n } else {\r\n featureLayerService.buildOverlayLayer();\r\n featureLayerService.addOverlayLayer();\r\n featureLayerService.fadeOverlay(\"on\");\r\n featureLayerService.buildPinModeLayer();\r\n dispatch(setPinMode(true));\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Pin Mode Enabled\",\r\n });\r\n }\r\n};\r\n\r\nconst BASE_MAP: React.FC> = () => {\r\n const dispatch = useDispatch();\r\n const { instance } = useMsal();\r\n const sendDataToGTM = useGTMDispatch();\r\n const mapContainer: MapRefContainer = useRef(\"\");\r\n const basemapGalleryContainer: MapRefContainer = useRef(\"\");\r\n const history = useHistory();\r\n\r\n // Services\r\n const authService = AuthSericeEntra.getInstance(dispatch, instance);\r\n const baseMapService: BaseMapService = BaseMapService.getInstance(\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n\r\n // App State\r\n const { auth, appConfig, ui, locationServices } = useSelector(\r\n (state: RootState) => state.globalState\r\n );\r\n\r\n const isAuthenticated = useIsAuthenticated();\r\n const {\r\n baseMapInitialized,\r\n featureLayerInitialized,\r\n restrictedLayerInitialized,\r\n grandRapidsLayerInitialized,\r\n pinMode,\r\n loading,\r\n } = ui;\r\n\r\n // Local State\r\n const [pinModeActive, setPinModeActive] = useState(false);\r\n const [basemapToggleActive, setBasemapToggleActive] = useState(false);\r\n\r\n const locationContainerClassname = locationServices.locationDisabled\r\n ? \"location-container esri-component esri-locate esri-widget--button esri-widget user-disabled\"\r\n : \"location-container esri-component esri-locate esri-widget--button esri-widget user-enabled\";\r\n\r\n useEffect(() => {\r\n if (\r\n baseMapInitialized &&\r\n featureLayerInitialized &&\r\n restrictedLayerInitialized &&\r\n grandRapidsLayerInitialized &&\r\n loading\r\n ) {\r\n dispatch(setLoading(false));\r\n }\r\n\r\n if (pinModeActive !== pinMode.enabled) {\r\n setPinModeActive(pinMode.enabled);\r\n }\r\n\r\n if (mapContainer.current && basemapGalleryContainer.current) {\r\n if (appConfig && !baseMapInitialized) {\r\n baseMapService.initializeMapView(\r\n mapContainer,\r\n basemapGalleryContainer,\r\n appConfig\r\n );\r\n }\r\n }\r\n }, [\r\n appConfig,\r\n baseMapInitialized,\r\n baseMapService,\r\n dispatch,\r\n featureLayerInitialized,\r\n grandRapidsLayerInitialized,\r\n loading,\r\n pinMode.enabled,\r\n pinModeActive,\r\n restrictedLayerInitialized,\r\n ]);\r\n\r\n return (\r\n <>\r\n {/* --------------------------------- */}\r\n {/* MAP CONTAINER ------------------- */}\r\n {/* --------------------------------- */}\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* SEARCH CONTROL CONTAINER -------- */}\r\n {/* --------------------------------- */}\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* PIN-MODE CONTROL CONTAINER ------ */}\r\n {/* --------------------------------- */}\r\n \r\n {\r\n togglePinMode(\r\n pinModeActive,\r\n baseMapService.getMapView(),\r\n baseMapService.getFeatureLayerService(),\r\n dispatch,\r\n updatePinModeState,\r\n sendDataToGTM\r\n );\r\n }}\r\n >\r\n \"Pin\r\n \"Pin\r\n \r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* BASEMAP TOGGLE CONTAINER -------- */}\r\n {/* --------------------------------- */}\r\n \r\n {\r\n setBasemapToggleActive(!basemapToggleActive);\r\n basemapToggleActive\r\n ? baseMapService.closeBasemapGallery()\r\n : baseMapService.openBasemapGallery();\r\n }}\r\n >\r\n {basemapToggleActive ? (\r\n \"Close\r\n ) : (\r\n \"Open\r\n )}\r\n \r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* BASEMAP GALLERY CONTAINER ------- */}\r\n {/* --------------------------------- */}\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* LOCATION CONTROL CONTAINER ------ */}\r\n {/* --------------------------------- */}\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* ZOOM CONTROL CONTAINER ---------- */}\r\n {/* --------------------------------- */}\r\n \r\n\r\n {/* ----------------------------------------- */}\r\n {/* CHECK OUTAGE STATUS CONTROL ------------- */}\r\n {/* ----------------------------------------- */}\r\n \r\n {/* @todo: change to BlueSecondaryButton */}\r\n {\r\n dispatch(updateSearchModeState(true));\r\n\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Check Outage Status Clicked\",\r\n });\r\n }}\r\n >\r\n \"Pin\r\n Check Outage Status\r\n \r\n \r\n\r\n {/* ----------------------------------------- */}\r\n {/* ADMIN FOOTER ---------------------------- */}\r\n {/* ----------------------------------------- */}\r\n {auth.loggedIn && isAuthenticated && (\r\n \r\n
    \r\n {\r\n event.preventDefault();\r\n dispatch(updateAdminModeState(true));\r\n dispatch(updateDrawerState(true));\r\n dispatch(fetchAdminOutages());\r\n }}\r\n >\r\n Open Admin Panel\r\n \r\n |\r\n {\r\n event.preventDefault();\r\n authService.signOut(history);\r\n }}\r\n >\r\n Logout\r\n \r\n
    \r\n
    \r\n )}\r\n\r\n {/* --------------------------------- */}\r\n {/* LEGEND CONTAINER ---------------- */}\r\n {/* --------------------------------- */}\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* ALERT COMPONENT ----------------- */}\r\n {/* --------------------------------- */}\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* LOADING OVERLAY COMPONENT ------- */}\r\n {/* --------------------------------- */}\r\n {loading && }\r\n \r\n );\r\n};\r\n\r\nexport default BASE_MAP;\r\n","import styled from \"@emotion/styled\";\r\nimport { ListGroup, ListGroupProps } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst AdminPanelContainer = styled.div`\r\n &.admin-panel-container {\r\n height: 100%;\r\n padding: 80px 0 0 0;\r\n margin: 0;\r\n &.force-scroll {\r\n overflow-y: scroll;\r\n }\r\n }\r\n`;\r\n\r\nconst DroppedPinListContainer = styled.div`\r\n &.dropped-pin-list-container {\r\n height: 100%;\r\n\r\n h1 {\r\n font-family: ${(props) => props.theme.fontFamilies.semiBold};\r\n font-size: ${(props) => props.theme.fontSizes.large}px;\r\n text-align: center;\r\n margin-bottom: 12px;\r\n }\r\n\r\n .spinner-container {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n align-items: center;\r\n justify-items: center;\r\n .spinner-border {\r\n display: block;\r\n }\r\n }\r\n\r\n .list-wrapper {\r\n height: 100%;\r\n padding-bottom: 2em;\r\n overflow-y: auto;\r\n }\r\n }\r\n`;\r\n\r\nconst DroppedPinListItem = styled(ListGroup.Item)`\r\n &.dropped-pin-list-item {\r\n padding: 0.75rem 0 0.75rem 32px;\r\n .detail-container {\r\n .col,\r\n .col-3 {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n .col-3 {\r\n font-family: ${(props) => props.theme.fontFamilies.semiBold};\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst NoResultsContainer = styled.div`\r\n &.no-results-container {\r\n height: 100%;\r\n text-align: center;\r\n padding: 28px 0 0 0;\r\n }\r\n`;\r\n\r\nexport default {\r\n AdminPanelContainer,\r\n DroppedPinListContainer,\r\n DroppedPinListItem,\r\n NoResultsContainer,\r\n};\r\n","import { PaginationProps } from \"react-bootstrap\";\r\nimport { OutageViewModelWithContacts } from \"../../api/generated/models\";\r\nimport { IAdminOutages } from \"../../state-management/slices/outages/outages.slice\";\r\n\r\nexport interface IPaginationProps extends PaginationProps {\r\n data: OutageViewModelWithContacts[] | null;\r\n currentPage: number;\r\n totalCount: number | null;\r\n pageSize?: number;\r\n}\r\n\r\nexport const DefaultPaginationProps = {\r\n data: null,\r\n pageSize: 50,\r\n};\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst PaginationContainer = styled.div`\r\n &.pagination-container {\r\n display: flex;\r\n margin: 12px 0;\r\n justify-content: center;\r\n width: 100%;\r\n &:first-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .page-item {\r\n &.disabled {\r\n .page-link {\r\n background-color: ${({ theme }) => theme.colors.grays.senary};\r\n border-color: ${({ theme }) => theme.colors.grays.senary};\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n PaginationContainer,\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Pagination } from \"react-bootstrap\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { ClickEvent } from \"../../shared/types/event.types\";\r\nimport { fetchAdminOutages } from \"../../state-management/slices/outages/outages.thunk\";\r\nimport { DefaultPaginationProps, IPaginationProps } from \"./Pagination.types\";\r\nimport PaginationStyles from \"./Pagination.styles\";\r\nimport { AppDispatch } from \"../../state-management/store\";\r\n\r\nconst renderPageItems = (\r\n pages: Array,\r\n pageSize: number | undefined,\r\n currentPage: number,\r\n dispatch: AppDispatch\r\n) => {\r\n if (pages.length <= 10) {\r\n return pages.map((navPageNumber: number) => (\r\n {\r\n dispatch(fetchAdminOutages(pageSize, navPageNumber));\r\n }}\r\n active={currentPage === navPageNumber}\r\n key={navPageNumber}\r\n >\r\n {navPageNumber}\r\n \r\n ));\r\n }\r\n\r\n if (pages.length > 10 && currentPage <= 10) {\r\n const pageNumbers = Array.from({ length: 10 }, (_, index) => index + 1);\r\n return pageNumbers.map((navPageNumber: number) => (\r\n {\r\n dispatch(fetchAdminOutages(pageSize, navPageNumber));\r\n }}\r\n active={currentPage === navPageNumber}\r\n key={navPageNumber}\r\n >\r\n {navPageNumber}\r\n \r\n ));\r\n }\r\n\r\n if (pages.length > 10 && currentPage >= 10) {\r\n return (\r\n <>\r\n {\r\n dispatch(fetchAdminOutages(pageSize, currentPage - 2));\r\n }}\r\n active={false}\r\n key={currentPage - 2}\r\n >\r\n {currentPage - 2}\r\n \r\n {\r\n dispatch(fetchAdminOutages(pageSize, currentPage - 1));\r\n }}\r\n active={false}\r\n key={currentPage - 1}\r\n >\r\n {currentPage - 1}\r\n \r\n {\r\n dispatch(fetchAdminOutages(pageSize, currentPage));\r\n }}\r\n active={true}\r\n key={currentPage}\r\n >\r\n {currentPage}\r\n \r\n {\r\n dispatch(fetchAdminOutages(pageSize, currentPage + 1));\r\n }}\r\n active={false}\r\n key={currentPage + 1}\r\n >\r\n {currentPage + 1}\r\n \r\n {\r\n dispatch(fetchAdminOutages(pageSize, currentPage + 2));\r\n }}\r\n active={false}\r\n key={currentPage + 2}\r\n >\r\n {currentPage + 2}\r\n \r\n \r\n );\r\n }\r\n};\r\n\r\nconst PAGINATION: React.FC = (props: IPaginationProps) => {\r\n const dispatch = useDispatch();\r\n const { data, pageSize, currentPage, totalCount } = props;\r\n\r\n const [pages, setPages] = useState>([]);\r\n\r\n useEffect(() => {\r\n if (totalCount && pageSize) {\r\n // Builds an array of numbers from the number of pages (number of pages is totalCount/pageSize).\r\n const pageNumbers = Array.from(\r\n { length: Math.ceil(totalCount / pageSize) },\r\n (_, index) => index + 1\r\n );\r\n\r\n setPages(pageNumbers);\r\n }\r\n }, [data, totalCount, pageSize]);\r\n\r\n return (\r\n \r\n \r\n {\r\n dispatch(fetchAdminOutages(pageSize, 1));\r\n }}\r\n />\r\n {\r\n if (currentPage > 1)\r\n dispatch(fetchAdminOutages(pageSize, currentPage - 1));\r\n }}\r\n />\r\n {pages.length &&\r\n renderPageItems(pages, pageSize, currentPage, dispatch)}\r\n {\r\n if (currentPage + 1 <= pages.length)\r\n dispatch(fetchAdminOutages(pageSize, currentPage + 1));\r\n }}\r\n />\r\n \r\n dispatch(fetchAdminOutages(pageSize, pages.length))\r\n }\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nPAGINATION.defaultProps = DefaultPaginationProps;\r\nexport default PAGINATION;\r\n","import React, { MouseEventHandler, useEffect, useState } from \"react\";\r\nimport {\r\n DefaultDroppedPinListProps,\r\n IDroppedPinListProps,\r\n} from \"./AdminPanel.types\";\r\nimport AdminStyles from \"./AdminPanel.styles\";\r\nimport MockOutages from \"../../api/mock/data/outages\";\r\nimport { OutageViewModel } from \"../../api/generated/models\";\r\nimport { Col, Container, ListGroup, Row, Spinner } from \"react-bootstrap\";\r\nimport { ClickEvent } from \"../../shared/types/event.types\";\r\nimport {\r\n setSelectedOutageAdminMode,\r\n setShowAdminModal,\r\n} from \"../../state-management/slices/global/global.slice\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppDispatch } from \"../../state-management/store\";\r\nimport { RootState } from \"../../state-management/root-reducer\";\r\nimport PAGINATION from \"../pagination/Pagination.component\";\r\nimport { FeatureLayerService } from \"../map/FeatureLayer.service\";\r\nimport { BaseMapService } from \"../map/BaseMap.service\";\r\nimport { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\n\r\nconst renderListItems = (\r\n data: OutageViewModel[],\r\n dispatch: AppDispatch,\r\n featureLayerService: FeatureLayerService\r\n): React.ReactNode => {\r\n return data.map((outage: OutageViewModel) => {\r\n return (\r\n {\r\n featureLayerService.centerMapToLocation(outage);\r\n dispatch(setSelectedOutageAdminMode({ selectedOutage: outage }));\r\n dispatch(setShowAdminModal({ show: true }));\r\n }}\r\n >\r\n \r\n \r\n Outage Id:\r\n {outage.outageId}\r\n \r\n \r\n Address:\r\n \r\n {`${outage.location?.address}, ${outage.location?.city}, MI`}\r\n \r\n \r\n \r\n \r\n );\r\n });\r\n};\r\n\r\nconst DROPPED_PIN_LIST: React.FC = (\r\n props: IDroppedPinListProps\r\n) => {\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n\r\n const baseMapService = BaseMapService.getInstance(dispatch, sendDataToGTM);\r\n const featureLayerService = baseMapService.getFeatureLayerService();\r\n\r\n // App state\r\n const { adminOutages } = useSelector((state: RootState) => state.outages);\r\n const { isLoading, outageCollection, pagination } = adminOutages;\r\n const { currentPage, totalCount, pageSize } = pagination;\r\n\r\n return (\r\n \r\n

    {props.title}

    \r\n\r\n {isLoading && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n {!isLoading && outageCollection && outageCollection.length && (\r\n
    \r\n \r\n \r\n {renderListItems(outageCollection, dispatch, featureLayerService)}\r\n \r\n \r\n
    \r\n )}\r\n\r\n {!isLoading && (!outageCollection || !outageCollection?.length) && (\r\n \r\n There are currently no outages to reconcile.\r\n \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nDROPPED_PIN_LIST.defaultProps = DefaultDroppedPinListProps;\r\nexport default DROPPED_PIN_LIST;\r\n","import { ITestableComponentProps } from \"../../shared/types/testing.types\";\r\n\r\nexport interface IAdminPanelProps extends ITestableComponentProps {\r\n title?: string;\r\n}\r\n\r\nexport interface IDroppedPinListProps extends ITestableComponentProps {\r\n title?: string;\r\n}\r\n\r\nexport const DefaultAdminPanelProps = {\r\n title: undefined,\r\n};\r\n\r\nexport const DefaultDroppedPinListProps = {\r\n title: \"Dropped Pin List\",\r\n};\r\n","import React from \"react\";\r\nimport { IAdminPanelProps } from \"./AdminPanel.types\";\r\nimport AdminStyles from \"./AdminPanel.styles\";\r\nimport DROPPED_PIN_LIST from \"./DroppedPinList.component\";\r\n\r\nconst ADMIN_PANEL: React.FC = (props: IAdminPanelProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ADMIN_PANEL;\r\n","import styled from \"@emotion/styled\";\r\nimport { Form, Image } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst FormContainer = styled.div`\r\n &.form-container {\r\n height: 100%;\r\n padding: 80px 20px 20px;\r\n\r\n &.search-results {\r\n padding: 80px 20px 20px 6px;\r\n }\r\n\r\n .ce-soar-button {\r\n &.submit-outage-button,\r\n &.back-button {\r\n width: 100%;\r\n margin-bottom: 12px;\r\n }\r\n\r\n &.submit-outage-button {\r\n .loading-spinner {\r\n display: flex;\r\n width: 100%;\r\n justify-content: center;\r\n .loading-message {\r\n align-self: center;\r\n display: inline-block;\r\n text-align: center;\r\n padding-left: 8px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n &.force-scroll {\r\n overflow-y: scroll;\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n padding-bottom: 100px;\r\n }\r\n }\r\n`;\r\n\r\nconst FormGroup = styled(Form.Group)`\r\n &.form-group {\r\n padding-bottom: 0;\r\n margin-bottom: 28px;\r\n\r\n &.file-upload-form-group {\r\n .upload-message {\r\n font-size: ${(props) =>\r\n props.theme?.utils?.getFontThemeSize(\"smallest\")};\r\n margin-top: 4px;\r\n margin-bottom: 0;\r\n }\r\n\r\n .link-button {\r\n color: ${(props) => props.theme.colors.alerts.secondary};\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"small\")};\r\n text-decoration: underline;\r\n padding-left: 0;\r\n margin-bottom: 12px;\r\n svg {\r\n margin-right: 6px;\r\n }\r\n }\r\n\r\n .image-container {\r\n width: 100%;\r\n img {\r\n padding: 12px;\r\n width: 100%;\r\n }\r\n\r\n .image-controls {\r\n display: flex;\r\n div {\r\n flex: 1;\r\n margin-right: 8px;\r\n }\r\n\r\n button {\r\n background-color: ${(props) => props.theme.colors.essential.white};\r\n flex: 1;\r\n padding: 10px !important;\r\n font-size: ${(props) =>\r\n props.theme.utils.getFontThemeSize(\"small\")};\r\n\r\n &:hover {\r\n cursor: pointer;\r\n transform: scale(1);\r\n }\r\n\r\n &.replace-image {\r\n color: ${(props) => props.theme.colors.brand.primary};\r\n border-color: ${(props) => props.theme.colors.brand.primary};\r\n margin-right: 8px;\r\n &:hover {\r\n color: ${(props) =>\r\n props.theme.colors.brand.secondary}!important;\r\n border-color: ${(props) =>\r\n props.theme.colors.brand.secondary}!important;\r\n }\r\n }\r\n &.remove-image {\r\n color: ${(props) => props.theme.colors.essential.white};\r\n background-color: ${(props) => props.theme.colors.alerts.primary};\r\n border-color: ${(props) => props.theme.colors.alerts.primary};\r\n }\r\n }\r\n }\r\n }\r\n\r\n .processing-image-container {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n align-items: center;\r\n .spinner-border {\r\n display: block;\r\n }\r\n }\r\n\r\n .file-upload-control {\r\n span.file-upload-types {\r\n color: ${(props) => props.theme?.colors.grays.septenary};\r\n font-size: ${(props) =>\r\n props.theme?.utils?.getFontThemeSize(\"smallest\")};\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst FormControl = styled(Form.Control)`\r\n border-radius: 0;\r\n height: 60px;\r\n &.form-control {\r\n font-family: ${(props) => props.theme?.fontFamilies?.regular};\r\n\r\n &.outage-form-dropdown {\r\n -moz-appearance: none;\r\n .select-placeholder {\r\n color: ${(props) => props.theme?.colors.grays.septenary};\r\n opacity: 80%;\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"small\")};\r\n }\r\n &.is-invalid,\r\n &.is-valid {\r\n background-position: right 1.5em center;\r\n }\r\n }\r\n\r\n &.search-input {\r\n margin-top: 12px;\r\n }\r\n\r\n &.form-text-area {\r\n height: 120px;\r\n padding-right: 3.25em;\r\n &.is-invalid,\r\n &.is-valid {\r\n background-position: right 1.5em top 0.5em;\r\n }\r\n }\r\n\r\n &.form-counter {\r\n color: ${(props) => props.theme?.colors.grays.septenary};\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"smallest\")};\r\n text-align: right;\r\n width: 100%;\r\n display: inline-block;\r\n }\r\n\r\n &.form-phone-number,\r\n .form-email {\r\n margin-top: 6px;\r\n }\r\n }\r\n`;\r\n\r\nconst FormLabel = styled(Form.Label)`\r\n &.form-label {\r\n display: block;\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"small\")};\r\n &:first-child {\r\n margin-bottom: 0;\r\n }\r\n &.optional {\r\n color: ${(props) => props.theme?.colors.grays.septenary};\r\n }\r\n &.file-upload-label {\r\n background-color: ${(props) => props.theme.colors.essential.white};\r\n color: ${(props) => props.theme.colors.brand.primary};\r\n border: 1px solid ${(props) => props.theme.colors.brand.primary};\r\n font-family: Open Sans Semi Bold;\r\n padding: 12px 20px;\r\n text-align: center;\r\n &:hover {\r\n color: ${(props) => props.theme.colors.brand.secondary}!important;\r\n border: 1px solid\r\n ${(props) => props.theme.colors.brand.secondary}!important;\r\n cursor: pointer;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst FormHeading = styled.div`\r\n &.form-heading {\r\n h1 {\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n font-size: ${(props) => props.theme?.utils?.increaseFontSize(2)};\r\n }\r\n\r\n p {\r\n font-family: ${(props) => props.theme?.fontFamilies?.regular};\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"small\")};\r\n }\r\n }\r\n`;\r\n\r\nconst FormSubmitContainer = styled.div`\r\n &.form-submit-container {\r\n margin-top: 3em;\r\n\r\n button.search-outage-button {\r\n width: 100%;\r\n }\r\n }\r\n`;\r\n\r\nconst FormConfirmationContainer = styled.div`\r\n &.form-confirmation-container {\r\n height: 100%;\r\n overflow-y: scroll;\r\n padding: 60px 20px 20px;\r\n\r\n img.submission-image {\r\n margin-bottom: 26px;\r\n width: 100%;\r\n }\r\n\r\n .ce-soar-button {\r\n &.back-button {\r\n width: 100%;\r\n margin-bottom: 12px;\r\n }\r\n }\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n padding-bottom: 100px;\r\n }\r\n }\r\n`;\r\n\r\nconst ConfirmationIcon = styled(Image)`\r\n &.confirmation-icon {\r\n display: block;\r\n height: 100px;\r\n margin: 10px auto;\r\n width: 100px;\r\n }\r\n`;\r\n\r\nconst ConfirmationHeading = styled.div`\r\n &.confirmation-heading {\r\n h1 {\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"large\")};\r\n }\r\n p {\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"small\")};\r\n }\r\n }\r\n`;\r\n\r\nconst ConfirmationReport = styled.div`\r\n &.confirmation-report {\r\n h2 {\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"base\")};\r\n }\r\n .confirmation-report-container {\r\n font-size: ${(props) => props.theme?.utils?.getFontThemeSize(\"small\")};\r\n margin-bottom: 20px;\r\n .row {\r\n margin: 4px -15px;\r\n }\r\n .label-column {\r\n padding-left: 0;\r\n padding-right: 0;\r\n }\r\n .wrapped-column {\r\n b {\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n ConfirmationHeading,\r\n ConfirmationReport,\r\n ConfirmationIcon,\r\n FormContainer,\r\n FormSubmitContainer,\r\n FormConfirmationContainer,\r\n FormGroup,\r\n FormControl,\r\n FormLabel,\r\n FormHeading,\r\n};\r\n","import { AppDispatch } from \"../../state-management/store\";\r\nimport { FormikHelpers } from \"formik\";\r\nimport * as yup from \"yup\";\r\nimport {\r\n IFormValues,\r\n ISearchFormValues,\r\n OutageSchemaType,\r\n PinModeSchemaType,\r\n SearchSchemaType,\r\n} from \"./Form.types\";\r\nimport { OutageViewModel } from \"../../api/generated/models\";\r\nimport {\r\n searchOutages,\r\n submitOutage,\r\n} from \"../../state-management/slices/outages/outages.thunk\";\r\nimport { getGlobalState } from \"../../shared/utils/testing.utils\";\r\nimport { IGTMEventFunction } from \"../../shared/types/logging.types\";\r\nimport FormUtils from \"./Form.utils\";\r\nimport { AnyObject, Assign, ObjectShape } from \"yup/lib/object\";\r\nimport { RequiredStringSchema } from \"yup/lib/string\";\r\n\r\n/**\r\n * FormService\r\n * @export\r\n * @class FormService\r\n */\r\nexport class FormService {\r\n private static instance: FormService;\r\n private dispatch: AppDispatch;\r\n private sendDataToGTM: IGTMEventFunction;\r\n private submitFormActions!: FormikHelpers;\r\n private searchFormActions!: FormikHelpers;\r\n private formikReference!: any;\r\n\r\n /**\r\n * Creates an instance of FormService.\r\n * @param {AppDispatch} dispatch\r\n * @param {IGTMEventFunction} sendDataToGTM\r\n * @memberof FormService\r\n */\r\n private constructor(dispatch: AppDispatch, sendDataToGTM: IGTMEventFunction) {\r\n this.dispatch = dispatch;\r\n this.sendDataToGTM = sendDataToGTM;\r\n }\r\n\r\n /**\r\n * getInstance\r\n * @static\r\n * @param {AppDispatch} dispatch\r\n * @return {*} {FormService}\r\n * @memberof FormService\r\n */\r\n public static getInstance(\r\n dispatch: AppDispatch,\r\n sendDataToGTM: IGTMEventFunction\r\n ): FormService {\r\n if (!FormService.instance) {\r\n FormService.instance = new FormService(dispatch, sendDataToGTM);\r\n }\r\n return FormService.instance;\r\n }\r\n\r\n /**\r\n * submitOutageReport\r\n * @param {*} values\r\n * @param {*} { setSubmitting, resetForm }\r\n * @memberof FormService\r\n */\r\n public submitOutageReport(\r\n values: IFormValues,\r\n actions: FormikHelpers\r\n ): void {\r\n this.submitFormActions = actions;\r\n this.dispatch(submitOutage(values, actions, this.sendDataToGTM));\r\n }\r\n\r\n /**\r\n * searchOutages\r\n * @param {ISearchFormValues} values\r\n * @param {FormikHelpers} actions\r\n * @memberof FormService\r\n */\r\n public searchOutages(\r\n values: ISearchFormValues,\r\n actions: FormikHelpers\r\n ): void {\r\n this.searchFormActions = actions;\r\n this.dispatch(searchOutages(values, actions, this.sendDataToGTM));\r\n }\r\n\r\n /**\r\n * getValidationSchema\r\n * @return {*} {yup.ObjectSchema}\r\n * @memberof FormService\r\n */\r\n public getValidationSchema():\r\n | PinModeSchemaType\r\n | SearchSchemaType\r\n | OutageSchemaType {\r\n const { pinMode, searchMode } = getGlobalState().ui;\r\n\r\n if (pinMode.enabled) {\r\n return FormUtils.pinModeSchema;\r\n }\r\n\r\n if (searchMode.enabled) {\r\n return FormUtils.searchSchema;\r\n }\r\n\r\n return FormUtils.outageSchema;\r\n }\r\n\r\n /**\r\n * getReportedDate\r\n * @param {(OutageViewModel | null)} outage\r\n * @return {*} {(string | null)}\r\n * @memberof FormService\r\n */\r\n public getReportedDate(outage: OutageViewModel | null): string | null {\r\n if (!outage || !outage.reportedDateTime) {\r\n return null;\r\n }\r\n\r\n const reportedDate = new Date(outage.reportedDateTime);\r\n return reportedDate.toLocaleDateString(\"en-US\");\r\n }\r\n\r\n /**\r\n * getReportedTime\r\n * @param {(OutageViewModel | null)} outage\r\n * @return {*} {(string | null)}\r\n * @memberof FormService\r\n */\r\n public getReportedTime(outage: OutageViewModel | null): string | null {\r\n if (!outage || !outage.reportedDateTime) {\r\n return null;\r\n }\r\n\r\n const reportedDate = new Date(outage.reportedDateTime);\r\n return reportedDate.toLocaleTimeString(\"en-US\");\r\n }\r\n\r\n public resetForm = (): void => {\r\n if (this.formikReference.current) {\r\n this.formikReference.current.resetForm();\r\n } else {\r\n return;\r\n }\r\n };\r\n\r\n public setFormikReference = (ref: any): void => {\r\n this.formikReference = ref;\r\n };\r\n}\r\n","import { AppDispatch } from \"../../state-management/store\";\r\nimport FormUtils from \"./Form.utils\";\r\nimport {\r\n BlobServiceClient,\r\n BlockBlobUploadResponse,\r\n} from \"@azure/storage-blob\";\r\nimport {\r\n setImageDataUrl,\r\n setFileData,\r\n setImageProcessing,\r\n} from \"../../state-management/slices/outages/outages.slice\";\r\nimport heic2any from \"heic2any\";\r\nimport imageCompression from \"browser-image-compression\";\r\nimport { isNullOrUndefined } from \"../../shared/utils/data.utils\";\r\n\r\n/**\r\n * ImageUploadService\r\n * @export\r\n * @class ImageUploadService\r\n */\r\nexport class ImageUploadService {\r\n private static instance: ImageUploadService;\r\n private dispatch: AppDispatch;\r\n\r\n /**\r\n * Creates an instance of ImageUploadService.\r\n * @param {AppDispatch} dispatch\r\n * @memberof ImageUploadService\r\n */\r\n private constructor(dispatch: AppDispatch) {\r\n this.dispatch = dispatch;\r\n }\r\n\r\n /**\r\n * @static getInstance\r\n * @param {AppDispatch} dispatch\r\n * @return {*} {ImageUploadService}\r\n * @memberof ImageUploadService\r\n */\r\n public static getInstance(dispatch: AppDispatch): ImageUploadService {\r\n if (!ImageUploadService.instance) {\r\n ImageUploadService.instance = new ImageUploadService(dispatch);\r\n }\r\n return ImageUploadService.instance;\r\n }\r\n\r\n /**\r\n * processImageUpload\r\n * @param {React.ChangeEvent} uploadEvent\r\n * @memberof ImageUploadService\r\n */\r\n public processImageUpload(uploadEvent: React.ChangeEvent): void {\r\n const reader = new FileReader();\r\n const file = uploadEvent.target.files[0];\r\n const imageUploadService = ImageUploadService.getInstance(this.dispatch);\r\n\r\n this.dispatch(setImageProcessing(true));\r\n\r\n reader.onload = async function (\r\n this: FileReader,\r\n ev: ProgressEvent\r\n ): Promise {\r\n if (this.result) {\r\n let blob: Blob = FormUtils.getBlobFromDataURI(this.result as string);\r\n let compressedFile;\r\n\r\n // If the file is of .heic, we convert it to a .jpg\r\n if (file.name.endsWith(\".heic\")) {\r\n blob = (await heic2any({\r\n blob,\r\n toType: \"image/jpeg\",\r\n }).then((value) => {\r\n return value;\r\n })) as Blob;\r\n }\r\n\r\n try {\r\n compressedFile = await imageCompression(file, {\r\n maxSizeMB: 4,\r\n fileType: \"image/jpeg\",\r\n }).then((result: File) => {\r\n return Promise.resolve(result);\r\n });\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n\r\n if (!isNullOrUndefined(compressedFile)) {\r\n const payload = {\r\n lastModified: compressedFile.lastModified,\r\n name: compressedFile.name,\r\n size: compressedFile.size,\r\n type: compressedFile.type,\r\n };\r\n\r\n FormUtils.getDataUriFromBlob(\r\n compressedFile,\r\n (dataUrl: string | ArrayBuffer | null | undefined) => {\r\n imageUploadService.dispatch(setImageDataUrl(dataUrl));\r\n imageUploadService.dispatch(setFileData(payload));\r\n imageUploadService.dispatch(setImageProcessing(false));\r\n }\r\n );\r\n }\r\n }\r\n };\r\n\r\n reader.readAsDataURL(uploadEvent.target.files[0]);\r\n }\r\n}\r\n","export default __webpack_public_path__ + \"static/media/successful-submit-icon.3a738ea5.svg\";","import React from \"react\";\r\nimport { IFormConfirmationProps } from \"../Form.types\";\r\nimport SuccessfulSubmitIcon from \"../../../theme/assets/successful-submit-icon.svg\";\r\nimport { Col, Container, Row, Image } from \"react-bootstrap\";\r\nimport BUTTON from \"../../button/Button.component\";\r\nimport FormStyles from \"../Form.styles\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { FormService } from \"../Form.service\";\r\nimport { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport { RootState } from \"../../../state-management/root-reducer\";\r\n\r\nconst renderMessage = (pinMode: {\r\n enabled: boolean;\r\n pin: import(\"../../map/Map.types\").ISelectedMarker;\r\n selectedBracketType: string | null;\r\n}): JSX.Element => {\r\n return pinMode.enabled ? (\r\n

    \r\n Your streetlight issue has been submitted; however, we must confirm this\r\n is a Consumers Energy light. Thank you for your patience while we complete\r\n this investigation. We will be in touch as soon as a decision is made.\r\n

    \r\n ) : (\r\n

    \r\n Your streetlight outage report has been submitted. Check your email for\r\n the details of your submission.{\" \"}\r\n

    \r\n );\r\n};\r\n\r\nconst FORM_CONFIRMATION: React.FC = (\r\n props: IFormConfirmationProps\r\n) => {\r\n const { submittedOutage, onClose, imageUploadState } = props;\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n const formService: FormService = FormService.getInstance(\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n\r\n // App state\r\n const { pinMode } = useSelector((state: RootState) => state.globalState.ui);\r\n\r\n return (\r\n \r\n \r\n \r\n

    Thank you!

    \r\n {renderMessage(pinMode)}\r\n
    \r\n\r\n \r\n

    Report Summary

    \r\n \r\n \r\n \r\n Date:\r\n \r\n {formService.getReportedDate(submittedOutage)}\r\n \r\n \r\n \r\n Time:\r\n \r\n {formService.getReportedTime(submittedOutage)}\r\n \r\n \r\n \r\n Issue:\r\n \r\n \r\n {submittedOutage?.outageReason}\r\n \r\n \r\n \r\n \r\n Comments:\r\n \r\n {submittedOutage?.comments}\r\n \r\n \r\n
    \r\n\r\n {imageUploadState && imageUploadState.imgDataUrl && (\r\n \r\n )}\r\n {\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Back to map clicked from confirmation screen\",\r\n });\r\n onClose(event);\r\n }}\r\n >\r\n Back to Outage Map\r\n \r\n \r\n );\r\n};\r\n\r\nexport default FORM_CONFIRMATION;\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../../theme/theme.types\";\r\n\r\nexport const BracketTypeSelector = styled.div`\r\n &.bracket-type-selector {\r\n display: flex;\r\n margin-top: 12px;\r\n svg {\r\n margin-right: 10px;\r\n width: 65px;\r\n &:hover {\r\n circle {\r\n cursor: pointer;\r\n fill: ${(props) => props.theme.colors?.essential.buttonGreen};\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default { BracketTypeSelector };\r\n","const getFillColor = (\r\n type: string | undefined,\r\n selectedIconId: string\r\n): string => (type && type === selectedIconId ? \"#4d6e33\" : \"#929292\");\r\n\r\nexport default { getFillColor };\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { EBracketTypes } from \"../../../shared/enums/utility.enums\";\r\nimport { ClickEvent } from \"../../../shared/types/event.types\";\r\nimport { RootState } from \"../../../state-management/root-reducer\";\r\nimport { setPinBracketType } from \"../../../state-management/slices/global/global.slice\";\r\nimport STREETLIGHT_ICON from \"../../icon/streetlight-icon/StreetlightIcon.component\";\r\nimport BracketTypeStyles from \"./BracketTypeSelector.styles\";\r\nimport { IBracketTypeSelectorProps } from \"./BracketTypeSelector.types\";\r\nimport BracketTypeSelectorUtils from \"./BracketTypeSelector.utils\";\r\n\r\nconst BRACKET_TYPE_SELECTOR: React.FC = (props) => {\r\n const { globalState } = useSelector((state: RootState) => state);\r\n const [selectedIconId, setSelectedIcon] = useState(\"\");\r\n const dispatch = useDispatch();\r\n\r\n const { onChange } = props;\r\n\r\n useEffect(() => {\r\n let selectedBracketType = null;\r\n if (globalState && globalState.ui) {\r\n const { pinMode } = globalState?.ui;\r\n if (pinMode) {\r\n // eslint-disable-next-line prefer-destructuring\r\n selectedBracketType = pinMode.selectedBracketType;\r\n }\r\n }\r\n\r\n if (selectedBracketType && selectedIconId !== selectedBracketType) {\r\n if (selectedBracketType) {\r\n setSelectedIcon(selectedBracketType);\r\n }\r\n }\r\n }, [globalState, selectedIconId]);\r\n\r\n return (\r\n ) => {\r\n const { parentElement } = event.target as HTMLDivElement;\r\n if (parentElement) {\r\n onChange({\r\n previousValue: selectedIconId,\r\n newValue: parentElement.id,\r\n });\r\n dispatch(\r\n setPinBracketType({\r\n bracketType: parentElement.id as EBracketTypes,\r\n })\r\n );\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default BRACKET_TYPE_SELECTOR;\r\n","import React, { ReactElement, useEffect, useRef, useState } from \"react\";\r\nimport {\r\n Alert,\r\n Form,\r\n Image,\r\n OverlayTrigger,\r\n PopoverBody,\r\n Popover,\r\n Spinner,\r\n} from \"react-bootstrap\";\r\nimport FormStyles from \"../Form.styles\";\r\nimport ButtonStyles from \"../../button/Button.styles\";\r\nimport BUTTON from \"../../button/Button.component\";\r\nimport { Formik, FormikHelpers, FormikProps } from \"formik\";\r\nimport FormConstants from \"../Form.constants\";\r\nimport { IFormValues, IOutageFormProps } from \"../Form.types\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { FormService } from \"../Form.service\";\r\nimport { ImageUploadService } from \"../ImageUpload.service\";\r\nimport { RootState } from \"../../../state-management/root-reducer\";\r\nimport FORM_CONFIRMATION from \"./FormConfirmation.component\";\r\nimport { OutageViewModel } from \"../../../api/generated/models/outage-view-model\";\r\nimport faker from \"faker\";\r\nimport { animateLoading, createLoadingTimeline } from \"../Form.animations\";\r\nimport NumberFormat, { NumberFormatValues } from \"react-number-format\";\r\nimport { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport BRACKET_TYPE_SELECTOR from \"../bracket-type-selector/BracketTypeSelector.component\";\r\nimport { ClickEvent } from \"../../../shared/types/event.types\";\r\nimport { GENERIC_ERROR_MESSAGE } from \"../../../api/constants/error.constants\";\r\nimport {\r\n clearImageData,\r\n setShowSafetyTooltip,\r\n} from \"../../../state-management/slices/outages/outages.slice\";\r\nimport { ExclamationCircleFill, X } from \"react-bootstrap-icons\";\r\nimport PopupStyles from \"../../map/widgets/Popup/Popup.styles\";\r\n\r\nconst OUTAGE_FORM: React.FC = (props: IOutageFormProps) => {\r\n // props\r\n const { onClose } = props;\r\n\r\n // hooks\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n\r\n // services\r\n const formService: FormService = FormService.getInstance(\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n const imageUploadService: ImageUploadService =\r\n ImageUploadService.getInstance(dispatch);\r\n\r\n // local state\r\n const [showSubmittedError, setShowSubmittedError] = useState(false);\r\n\r\n // App state\r\n const { submittedOutage, isLoading, imageUpload } = useSelector(\r\n (state: RootState) => state.outages\r\n );\r\n\r\n const { lookupCollection } = useSelector((state: RootState) => state.lookups);\r\n const { pinMode } = useSelector((state: RootState) => state.globalState.ui);\r\n const { outage } = submittedOutage;\r\n\r\n const validationSchema = formService.getValidationSchema();\r\n const formikReference: any = useRef(null);\r\n const { showSafetyTooltip } = imageUpload;\r\n\r\n let { renderOptions } = props;\r\n\r\n useEffect(() => {\r\n const loadingTimeline = createLoadingTimeline();\r\n\r\n if (formikReference.current) {\r\n formService.setFormikReference(formikReference);\r\n }\r\n\r\n if (submittedOutage.submitOutageError) {\r\n setShowSubmittedError(true);\r\n loadingTimeline.pause();\r\n } else {\r\n setShowSubmittedError(false);\r\n if (!loadingTimeline.began) {\r\n if (isLoading && !submittedOutage.submitOutageError) {\r\n animateLoading(loadingTimeline);\r\n }\r\n }\r\n }\r\n }, [formService, isLoading, submittedOutage.submitOutageError]);\r\n\r\n if (!renderOptions) {\r\n renderOptions = (outageReasons) => {\r\n return outageReasons.map((outageReason) => {\r\n return (\r\n \r\n {outageReason}\r\n \r\n );\r\n });\r\n };\r\n }\r\n\r\n return (\r\n <>\r\n {submittedOutage.isSubmitted && (\r\n onClose(event)}\r\n />\r\n )}\r\n\r\n {!submittedOutage.isSubmitted && (\r\n \r\n \r\n ) => {\r\n const invalid =\r\n pinMode.enabled &&\r\n (!values.outageFormBracketType ||\r\n values.outageFormBracketType === \"\");\r\n\r\n if (invalid) return;\r\n formService.submitOutageReport(values, actions);\r\n }}\r\n >\r\n {({\r\n handleSubmit,\r\n handleChange,\r\n handleBlur,\r\n setFieldValue,\r\n values,\r\n touched,\r\n isValid,\r\n errors,\r\n resetForm,\r\n }) => (\r\n
    \r\n \r\n {/* -------------------------------- */}\r\n {/* FORM HEADING ------------------- */}\r\n {/* -------------------------------- */}\r\n \r\n

    Let's see what the problem is.

    \r\n

    \r\n Please provide as much information as you can to assist us\r\n with your streetlight outage report.\r\n

    \r\n
    \r\n\r\n {/* ------------------------------------- */}\r\n {/* BRACKET TYPE SELECTOR (Pin Mode Only) */}\r\n {/* ------------------------------------- */}\r\n {pinMode.enabled && (\r\n \r\n \r\n What style of light is it?\r\n \r\n {\r\n setFieldValue(\r\n \"outageFormBracketType\",\r\n event.newValue\r\n );\r\n }}\r\n />\r\n \r\n {errors?.outageFormBracketType}\r\n \r\n \r\n )}\r\n\r\n {/* --------------------------------- */}\r\n {/* OUTAGE REASON ------------------- */}\r\n {/* --------------------------------- */}\r\n \r\n What's wrong with the light?\r\n \r\n \r\n \r\n {renderOptions &&\r\n lookupCollection &&\r\n lookupCollection.outageReasons &&\r\n renderOptions(lookupCollection.outageReasons)}\r\n \r\n \r\n {errors?.outageFormDropdown}\r\n \r\n
    \r\n\r\n {/* --------------------------------- */}\r\n {/* COMMENTS ------------------------ */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n Is there anything else we should know?\r\n \r\n \r\n (optional)\r\n \r\n \r\n \r\n {errors?.outageFormComments}\r\n \r\n \r\n ({values.outageFormComments.length}/190)\r\n \r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* FILE UPLOAD --------------------- */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n Upload a photo of the light\r\n \r\n

    \r\n Providing a picture of the streetlight and its surroundings\r\n can help us locate and service it quicker.\r\n

    \r\n\r\n \r\n \r\n
    \r\n Make sure to obey all traffic laws and{\" \"}\r\n maintain a safe distance (at least 25 feet)\r\n when taking a photo, especially if there’s damage,\r\n wires down or exposed, etc.\r\n
    \r\n
    \r\n {\r\n dispatch(setShowSafetyTooltip(false));\r\n }}\r\n title=\"Close Button\"\r\n >\r\n \r\n \r\n
    \r\n
    \r\n \r\n }\r\n onToggle={(nextShow: boolean) => {\r\n dispatch(setShowSafetyTooltip(nextShow));\r\n }}\r\n >\r\n \r\n \r\n Safety Warning\r\n \r\n \r\n\r\n {imageUpload.imageProcessing && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n {!imageUpload.imgDataUrl && !imageUpload.imageProcessing && (\r\n
    \r\n \r\n Choose Photo\r\n \r\n ) => {\r\n imageUploadService.processImageUpload(event);\r\n setFieldValue(\r\n \"outageFormFile\",\r\n event.target.files[0]\r\n );\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Image Selected - Outage Form\",\r\n });\r\n }}\r\n />\r\n \r\n Accepted file formats: JPG, PNG, HEIC\r\n \r\n
    \r\n )}\r\n\r\n {imageUpload.imgDataUrl && !imageUpload.imageProcessing && (\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n Replace Photo\r\n \r\n ) => {\r\n imageUploadService.processImageUpload(event);\r\n setFieldValue(\r\n \"outageFormFile\",\r\n event.target.files[0]\r\n );\r\n }}\r\n />\r\n
    \r\n\r\n {\r\n event.preventDefault();\r\n dispatch(clearImageData());\r\n }}\r\n >\r\n Remove Photo\r\n \r\n
    \r\n
    \r\n )}\r\n
    \r\n\r\n {/* --------------------------------- */}\r\n {/* USERS NAME ---------------------- */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n

    One last thing!

    \r\n

    \r\n We require your contact information should we have\r\n questions on your outage. If we're unable to reach\r\n you, your order may be cancelled.\r\n

    \r\n
    \r\n \r\n Name\r\n \r\n \r\n \r\n {errors?.outageFormName}\r\n \r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* USERS PHONE NUMBER -------------- */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n Phone Number\r\n \r\n {\r\n setFieldValue(\"outageFormPhone\", event.floatValue);\r\n }}\r\n onBlur={handleBlur}\r\n isValid={touched.outageFormPhone && !errors.outageFormPhone}\r\n />\r\n \r\n {errors.outageFormPhone}\r\n \r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* USERS EMAIL ADDRESS ------------- */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n Email address\r\n \r\n \r\n \r\n {errors.outageFormEmail}\r\n \r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* SUBMIT BUTTON AND ALERTS -------- */}\r\n {/* --------------------------------- */}\r\n \r\n {showSubmittedError && (\r\n setShowSubmittedError(false)}\r\n dismissible\r\n >\r\n Submission Failed\r\n

    {GENERIC_ERROR_MESSAGE}

    \r\n \r\n )}\r\n \r\n {isLoading ? (\r\n
    \r\n \r\n \r\n One Moment Please...\r\n \r\n
    \r\n ) : (\r\n \"Submit Outage Report\"\r\n )}\r\n \r\n\r\n \r\n {\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Back to map clicked from outage form\",\r\n });\r\n setShowSafetyTooltip(false);\r\n onClose(event);\r\n }}\r\n >\r\n Back to Outage Map\r\n \r\n \r\n
    \r\n \r\n )}\r\n \r\n
    \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default OUTAGE_FORM;\r\n","import anime from \"animejs\";\r\nimport ThemeKit from \"../../theme\";\r\n\r\nexport const createLoadingTimeline = (): anime.AnimeTimelineInstance => {\r\n return anime.timeline({\r\n targets: \".submit-outage-button\",\r\n endDelay: 250,\r\n easing: \"linear\",\r\n loop: true,\r\n });\r\n};\r\n\r\nexport const animateLoading = (timeline: anime.AnimeTimelineInstance): void => {\r\n timeline\r\n .add({\r\n backgroundColor: ThemeKit.CE_THEME.colors.cta.primary,\r\n delay: 250,\r\n })\r\n .add({\r\n backgroundColor: ThemeKit.CE_THEME.colors.essential.buttonGreen,\r\n });\r\n};\r\n","import * as yup from \"yup\";\r\nimport { FormProps } from \"react-bootstrap\";\r\nimport { Assign, ObjectShape } from \"yup/lib/object\";\r\nimport { RequiredStringSchema } from \"yup/lib/string\";\r\nimport { AnyObject } from \"yup/lib/types\";\r\nimport { Asserts } from \"yup/lib/util/types\";\r\nimport { OutageViewModel } from \"../../api/generated/models\";\r\nimport { ESearchWizardSteps } from \"../../shared/enums/search.enums\";\r\nimport { ClickEvent } from \"../../shared/types/event.types\";\r\nimport { ITestableComponentProps } from \"../../shared/types/testing.types\";\r\nimport { IImageUploadState } from \"../../state-management/slices/outages/outages.slice\";\r\nimport { ReactNode } from \"react\";\r\n\r\nexport type PinModeSchemaType = yup.ObjectSchema<\r\n Assign<\r\n ObjectShape,\r\n {\r\n outageFormName: RequiredStringSchema;\r\n outageFormPhone: RequiredStringSchema;\r\n outageFormEmail: RequiredStringSchema;\r\n outageFormComments: yup.StringSchema;\r\n outageFormDropdown: RequiredStringSchema;\r\n outageFormBracketType: RequiredStringSchema<\r\n string | undefined,\r\n AnyObject\r\n >;\r\n }\r\n >\r\n>;\r\n\r\nexport type OutageSchemaType = yup.ObjectSchema<\r\n Assign<\r\n ObjectShape,\r\n {\r\n outageFormName: RequiredStringSchema;\r\n outageFormPhone: RequiredStringSchema;\r\n outageFormEmail: RequiredStringSchema;\r\n outageFormComments: yup.StringSchema;\r\n outageFormDropdown: RequiredStringSchema;\r\n }\r\n >\r\n>;\r\n\r\nexport type SearchSchemaType = yup.ObjectSchema<\r\n Assign<\r\n ObjectShape,\r\n { searchFormText: RequiredStringSchema }\r\n >\r\n>;\r\n\r\nexport interface IFormValues {\r\n outageFormDropdown: string;\r\n outageFormComments: string;\r\n outageFormName: string;\r\n outageFormPhone: string;\r\n outageFormEmail: string;\r\n outageFormBracketType: string;\r\n}\r\n\r\nexport interface ISearchFormValues {\r\n searchFormText: string;\r\n}\r\nexport interface IAcceptOutageValues {\r\n acceptOutageFormGISID?: number;\r\n}\r\n\r\nexport interface IOutageSearchProps extends ITestableComponentProps {\r\n onClose: (event: ClickEvent) => void;\r\n activeView: \"search\" | \"results\" | \"detail\";\r\n testid?: string;\r\n}\r\n\r\nexport interface IOutageSearchFormProps\r\n extends ITestableComponentProps,\r\n FormProps {\r\n onClose: (event: ClickEvent) => void;\r\n testid?: string;\r\n}\r\n\r\nexport interface IOutageSearchResultsProps\r\n extends ITestableComponentProps,\r\n FormProps {\r\n onClose: (event: ClickEvent) => void;\r\n testid?: string;\r\n}\r\n\r\nexport interface IOutageFormProps extends ITestableComponentProps, FormProps {\r\n onClose: (event: ClickEvent) => void;\r\n renderOptions?: (outageReasons: Array) => ReactNode | null;\r\n}\r\n\r\nexport interface IFormConfirmationProps {\r\n submittedOutage: OutageViewModel | null;\r\n imageUploadState: IImageUploadState;\r\n onClose: (event: ClickEvent) => void;\r\n}\r\n\r\n// Default Props\r\nexport const DefaultOutageSearchProps: IOutageSearchProps = {\r\n activeView: ESearchWizardSteps.SEARCH,\r\n onClose: () => null,\r\n testid: \"outage-search\",\r\n};\r\n\r\nexport const DefaultOutageSearchFormProps: IOutageSearchFormProps = {\r\n onClose: () => null,\r\n testid: \"outage-search-form\",\r\n};\r\n\r\nexport const DefaultOutageSearchResultsProps: IOutageSearchResultsProps = {\r\n onClose: () => null,\r\n testid: \"outage-search-form-results\",\r\n};\r\n","import { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport { Formik, FormikHelpers } from \"formik\";\r\nimport React from \"react\";\r\nimport { Form } from \"react-bootstrap\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../../../state-management/root-reducer\";\r\nimport { setSearchTerm } from \"../../../../state-management/slices/global/global.slice\";\r\nimport BUTTON from \"../../../button/Button.component\";\r\nimport ButtonStyles from \"../../../button/Button.styles\";\r\nimport FormConstants from \"../../Form.constants\";\r\nimport { FormService } from \"../../Form.service\";\r\nimport FormStyles from \"../../Form.styles\";\r\nimport {\r\n DefaultOutageSearchFormProps,\r\n IOutageSearchFormProps,\r\n ISearchFormValues,\r\n} from \"../../Form.types\";\r\nimport FormUtils from \"../../Form.utils\";\r\n\r\nconst OUTAGE_SEARCH_FORM: React.FC = (\r\n props: IOutageSearchFormProps\r\n) => {\r\n // props\r\n const { onClose } = props;\r\n\r\n // hooks\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n\r\n // App state\r\n const { isLoading, searchedOutages } = useSelector(\r\n (state: RootState) => state.outages\r\n );\r\n const { searchMode } = useSelector(\r\n (state: RootState) => state.globalState.ui\r\n );\r\n const { searchText, activeView } = searchMode;\r\n\r\n // services\r\n const formService: FormService = FormService.getInstance(\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n\r\n return (\r\n \r\n \r\n ) => {\r\n dispatch(setSearchTerm(values.searchFormText));\r\n formService.searchOutages(values, actions);\r\n }}\r\n >\r\n {({\r\n handleSubmit,\r\n handleChange,\r\n handleBlur,\r\n values,\r\n touched,\r\n isValid,\r\n errors,\r\n resetForm,\r\n }) => (\r\n
    \r\n \r\n \r\n Enter the email, phone number, or notification number associated\r\n with your reports.\r\n \r\n \r\n \r\n {errors?.searchFormText}\r\n \r\n \r\n \r\n \r\n {isLoading ? \"One Moment Please...\" : \"Search\"}\r\n \r\n\r\n \r\n {\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: \"Back to map clicked from outage search form\",\r\n });\r\n\r\n onClose(event);\r\n }}\r\n >\r\n Back to Outage Map\r\n \r\n \r\n \r\n
    \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nOUTAGE_SEARCH_FORM.defaultProps = DefaultOutageSearchFormProps;\r\nexport default OUTAGE_SEARCH_FORM;\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../../theme/theme.types\";\r\n\r\nconst SearchResultsList = styled.ul`\r\n &.search-results-list {\r\n list-style: none;\r\n padding: 0;\r\n\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n /* padding-bottom: 100px; */\r\n }\r\n }\r\n`;\r\nconst ResultsListItem = styled.li`\r\n &.results-list-item {\r\n padding: 8px 0 8px 12px;\r\n @media (max-width: ${(props) =>\r\n props.theme.utils.getThemeBreakpoint(\"tablet\")}) {\r\n /* padding-bottom: 100px; */\r\n }\r\n }\r\n`;\r\n\r\nconst ResultsContainer = styled.div`\r\n &.results-container {\r\n display: flex;\r\n svg {\r\n width: 50px;\r\n height: 50px;\r\n }\r\n }\r\n`;\r\n\r\nconst NoResultsContainer = styled.div`\r\n &.no-results-container {\r\n .icon-container {\r\n background-color: ${(props) => props.theme.colors.alerts.secondary};\r\n border-radius: 50%;\r\n width: 80px;\r\n height: 80px;\r\n margin: 12px auto;\r\n img {\r\n width: 65px;\r\n height: 65px;\r\n margin: 8px;\r\n }\r\n }\r\n\r\n p {\r\n font-family: ${(props) => props.theme.fontFamilies.semiBold};\r\n font-size: 18px;\r\n text-align: center;\r\n }\r\n }\r\n`;\r\n\r\nconst ResultsContent = styled.div`\r\n &.results-content {\r\n margin-left: 10px;\r\n width: 100%;\r\n p {\r\n margin-bottom: 0;\r\n &.notification-id {\r\n color: ${(props) => props.theme.colors.essential.grayDark};\r\n }\r\n }\r\n\r\n .results-header {\r\n display: flex;\r\n width: 100%;\r\n justify-content: space-between;\r\n div {\r\n &.status {\r\n font-family: ${(props) => props.theme.fontFamilies.semiBold};\r\n &.reported {\r\n color: ${(props) => props.theme.colors.alerts.secondary};\r\n }\r\n &.not-reported {\r\n color: ${(props) => props.theme.colors.brand.primary};\r\n }\r\n &.extended-repair {\r\n color: ${(props) =>\r\n props.theme.colors.mapMarkers.extendedRepairStroke};\r\n }\r\n }\r\n &.reported-date {\r\n align-self: center;\r\n color: ${(props) => props.theme.colors.essential.grayDark};\r\n font-size: 12px;\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n SearchResultsList,\r\n ResultsListItem,\r\n ResultsContainer,\r\n NoResultsContainer,\r\n ResultsContent,\r\n};\r\n","export default __webpack_public_path__ + \"static/media/exclamation.c87c7691.svg\";","import React from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { OutageViewModel } from \"../../../../api/generated/models\";\r\nimport { RootState } from \"../../../../state-management/root-reducer\";\r\nimport { ISearchedOutages } from \"../../../../state-management/slices/outages/outages.slice\";\r\nimport FormStyles from \"../../Form.styles\";\r\nimport OutageSearchStyles from \"../OutageSearch.styles\";\r\nimport { IOutageSearchResultsProps } from \"../../Form.types\";\r\nimport STREETLIGHT_ICON from \"../../../icon/streetlight-icon/StreetlightIcon.component\";\r\nimport { BracketTypeDisplayMap } from \"../../../../shared/enums/utility.enums\";\r\nimport {\r\n getKeyByValue,\r\n isNullOrUndefined,\r\n} from \"../../../../shared/utils/data.utils\";\r\nimport { getMarkerStatusFlag } from \"../../../../state-management/utils/state/outages.utils\";\r\nimport { Image } from \"react-bootstrap\";\r\nimport ExclamationIcon from \"../../../../theme/assets/exclamation.svg\";\r\nimport ButtonStyles from \"../../../button/Button.styles\";\r\nimport BUTTON from \"../../../button/Button.component\";\r\nimport { AppDispatch } from \"../../../../state-management/store\";\r\nimport {\r\n clearSearchTerm,\r\n setSearchView,\r\n} from \"../../../../state-management/slices/global/global.slice\";\r\nimport { ESearchWizardSteps } from \"../../../../shared/enums/search.enums\";\r\nimport { ClickEvent } from \"../../../../shared/types/event.types\";\r\nimport { EMarkerStatuses } from \"../../../map/Map.constants\";\r\nimport ColorsPalette from \"../../../../theme/colors/Colors.palette\";\r\n\r\nconst renderNotificationId = (outage: OutageViewModel): string => {\r\n if (\r\n !outage.sapNotification ||\r\n outage.sapNotification === undefined ||\r\n outage.sapNotification === \"\"\r\n ) {\r\n return \"Pending\";\r\n }\r\n\r\n return `#${outage.sapNotification}`;\r\n};\r\n\r\nconst getStatusClassNames = (\r\n reportedStatus: number,\r\n markerStatus: string | null | undefined\r\n): string | undefined => {\r\n if (markerStatus === EMarkerStatuses.EXTENDED_REPAIR) {\r\n return \"status extended-repair\";\r\n }\r\n\r\n if (reportedStatus) {\r\n return \"status reported\";\r\n } else {\r\n return \"status non-reported\";\r\n }\r\n};\r\n\r\nconst getMarkerStatusLabel = (markerStatus: string | null | undefined) => {\r\n if (isNullOrUndefined(markerStatus)) {\r\n throw new Error(\"markerStatus must be defined - getMarkerStatusLabel\");\r\n }\r\n\r\n if (\r\n markerStatus === EMarkerStatuses.REPORTED ||\r\n markerStatus === EMarkerStatuses.IN_PROGRESS\r\n ) {\r\n return \"In Progress\";\r\n } else {\r\n return markerStatus;\r\n }\r\n};\r\n\r\nconst renderResults = (outages: Array) => {\r\n return outages.map((outage, index) => {\r\n const { utility, markerStatus } = outage;\r\n const bracketType = utility?.bracketType;\r\n const reportedStatus = getMarkerStatusFlag(markerStatus);\r\n\r\n const reportedDateString = new Date(outage.reportedDateTime as string);\r\n const reportedDate = new Intl.DateTimeFormat(\"en-US\", {\r\n dateStyle: \"long\",\r\n }).format(reportedDateString);\r\n\r\n const streetlightType = getKeyByValue(\r\n BracketTypeDisplayMap,\r\n bracketType as string\r\n );\r\n\r\n return (\r\n \r\n \r\n {markerStatus !== EMarkerStatuses.EXTENDED_REPAIR && (\r\n \r\n )}\r\n\r\n {markerStatus === EMarkerStatuses.EXTENDED_REPAIR && (\r\n \r\n )}\r\n\r\n \r\n
    \r\n \r\n {getMarkerStatusLabel(markerStatus)}\r\n
    \r\n
    {`Reported ${reportedDate}`}
    \r\n \r\n\r\n

    \r\n {outage.location?.address} {outage.location?.city} MI\r\n

    \r\n

    {renderNotificationId(outage)}

    \r\n
    \r\n
    \r\n \r\n );\r\n });\r\n};\r\n\r\nconst renderNoResults = (\r\n searchTerm: string,\r\n dispatch: AppDispatch,\r\n onClose: (event: ClickEvent) => void\r\n) => {\r\n return (\r\n \r\n
    \r\n \r\n
    \r\n

    Sorry, we couldn't find any reports for {`\"${searchTerm}\"`}

    \r\n\r\n \r\n {\r\n dispatch(clearSearchTerm());\r\n dispatch(setSearchView({ activeView: ESearchWizardSteps.SEARCH }));\r\n }}\r\n >\r\n Try Again\r\n \r\n \r\n \r\n {\r\n onClose(event);\r\n }}\r\n >\r\n Back to Outage Map\r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nconst OUTAGE_SEARCH_RESULTS: React.FC = (\r\n props: IOutageSearchResultsProps\r\n) => {\r\n // hooks\r\n const dispatch = useDispatch();\r\n // props\r\n const { onClose } = props;\r\n\r\n // App State\r\n const { searchedOutages } = useSelector((state: RootState) => state.outages);\r\n const { outageCollection } = searchedOutages;\r\n const { searchMode } = useSelector(\r\n (state: RootState) => state.globalState.ui\r\n );\r\n\r\n return (\r\n \r\n {outageCollection && outageCollection.length && (\r\n <>\r\n \r\n {renderResults(outageCollection)}\r\n \r\n \r\n {\r\n onClose(event);\r\n }}\r\n >\r\n Back to Outage Map\r\n \r\n \r\n \r\n )}\r\n {(!outageCollection || !outageCollection.length) &&\r\n renderNoResults(searchMode.searchText || \"\", dispatch, onClose)}\r\n \r\n );\r\n};\r\nexport default OUTAGE_SEARCH_RESULTS;\r\n","import React from \"react\";\r\nimport { ESearchWizardSteps } from \"../../../shared/enums/search.enums\";\r\nimport { DefaultOutageSearchProps, IOutageSearchProps } from \"../Form.types\";\r\nimport OUTAGE_SEARCH_FORM from \"./views/SearchForm.component\";\r\nimport OUTAGE_SEARCH_RESULTS from \"./views/SearchResults.component\";\r\n\r\nconst OUTAGE_SEARCH: React.FC = (\r\n props: IOutageSearchProps\r\n) => {\r\n const { activeView, onClose } = props;\r\n\r\n let currentView;\r\n switch (activeView) {\r\n case ESearchWizardSteps.SEARCH:\r\n currentView = ;\r\n break;\r\n case ESearchWizardSteps.RESULTS:\r\n currentView = ;\r\n break;\r\n\r\n default:\r\n currentView = ;\r\n break;\r\n }\r\n\r\n return currentView;\r\n};\r\n\r\nOUTAGE_SEARCH.defaultProps = DefaultOutageSearchProps;\r\nexport default OUTAGE_SEARCH;\r\n","import anime from \"animejs\";\r\nimport { ESearchWizardSteps } from \"../../shared/enums/search.enums\";\r\nimport {\r\n clearSearchTerm,\r\n setSearchView,\r\n ISearchModeState,\r\n updateSearchModeState,\r\n IAdminModeState,\r\n updateAdminModeState,\r\n} from \"../../state-management/slices/global/global.slice\";\r\nimport {\r\n clearSearchedOutages,\r\n clearSubmittedOutage,\r\n ISubmittedOutage,\r\n} from \"../../state-management/slices/outages/outages.slice\";\r\nimport { AppDispatch } from \"../../state-management/store\";\r\nimport Theme from \"../../theme\";\r\n\r\nconst { outageDrawerWidth } = Theme.CE_THEME.layoutProperties;\r\n\r\nexport const openDrawer = (isMobile: boolean): void => {\r\n const openTimeline = anime.timeline({\r\n easing: \"easeOutCubic\",\r\n });\r\n\r\n if (isMobile) {\r\n openTimeline\r\n .add({\r\n targets: \".drawer-container\",\r\n translateY: [\"100vh\", 0],\r\n duration: 600,\r\n })\r\n .add({\r\n targets: \"#OutageForm\",\r\n opacity: [0, 1],\r\n duration: 600,\r\n });\r\n } else {\r\n openTimeline\r\n .add({\r\n targets: \".click-shield\",\r\n opacity: [0, 0.5],\r\n duration: 250,\r\n begin: function () {\r\n const shield = document.querySelector(\".click-shield\") as HTMLElement;\r\n if (shield) {\r\n shield.style.display = \"block\";\r\n }\r\n },\r\n })\r\n .add({\r\n targets: \".drawer-container\",\r\n translateX: [outageDrawerWidth, 0],\r\n duration: 600,\r\n })\r\n .add({\r\n targets: \"#OutageForm\",\r\n opacity: [0, 1],\r\n duration: 600,\r\n });\r\n }\r\n};\r\n\r\nexport const closeDrawer = (\r\n isMobile: boolean,\r\n dispatch: AppDispatch,\r\n submittedOutage: ISubmittedOutage,\r\n searchMode: ISearchModeState,\r\n adminMode: IAdminModeState\r\n): void => {\r\n const closeTimeline = anime.timeline({\r\n easing: \"easeOutCubic\",\r\n });\r\n\r\n if (isMobile) {\r\n closeTimeline\r\n .add({\r\n targets: \"#confirmationContainer\",\r\n opacity: [1, 0],\r\n duration: 600,\r\n })\r\n .add({\r\n targets: \"#OutageForm\",\r\n opacity: [1, 0],\r\n duration: 600,\r\n })\r\n .add({\r\n targets: \".drawer-container\",\r\n translateY: [0, \"100vh\"],\r\n duration: 600,\r\n changeComplete: function () {\r\n if (submittedOutage.isSubmitted) {\r\n dispatch(clearSubmittedOutage());\r\n }\r\n\r\n if (adminMode.enabled) {\r\n dispatch(updateAdminModeState(false));\r\n }\r\n\r\n if (searchMode.enabled) {\r\n dispatch(clearSearchTerm());\r\n dispatch(clearSearchedOutages());\r\n dispatch(setSearchView({ activeView: ESearchWizardSteps.SEARCH }));\r\n dispatch(updateSearchModeState(false));\r\n }\r\n },\r\n });\r\n } else {\r\n closeTimeline\r\n .add({\r\n targets: \"#OutageForm\",\r\n opacity: [1, 0],\r\n duration: 600,\r\n })\r\n .add({\r\n targets: \".drawer-container\",\r\n translateX: [0, outageDrawerWidth],\r\n easing: \"easeInCubic\",\r\n duration: 600,\r\n changeComplete: function () {\r\n if (submittedOutage.isSubmitted) {\r\n dispatch(clearSubmittedOutage());\r\n }\r\n\r\n if (adminMode.enabled) {\r\n dispatch(updateAdminModeState(false));\r\n }\r\n\r\n if (searchMode.enabled) {\r\n dispatch(clearSearchTerm());\r\n dispatch(clearSearchedOutages());\r\n dispatch(setSearchView({ activeView: ESearchWizardSteps.SEARCH }));\r\n dispatch(updateSearchModeState(false));\r\n }\r\n },\r\n })\r\n .add({\r\n targets: \".click-shield\",\r\n opacity: [0.5, 0],\r\n easing: \"easeInCubic\",\r\n duration: 250,\r\n complete: function () {\r\n const shield = document.querySelector(\".click-shield\") as HTMLElement;\r\n if (shield) {\r\n shield.style.display = \"none\";\r\n }\r\n },\r\n });\r\n }\r\n};\r\n","import styled from \"@emotion/styled\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst ClickSheild = styled.div`\r\n &.click-shield {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-color: black;\r\n height: 100%;\r\n width: 100%;\r\n z-index: 1000;\r\n opacity: 0;\r\n display: none;\r\n }\r\n`;\r\n\r\nconst DrawerContainter = styled.div`\r\n &.drawer-container {\r\n background-color: ${(props) => props.theme?.colors?.grays?.quaternary};\r\n height: 100%;\r\n overflow: hidden;\r\n position: absolute;\r\n right: 0;\r\n -webkit-transform: translateX(\r\n ${(props) => props.theme?.layoutProperties?.outageDrawerWidth}px\r\n );\r\n transform: translateX(\r\n ${(props) => props.theme?.layoutProperties?.outageDrawerWidth}px\r\n );\r\n z-index: 2000;\r\n width: ${(props) =>\r\n props.theme.utils.browserUtils.isMobileSafari\r\n ? \"30%\"\r\n : props.theme?.layoutProperties?.outageDrawerWidth + \"px\"};\r\n\r\n &.mobile {\r\n position: fixed; // @todo: Keep an eye on this, we may need to adjust for mobile browsers\r\n width: 100%;\r\n left: 0;\r\n right: 0;\r\n top: 75px;\r\n bottom: 0;\r\n transform: translateY(100vh);\r\n overflow-y: scroll;\r\n }\r\n .drawer-submit-button {\r\n color: ${({ theme }) => theme.colors?.essential.buttonGreen};\r\n }\r\n }\r\n`;\r\n\r\nconst DrawerHeader = styled.div`\r\n &.drawer-header {\r\n align-items: center;\r\n background-color: ${(props) => props.theme?.colors?.brand?.secondary};\r\n display: flex;\r\n font-family: ${(props) => props.theme?.fontFamilies?.regular};\r\n height: 60px;\r\n position: fixed;\r\n width: 100%;\r\n\r\n .title-container {\r\n flex: auto;\r\n h1 {\r\n color: ${(props) => props.theme?.colors?.essential?.white};\r\n font-size: ${(props) => props.theme?.fontSizes?.small}px;\r\n text-align: center;\r\n margin-bottom: 0;\r\n padding-left: 60px;\r\n &.search-mode {\r\n padding-left: 0;\r\n }\r\n }\r\n }\r\n\r\n .close-button-container {\r\n width: 60px;\r\n height: 60px;\r\n border-left: 1px solid ${(props) => props.theme?.colors?.essential?.white};\r\n button {\r\n appearance: none;\r\n background: none;\r\n border: 0 none;\r\n color: ${(props) => props.theme?.colors?.essential?.white};\r\n padding: 6px 10px 0;\r\n transition: all 250ms linear;\r\n\r\n &:hover {\r\n transform: scale(1.1);\r\n }\r\n\r\n .close-button-label {\r\n display: block;\r\n font-size: ${(props) => props.theme?.utils?.decreaseFontSize(5)};\r\n margin-top: 2px;\r\n }\r\n }\r\n }\r\n\r\n .back-button-container {\r\n width: 60px;\r\n height: 60px;\r\n border-right: 1px solid\r\n ${(props) => props.theme?.colors?.essential?.white};\r\n text-align: center;\r\n button {\r\n appearance: none;\r\n background: none;\r\n border: 0 none;\r\n color: ${(props) => props.theme?.colors?.essential?.white};\r\n padding: 6px 10px 0;\r\n transition: all 250ms linear;\r\n\r\n svg {\r\n margin-bottom: 4px;\r\n }\r\n\r\n &:hover {\r\n transform: scale(1.1);\r\n }\r\n\r\n .close-button-label {\r\n display: block;\r\n font-size: ${(props) => props.theme?.utils?.decreaseFontSize(5)};\r\n margin-top: 2px;\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n ClickSheild,\r\n DrawerContainter,\r\n DrawerHeader,\r\n};\r\n","export default __webpack_public_path__ + \"static/media/cancel.73289a65.svg\";","export default __webpack_public_path__ + \"static/media/back.9a4ef588.svg\";","import { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { X, ChevronLeft } from \"react-bootstrap-icons\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../state-management/root-reducer\";\r\nimport ADMIN_PANEL from \"../admin/AdminPanel.component\";\r\nimport OUTAGE_FORM from \"../form/submit-outage/OutageForm.component\";\r\nimport OUTAGE_SEARCH from \"../form/outage-search/OutageSearch.component\";\r\nimport { closeDrawer, openDrawer } from \"./Drawer.animations\";\r\nimport DrawerStyles from \"./Drawer.styles\";\r\nimport { DefaultDrawerProps, IDrawerProps } from \"./Drawer.types\";\r\nimport {\r\n clearSearchedOutages,\r\n ISubmittedOutage,\r\n} from \"../../state-management/slices/outages/outages.slice\";\r\nimport { IGTMEventFunction } from \"../../shared/types/logging.types\";\r\nimport { ESearchWizardSteps } from \"../../shared/enums/search.enums\";\r\nimport { AppDispatch } from \"../../state-management/store\";\r\nimport {\r\n clearSearchTerm,\r\n IAdminModeState,\r\n IAuthState,\r\n ISearchModeState,\r\n updateSearchView,\r\n} from \"../../state-management/slices/global/global.slice\";\r\nimport { ClickEvent } from \"../../shared/types/event.types\";\r\nimport CancelIcon from \"../../theme/assets/drawer-controls/cancel.svg\";\r\nimport BackIcon from \"../../theme/assets/drawer-controls/back.svg\";\r\n\r\nconst renderTitleContainer = (\r\n submittedOutage: ISubmittedOutage,\r\n searchMode: ISearchModeState,\r\n adminMode: IAdminModeState,\r\n auth: IAuthState\r\n) => {\r\n let title = \"\";\r\n let titleClassName = \"\";\r\n if (searchMode.enabled) {\r\n title = \"Check Outage Status\";\r\n if (searchMode.activeView === ESearchWizardSteps.RESULTS) {\r\n titleClassName = \"search-mode\";\r\n }\r\n } else if (auth.loggedIn && adminMode.enabled) {\r\n title = \"Admin Panel\";\r\n } else {\r\n title = submittedOutage.isSubmitted\r\n ? \"Report Complete\"\r\n : \"Report an Outage\";\r\n }\r\n\r\n return (\r\n
    \r\n

    {title}

    \r\n
    \r\n );\r\n};\r\n\r\nconst renderCloseButtonContainer = (\r\n submittedOutage: ISubmittedOutage,\r\n auth: IAuthState,\r\n sendDataToGTM: IGTMEventFunction,\r\n onClose: (event: ClickEvent) => void\r\n) => {\r\n return (\r\n
    \r\n {\r\n const eventLabel = submittedOutage.isSubmitted\r\n ? \"Close button clicked from submit confirmation screen\"\r\n : \"Cancel button clicked from outage form\";\r\n\r\n sendDataToGTM({\r\n event: \"eventTracking\",\r\n category: \"Outage\",\r\n action: \"Street Light\",\r\n label: eventLabel,\r\n });\r\n\r\n onClose(event);\r\n }}\r\n >\r\n \"Cancel\"\r\n \r\n {submittedOutage.isSubmitted || auth.loggedIn ? \"CLOSE\" : \"CANCEL\"}\r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nconst renderBackButtonContainer = (dispatch: AppDispatch) => {\r\n return (\r\n
    \r\n {\r\n event.preventDefault();\r\n dispatch(updateSearchView(ESearchWizardSteps.SEARCH));\r\n dispatch(clearSearchTerm());\r\n dispatch(clearSearchedOutages());\r\n }}\r\n >\r\n \"Cancel\"\r\n BACK\r\n \r\n
    \r\n );\r\n};\r\n\r\nconst renderDrawer = (\r\n searchMode: ISearchModeState,\r\n adminMode: IAdminModeState,\r\n auth: IAuthState,\r\n onClose: {\r\n (event: ClickEvent): void;\r\n (event: ClickEvent): void;\r\n (event: ClickEvent): void;\r\n }\r\n) => {\r\n if (searchMode.enabled) {\r\n return (\r\n \r\n );\r\n } else if (auth.loggedIn && adminMode.enabled) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n};\r\n\r\nconst DRAWER: React.FC = (props: IDrawerProps) => {\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n const { isDrawerOpen, isMobile, onClose } = props;\r\n\r\n const clickShieldClassname = `click-shield ${\r\n isDrawerOpen ? \"open\" : \"closed\"\r\n }`;\r\n const drawerContainerClassname = `drawer-container ${\r\n isMobile ? \"mobile\" : null\r\n }`;\r\n\r\n // App State\r\n const { submittedOutage } = useSelector((state: RootState) => state.outages);\r\n const { auth } = useSelector((state: RootState) => state.globalState);\r\n const { searchMode, adminMode, pinMode } = useSelector(\r\n (state: RootState) => state.globalState.ui\r\n );\r\n\r\n // Local State\r\n const [localDrawerState, setLocalDrawerState] = useState(false);\r\n\r\n useEffect(() => {\r\n if (isDrawerOpen !== localDrawerState) {\r\n setLocalDrawerState(isDrawerOpen);\r\n if (isDrawerOpen) {\r\n openDrawer(isMobile);\r\n } else {\r\n closeDrawer(isMobile, dispatch, submittedOutage, searchMode, adminMode);\r\n }\r\n }\r\n }, [\r\n adminMode,\r\n dispatch,\r\n isDrawerOpen,\r\n isMobile,\r\n localDrawerState,\r\n searchMode,\r\n submittedOutage,\r\n ]);\r\n\r\n return (\r\n <>\r\n {!isMobile && (\r\n onClose(event)}\r\n />\r\n )}\r\n\r\n \r\n \r\n {searchMode.enabled &&\r\n searchMode.activeView !== ESearchWizardSteps.SEARCH &&\r\n renderBackButtonContainer(dispatch)}\r\n {renderTitleContainer(submittedOutage, searchMode, adminMode, auth)}\r\n {renderCloseButtonContainer(\r\n submittedOutage,\r\n auth,\r\n sendDataToGTM,\r\n onClose\r\n )}\r\n \r\n\r\n {renderDrawer(searchMode, adminMode, auth, onClose)}\r\n \r\n \r\n );\r\n};\r\n\r\nDRAWER.defaultProps = DefaultDrawerProps;\r\n\r\nexport default DRAWER;\r\n","import { ClickEvent } from \"../../shared/types/event.types\";\r\nimport { ITestableComponentProps } from \"../../shared/types/testing.types\";\r\n\r\nexport interface IDrawerProps extends ITestableComponentProps {\r\n isDrawerOpen: boolean;\r\n isMobile: boolean;\r\n onClose: (event: ClickEvent) => void;\r\n}\r\n\r\nexport const DefaultDrawerProps = {\r\n isDrawerOpen: false,\r\n isMobile: false,\r\n};\r\n","import { ModalDialogProps } from \"react-bootstrap\";\r\nimport { ClickEvent } from \"../../shared/types/event.types\";\r\n\r\nexport interface IModalProps extends ModalDialogProps {\r\n show: boolean;\r\n handleClose: () => void;\r\n}\r\n\r\nexport const DefaultModalProps = {\r\n show: false,\r\n centered: true,\r\n};\r\n","import styled from \"@emotion/styled\";\r\nimport { Modal } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst LocationModal = styled(Modal)`\r\n .location-modal {\r\n width: 375px;\r\n .modal-body {\r\n padding-top: 0;\r\n }\r\n .modal-footer {\r\n border-top: none;\r\n }\r\n }\r\n`;\r\n\r\nconst NotFoundModal = styled(Modal)`\r\n .not-found-modal {\r\n width: 375px;\r\n .modal-body {\r\n padding-top: 0;\r\n text-align: center;\r\n }\r\n .modal-footer {\r\n border-top: none;\r\n justify-content: center;\r\n }\r\n }\r\n`;\r\n\r\nconst OutageReconciliationModal = styled(Modal)`\r\n .outage-reconciliation-modal {\r\n .modal-content {\r\n min-height: 450px;\r\n\r\n .label-column {\r\n padding: 0;\r\n padding-right: 0.25rem;\r\n font-family: ${(props) => props.theme.fontFamilies.semiBold};\r\n }\r\n .value-column {\r\n padding-left: 0;\r\n }\r\n\r\n .modal-header {\r\n .label-column {\r\n flex: 0.25;\r\n }\r\n }\r\n\r\n .modal-body {\r\n .nav-link {\r\n &:hover {\r\n &.active {\r\n cursor: default;\r\n }\r\n\r\n &:not(.active) {\r\n cursor: pointer;\r\n }\r\n }\r\n }\r\n\r\n .contact-info-container {\r\n margin-bottom: 24px;\r\n margin-left: 18px;\r\n .label-column {\r\n flex: 0.15;\r\n }\r\n }\r\n .tab-nav {\r\n margin-left: 18px;\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst PinModeModal = styled(Modal)`\r\n .pin-mode-modal {\r\n width: 375px;\r\n position: absolute;\r\n top: 10px;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 10040;\r\n overflow: auto;\r\n overflow-y: auto;\r\n .modal-body {\r\n padding-top: 0;\r\n }\r\n .modal-footer {\r\n border-top: none;\r\n button {\r\n width: 100%;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst LocationModalHeader = styled(Modal.Header)`\r\n &.location-modal-header {\r\n border-bottom: none;\r\n .modal-title {\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n font-size: ${(props) => props.theme.utils.increaseFontSize(6)};\r\n }\r\n }\r\n`;\r\n\r\nconst NotFoundModalHeader = styled(Modal.Header)`\r\n &.not-found-modal-header {\r\n border-bottom: none;\r\n margin-bottom: 18px;\r\n .icon-container {\r\n background-color: ${(props) => props.theme.colors.alerts.secondary};\r\n border-radius: 50%;\r\n width: 80px;\r\n height: 80px;\r\n margin: 12px auto;\r\n img {\r\n width: 65px;\r\n height: 65px;\r\n margin: 8px;\r\n }\r\n }\r\n\r\n .modal-title {\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n font-size: ${(props) => props.theme.utils.increaseFontSize(6)};\r\n text-align: center;\r\n }\r\n }\r\n`;\r\n\r\nconst PinModeModalHeader = styled(Modal.Header)`\r\n &.pin-mode-modal-header {\r\n border-bottom: none;\r\n .modal-title {\r\n font-family: ${(props) => props.theme?.fontFamilies?.semiBold};\r\n font-size: ${(props) => props.theme.utils.increaseFontSize(6)};\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n LocationModal,\r\n PinModeModal,\r\n NotFoundModal,\r\n NotFoundModalHeader,\r\n LocationModalHeader,\r\n OutageReconciliationModal,\r\n PinModeModalHeader,\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Modal } from \"react-bootstrap\";\r\nimport BUTTON from \"../button/Button.component\";\r\nimport { DefaultModalProps, IModalProps } from \"./Modal.types\";\r\nimport ModalStyles from \"./Modal.styles\";\r\nimport PinModeIcon from \"../../theme/assets/map-controls/add_light_new.svg\";\r\nimport PlusIcon from \"../../theme/assets/map-controls/plus.svg\";\r\nimport StreetlightIcon from \"../../theme/assets/map-markers/dot_streetlight.svg\";\r\nimport MapStyles from \"../map/Map.styles\";\r\n\r\nconst PIN_MODE_MODAL: React.FC = (props: IModalProps) => {\r\n const [show, setShow] = useState(false);\r\n const { handleClose, centered } = props;\r\n\r\n useEffect(() => {\r\n setShow(props.show);\r\n }, [props.show]);\r\n\r\n return (\r\n \r\n \r\n Reporting A Streetlight Issue\r\n \r\n \r\n

    \r\n To report a streetlight issue, find and select a streetlight on the\r\n map{\" \"}\r\n \"Pin\r\n

    \r\n

    \r\n If the streetlight is missing from the map, click the "Add\r\n Streetlight" button{\" \"}\r\n \r\n \r\n \"Pin\r\n \"Pin\r\n \r\n \r\n {\" \"} to drop a new marker on the map and report it!\r\n

    \r\n
    \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nPIN_MODE_MODAL.defaultProps = DefaultModalProps;\r\nexport default PIN_MODE_MODAL;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Modal, Image } from \"react-bootstrap\";\r\nimport BUTTON from \"../button/Button.component\";\r\nimport { DefaultModalProps, IModalProps } from \"./Modal.types\";\r\nimport ModalStyles from \"./Modal.styles\";\r\nimport ExclamationIcon from \"../../theme/assets/exclamation.svg\";\r\n\r\nconst OUTAGE_NOT_FOUND_MODAL: React.FC = (props: IModalProps) => {\r\n const [show, setShow] = useState(false);\r\n const { handleClose, centered } = props;\r\n\r\n useEffect(() => {\r\n setShow(props.show);\r\n }, [props.show]);\r\n\r\n return (\r\n \r\n \r\n
    \r\n \r\n OOPS!\r\n
    \r\n
    \r\n Outage not found.\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nOUTAGE_NOT_FOUND_MODAL.defaultProps = DefaultModalProps;\r\nexport default OUTAGE_NOT_FOUND_MODAL;\r\n","import styled from \"@emotion/styled\";\r\nimport { Modal, Tab } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../../theme/theme.types\";\r\n\r\nconst AdminModalPane = styled(Tab.Pane)`\r\n &.admin-modal-pane {\r\n .form-container {\r\n padding-top: 20px;\r\n .form-label {\r\n &.radio-heading {\r\n margin-bottom: 12px;\r\n }\r\n span {\r\n padding-left: 12px;\r\n &:hover {\r\n cursor: pointer;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n AdminModalPane,\r\n};\r\n","import styled from \"@emotion/styled\";\r\nimport { Button, ButtonProps } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst GENERIC_BUTTON_STYLES = `\r\n border-radius: 0;\r\n font-family: Open Sans Semi Bold;\r\n padding: 12px 20px;\r\n text-align: center;\r\n\r\n &.block {\r\n width: 100%;\r\n }\r\n\r\n &:hover {\r\n cursor: pointer;\r\n }\r\n`;\r\n\r\nconst BlueSecondaryButton = styled(Button)`\r\n &.blue-secondary-button {\r\n ${GENERIC_BUTTON_STYLES}\r\n background-color: ${(props) =>\r\n props.theme.colors.essential.white}!important;\r\n color: ${(props) => props.theme.colors.brand.primary};\r\n border-color: ${(props) => props.theme.colors.brand.primary};\r\n\r\n &:hover {\r\n color: ${(props) => props.theme.colors.brand.secondary}!important;\r\n border-color: ${(props) => props.theme.colors.brand.secondary}!important;\r\n }\r\n }\r\n`;\r\n\r\nconst RedPrimaryButton = styled(Button)`\r\n &.red-primary-button {\r\n ${GENERIC_BUTTON_STYLES}\r\n background-color: #fae7e7 !important;\r\n color: ${(props) => props.theme.colors.alerts.primary};\r\n border-color: ${(props) => props.theme.colors.alerts.primary};\r\n\r\n &:hover {\r\n background-color: ${(props) =>\r\n props.theme.colors.alerts.primary} !important;\r\n color: ${(props) => props.theme.colors.essential.white} !important;\r\n border-color: ${(props) => props.theme.colors.alerts.primary} !important;\r\n }\r\n }\r\n`;\r\n\r\nexport default {\r\n BlueSecondaryButton,\r\n RedPrimaryButton,\r\n};\r\n","import React from \"react\";\r\nimport { Col, Container, Form, Row } from \"react-bootstrap\";\r\nimport { IContentPaneProps } from \"./OutageReconciliation.types\";\r\nimport SharedButtonStyles from \"../../../shared/styled-components/buttons\";\r\nimport BUTTON from \"../../button/Button.component\";\r\nimport FormStyles from \"../../form/Form.styles\";\r\nimport { Formik, FormikHelpers } from \"formik\";\r\nimport FormUtils from \"../../form/Form.utils\";\r\nimport FormConstants from \"../../form/Form.constants\";\r\nimport { IAcceptOutageValues } from \"../../form/Form.types\";\r\nimport { updateAdminOutage } from \"../../../state-management/slices/outages/outages.thunk\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { BaseMapService } from \"../../map/BaseMap.service\";\r\nimport { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport { FeatureLayerService } from \"../../map/FeatureLayer.service\";\r\nimport MapUtils from \"../../map/Map.utils\";\r\n\r\nconst ACCEPT_PANE: React.FC = (props: IContentPaneProps) => {\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n\r\n const { handleClose, selectedOutage } = props;\r\n\r\n // Services\r\n const baseMapService: BaseMapService = BaseMapService.getInstance(\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n const featureLayerService: FeatureLayerService =\r\n baseMapService.getFeatureLayerService();\r\n\r\n return (\r\n \r\n \r\n ) => {\r\n let gisFeature: any;\r\n\r\n if (values.acceptOutageFormGISID) {\r\n gisFeature = await featureLayerService.getFeatureById(\r\n values.acceptOutageFormGISID\r\n );\r\n }\r\n\r\n if (selectedOutage && gisFeature) {\r\n dispatch(\r\n updateAdminOutage(\r\n selectedOutage,\r\n baseMapService,\r\n sendDataToGTM,\r\n gisFeature,\r\n values.acceptOutageFormGISID\r\n )\r\n );\r\n } else {\r\n console.log(\"There was a problem accepting outage:\", {\r\n selectedOutage,\r\n \"GIS Feature\": gisFeature,\r\n });\r\n }\r\n }}\r\n >\r\n {({\r\n handleSubmit,\r\n handleChange,\r\n handleBlur,\r\n values,\r\n touched,\r\n isValid,\r\n errors,\r\n resetForm,\r\n }) => (\r\n
    \r\n \r\n \r\n Enter GISID\r\n \r\n \r\n \r\n {errors?.acceptOutageFormGISID}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Cancel\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ACCEPT_PANE;\r\n","import React, { useState } from \"react\";\r\nimport { Col, Container, Form, Row } from \"react-bootstrap\";\r\nimport { IContentPaneProps } from \"./OutageReconciliation.types\";\r\nimport SharedButtonStyles from \"../../../shared/styled-components/buttons\";\r\nimport FormStyles from \"../../form/Form.styles\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../../state-management/root-reducer\";\r\nimport { updateAdminOutage } from \"../../../state-management/slices/outages/outages.thunk\";\r\nimport { ECompletedReasons } from \"../../../shared/enums/outage.enums\";\r\nimport { BaseMapService } from \"../../map/BaseMap.service\";\r\nimport { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\n\r\nconst REJECT_PANE: React.FC = (props: IContentPaneProps) => {\r\n const dispatch = useDispatch();\r\n const sendDataToGTM = useGTMDispatch();\r\n const { handleClose, selectedOutage } = props;\r\n\r\n // Local State\r\n const [radioGroupValue, setRadioGroupValue] = useState(\r\n ECompletedReasons.NON_CE\r\n );\r\n\r\n // Services\r\n const baseMapService: BaseMapService = BaseMapService.getInstance(\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n\r\n return (\r\n \r\n {\r\n event.preventDefault();\r\n if (selectedOutage?.outageId) {\r\n dispatch(\r\n updateAdminOutage(\r\n selectedOutage,\r\n baseMapService,\r\n sendDataToGTM,\r\n undefined,\r\n undefined,\r\n radioGroupValue\r\n )\r\n );\r\n }\r\n }}\r\n >\r\n \r\n Select a rejection reason\r\n \r\n \r\n \r\n {\r\n const { value } = event.target;\r\n setRadioGroupValue(value as ECompletedReasons);\r\n }}\r\n />\r\n Non CE Streetlight\r\n \r\n \r\n {\r\n const { value } = event.target;\r\n setRadioGroupValue(value as ECompletedReasons);\r\n }}\r\n />\r\n Streetlight Does Not Exist\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Cancel\r\n \r\n \r\n \r\n \r\n Reject\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default REJECT_PANE;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Modal, Nav, Tab, Container, Row, Col } from \"react-bootstrap\";\r\nimport { DefaultModalProps, IModalProps } from \"../Modal.types\";\r\nimport ModalStyles from \"../Modal.styles\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../../state-management/root-reducer\";\r\nimport OutageReconciliationStyles from \"./OutageReconciliation.styles\";\r\nimport ACCEPT_PANE from \"./AcceptPane.component\";\r\nimport REJECT_PANE from \"./RejectPane.component\";\r\nimport { ApiService } from \"../../../api/api.service\";\r\n\r\nconst OUTAGE_RECONCILIATION_MODAL: React.FC = (\r\n props: IModalProps\r\n) => {\r\n // App State\r\n const { adminMode } = useSelector((state: RootState) => state.globalState.ui);\r\n\r\n // Local State\r\n const [show, setShow] = useState(false);\r\n\r\n // Services\r\n const apiService: ApiService = ApiService.getInstance();\r\n\r\n const { handleClose, centered, size } = props;\r\n const { selectedOutage } = adminMode;\r\n const contact =\r\n selectedOutage && selectedOutage.contacts\r\n ? selectedOutage?.contacts[0]\r\n : {\r\n name: \"\",\r\n email: \"\",\r\n mobilePhone: \"\",\r\n };\r\n\r\n const { name, email, mobilePhone } = contact;\r\n\r\n useEffect(() => {\r\n setShow(props.show);\r\n }, [props.show]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Outage Id:\r\n \r\n \r\n {selectedOutage?.outageId}\r\n \r\n \r\n \r\n \r\n Address:\r\n \r\n {`${selectedOutage?.location?.address}, ${selectedOutage?.location?.city}, MI`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Name:\r\n {name}\r\n \r\n \r\n Email:\r\n \r\n \r\n {email}\r\n \r\n \r\n \r\n \r\n Phone:\r\n \r\n {mobilePhone}\r\n \r\n \r\n \r\n Comments:\r\n {selectedOutage?.comments}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nOUTAGE_RECONCILIATION_MODAL.defaultProps = DefaultModalProps;\r\nexport default OUTAGE_RECONCILIATION_MODAL;\r\n","import LocalStorage from \"./LocalStorage\";\r\n\r\nenum EMessages {\r\n PIN_MODE_ACCEPTED = \"pin_mode_accepted\",\r\n}\r\n\r\nexport default class UIMessages extends LocalStorage {\r\n private static instance?: UIMessages;\r\n\r\n private constructor() {\r\n super();\r\n }\r\n\r\n public static getInstance(): UIMessages {\r\n if (!this.instance) {\r\n this.instance = new UIMessages();\r\n }\r\n\r\n return this.instance;\r\n }\r\n\r\n public getPinModeAccepted(): string | null {\r\n // @todo:\r\n // returns string... consider JSON.parse to boolean\r\n return this.get(EMessages.PIN_MODE_ACCEPTED);\r\n }\r\n\r\n public setPinModeAccepted(pinModeAccepted: string): void {\r\n this.set(EMessages.PIN_MODE_ACCEPTED, pinModeAccepted);\r\n }\r\n\r\n public clear(): void {\r\n this.clearItems([EMessages.PIN_MODE_ACCEPTED]);\r\n }\r\n}\r\n","import { IStorage } from \"./localStorage.types\";\r\n\r\nexport default abstract class LocalStorage {\r\n private readonly storage: IStorage;\r\n\r\n public constructor(getStorage = (): IStorage => window.localStorage) {\r\n this.storage = getStorage();\r\n }\r\n\r\n protected get(key: T): string | null {\r\n return this.storage.getItem(key);\r\n }\r\n\r\n protected set(key: T, value: string): void {\r\n this.storage.setItem(key, value);\r\n }\r\n\r\n protected clearItem(key: T): void {\r\n this.storage.removeItem(key);\r\n }\r\n\r\n protected clearItems(keys: T[]): void {\r\n keys.forEach((key) => this.clearItem(key));\r\n }\r\n}\r\n","/* eslint-disable node/no-unsupported-features/node-builtins */\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport BASE_LAYOUT from \"../components/layout/BaseLayout.component\";\r\nimport { ViewContainer } from \"./View.styles\";\r\nimport { RootState } from \"../state-management/root-reducer\";\r\nimport BASE_MAP from \"../components/map/BaseMap.component\";\r\nimport { IViewProps } from \"./View.types\";\r\nimport DRAWER from \"../components/drawer/Drawer.component\";\r\nimport AppMedia from \"../theme/utils/AppMedia\";\r\nimport {\r\n clearSelectedMarker,\r\n updateAdminModeState,\r\n setLoggedIn,\r\n setOutageNotFound,\r\n updatePinModeState,\r\n setRoutingOutageId,\r\n updateDrawerState,\r\n setShowAdminModal,\r\n setOriginatorFlag,\r\n setPinBracketType,\r\n setEntraAuthstate,\r\n} from \"../state-management/slices/global/global.slice\";\r\nimport { AppDispatch } from \"../state-management/store\";\r\nimport { BaseMapService } from \"../components/map/BaseMap.service\";\r\nimport {\r\n clearImageData,\r\n clearOutageError,\r\n} from \"../state-management/slices/outages/outages.slice\";\r\nimport { useGTMDispatch } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport PIN_MODE_MODAL from \"../components/modal/PinMode.modal\";\r\nimport { getGlobalState } from \"../shared/utils/testing.utils\";\r\nimport { ClickEvent } from \"../shared/types/event.types\";\r\nimport useQuery from \"../shared/hooks/useQuery\";\r\nimport OUTAGE_NOT_FOUND_MODAL from \"../components/modal/OutageNotFound.modal\";\r\nimport OUTAGE_RECONCILIATION_MODAL from \"../components/modal/outage-reconciliation/OutageReconciliation.modal\";\r\nimport UIMessages from \"../state-management/localStorage/UIMessages\";\r\nimport { fetchAdminOutages } from \"../state-management/slices/outages/outages.thunk\";\r\nimport { FormService } from \"../components/form/Form.service\";\r\nimport { AuthSericeEntra } from \"../shared/services/Auth.service.entra\";\r\nimport { useIsAuthenticated, useMsal } from \"@azure/msal-react\";\r\n\r\nconst onDrawerCloseClick = (\r\n event: ClickEvent,\r\n dispatch: AppDispatch,\r\n baseMapService: BaseMapService,\r\n formService: FormService\r\n) => {\r\n event.preventDefault();\r\n const mapView = baseMapService.getMapView();\r\n const featureLayerService = baseMapService.getFeatureLayerService();\r\n const uiState = getGlobalState().ui;\r\n\r\n formService.resetForm();\r\n\r\n dispatch(updateDrawerState(false));\r\n dispatch(\r\n setPinBracketType({\r\n bracketType: null,\r\n })\r\n );\r\n dispatch(clearOutageError());\r\n dispatch(clearSelectedMarker());\r\n dispatch(clearImageData());\r\n\r\n if (uiState.pinMode.enabled) {\r\n featureLayerService.removePinModeGraphics();\r\n featureLayerService.fadeOverlay(\"off\");\r\n dispatch(updatePinModeState(false));\r\n } else {\r\n baseMapService.removeMapViewGraphics();\r\n }\r\n\r\n mapView.popup.close();\r\n baseMapService.processExtent();\r\n};\r\n\r\nconst setLocalStorage = () => {\r\n const messages = UIMessages.getInstance();\r\n messages.setPinModeAccepted(\"true\");\r\n};\r\n\r\nconst MAP_VIEW: React.FC = (props: IViewProps) => {\r\n const { Media } = AppMedia;\r\n const dispatch = useDispatch();\r\n const query = useQuery();\r\n const sendDataToGTM = useGTMDispatch();\r\n const { instance, accounts } = useMsal();\r\n\r\n const messagesLocalStorage = UIMessages.getInstance();\r\n\r\n // Services\r\n const authServiceEntra = AuthSericeEntra.getInstance(dispatch, instance);\r\n const baseMapService = BaseMapService.getInstance(dispatch, sendDataToGTM);\r\n const formService: FormService = FormService.getInstance(\r\n dispatch,\r\n sendDataToGTM\r\n );\r\n\r\n // Local State\r\n const [showPinModeModal, setShowPinModeModal] = useState(false);\r\n const [pinModeAccepted, setPinModeAccepted] = useState(false);\r\n const [tokenParsed, setTokenParsed] = useState(false);\r\n\r\n // App State\r\n const { ui, auth, appConfig } = useSelector(\r\n (state: RootState) => state.globalState\r\n );\r\n const { isDrawerOpen, routing, loading, adminMode } = ui;\r\n const { outageNotFound } = routing;\r\n const isAuthenticated = useIsAuthenticated();\r\n\r\n // Query Params\r\n const adminModeQuery = query.get(\"admin_mode\");\r\n const outageIdQuery = query.get(\"outageId\");\r\n const loggedInQuery = query.get(\"logged_in\");\r\n const originatorQuery = query.get(\"originator\");\r\n const originatorQueryUppercase = query.get(\"Originator\");\r\n const callbackCodeQuery = query.get(\"code\");\r\n const callbackStateQuery = query.get(\"state\");\r\n\r\n useEffect(() => {\r\n if (adminModeQuery && JSON.parse(adminModeQuery) && appConfig) {\r\n authServiceEntra.signin(appConfig);\r\n }\r\n\r\n const { outageId } = routing;\r\n const pinModeAcceptedState = JSON.parse(\r\n messagesLocalStorage.getPinModeAccepted() as string\r\n );\r\n\r\n if (originatorQuery || originatorQueryUppercase) {\r\n if (originatorQuery) dispatch(setOriginatorFlag(originatorQuery));\r\n if (originatorQueryUppercase)\r\n dispatch(setOriginatorFlag(originatorQueryUppercase));\r\n }\r\n\r\n if (pinModeAcceptedState !== pinModeAccepted) {\r\n setPinModeAccepted(pinModeAcceptedState);\r\n }\r\n\r\n if (outageIdQuery) {\r\n if (!outageId || outageIdQuery !== outageId) {\r\n dispatch(setRoutingOutageId(outageIdQuery));\r\n }\r\n } else {\r\n setShowPinModeModal(true);\r\n }\r\n\r\n if (loggedInQuery && !auth.loggedIn) {\r\n if (JSON.parse(loggedInQuery)) {\r\n if (callbackCodeQuery && callbackStateQuery && !tokenParsed) {\r\n setTokenParsed(true);\r\n }\r\n } else {\r\n dispatch(setLoggedIn(false));\r\n dispatch(updateAdminModeState(false));\r\n }\r\n }\r\n console.log(isAuthenticated, !auth.loggedIn);\r\n if (isAuthenticated && !auth.loggedIn) {\r\n if (outageIdQuery) {\r\n return;\r\n }\r\n const accessTokenRequest = {\r\n scopes: [`api://${appConfig?.azureClientId}/${appConfig?.azureScope}`],\r\n account: accounts[0],\r\n };\r\n instance\r\n .acquireTokenSilent(accessTokenRequest)\r\n .then((accessToken) => {\r\n const roles: string[] = JSON.parse(\r\n JSON.stringify(accessToken.idTokenClaims)\r\n )?.roles;\r\n if (\r\n roles &&\r\n roles.findIndex((r) => r.indexOf(\"SoarAdmin\") >= 0) >= 0\r\n ) {\r\n dispatch(setEntraAuthstate(accessToken));\r\n dispatch(fetchAdminOutages());\r\n dispatch(updateAdminModeState(true));\r\n dispatch(updateDrawerState(true));\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(\"Access Token Error:\", error);\r\n });\r\n\r\n dispatch(setLoggedIn(true));\r\n }\r\n }, [\r\n adminModeQuery,\r\n auth.loggedIn,\r\n isAuthenticated,\r\n authServiceEntra,\r\n callbackCodeQuery,\r\n callbackStateQuery,\r\n instance,\r\n appConfig,\r\n accounts,\r\n dispatch,\r\n loggedInQuery,\r\n messagesLocalStorage,\r\n originatorQuery,\r\n originatorQueryUppercase,\r\n outageIdQuery,\r\n pinModeAccepted,\r\n routing,\r\n tokenParsed,\r\n ]);\r\n\r\n return (\r\n <>\r\n {/* --------------------------------- */}\r\n {/* OUTAGE NOT FOUND MODAL ---------- */}\r\n {/* --------------------------------- */}\r\n {\r\n dispatch(setOutageNotFound(false));\r\n setShowPinModeModal(true);\r\n }}\r\n />\r\n\r\n {/* --------------------------------- */}\r\n {/* PIN MODE MODAL ------------------ */}\r\n {/* --------------------------------- */}\r\n {\r\n setLocalStorage();\r\n setShowPinModeModal(false);\r\n }}\r\n />\r\n\r\n {/* --------------------------------- */}\r\n {/* ADMIN MODE MODAL ------------------ */}\r\n {/* --------------------------------- */}\r\n {\r\n dispatch(setShowAdminModal({ show: false }));\r\n }}\r\n />\r\n\r\n {/* --------------------------------- */}\r\n {/* DRAWER (MOBILE) ----------------- */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n onDrawerCloseClick(event, dispatch, baseMapService, formService)\r\n }\r\n />\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* DRAWER (DESKTOP) ---------------- */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n onDrawerCloseClick(event, dispatch, baseMapService, formService)\r\n }\r\n />\r\n \r\n\r\n {/* --------------------------------- */}\r\n {/* BASE MAP ------------------------ */}\r\n {/* --------------------------------- */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default MAP_VIEW;\r\n","/* eslint-disable node/no-unsupported-features/node-builtins */\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nexport default function useQuery(): URLSearchParams {\r\n // eslint-disable-next-line compat/compat\r\n return new URLSearchParams(useLocation().search);\r\n}\r\n","import styled from \"@emotion/styled\";\r\nimport { Col } from \"react-bootstrap\";\r\nimport { IStyledComponentProps } from \"../../theme/theme.types\";\r\n\r\nconst DashboadContainer = styled.div`\r\n &.dashboard-container {\r\n .dashboard-card {\r\n height: 600px;\r\n overflow-y: scroll;\r\n }\r\n }\r\n`;\r\n\r\nconst ResultsContainer = styled.div`\r\n &.results-container {\r\n margin-top: 32px;\r\n }\r\n`;\r\n\r\nexport default { DashboadContainer, ResultsContainer };\r\n","import axios, { AxiosError } from \"axios\";\r\nimport { LOCATOR_URL } from \"../map/Map.constants\";\r\nimport { IMapPoint } from \"../map/Map.types\";\r\n\r\nexport interface IAddressLookupResponse {\r\n streetAddressResponse: any;\r\n pointAddressResponse: any;\r\n xStreetResponse: any;\r\n poiResponse: any;\r\n}\r\n\r\nconst fetchAddressData = async (\r\n mapPoint: IMapPoint\r\n): Promise => {\r\n let response = null;\r\n\r\n try {\r\n response = await axios\r\n .all([\r\n axios.get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: mapPoint,\r\n featureTypes: \"StreetAddress\",\r\n f: \"json\",\r\n },\r\n }),\r\n axios.get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: mapPoint,\r\n featureTypes: \"PointAddress\",\r\n f: \"json\",\r\n },\r\n }),\r\n axios.get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: mapPoint,\r\n featureTypes: \"StreetInt\",\r\n f: \"json\",\r\n },\r\n }),\r\n axios.get(`${LOCATOR_URL}/reverseGeocode`, {\r\n params: {\r\n location: mapPoint,\r\n featureTypes: \"POI\",\r\n f: \"json\",\r\n },\r\n }),\r\n ])\r\n .then(\r\n axios.spread(\r\n (\r\n streetAddressResponse,\r\n pointAddressResponse,\r\n xStreetResponse,\r\n poiResponse\r\n ) => {\r\n return {\r\n streetAddressResponse,\r\n pointAddressResponse,\r\n xStreetResponse,\r\n poiResponse,\r\n };\r\n }\r\n )\r\n )\r\n .catch((errors: any) => {\r\n return errors;\r\n });\r\n } catch (error: any) {\r\n return error;\r\n }\r\n\r\n return response;\r\n};\r\n\r\nexport default { fetchAddressData };\r\n","import Point from \"@arcgis/core/geometry/Point\";\r\nimport Geometry from \"@arcgis/core/geometry/Geometry\";\r\nimport axios from \"axios\";\r\nimport React, { useState } from \"react\";\r\nimport { Card, Col, Form, FormControlProps, Row } from \"react-bootstrap\";\r\nimport BUTTON from \"../button/Button.component\";\r\nimport { LOCATOR_URL } from \"../map/Map.constants\";\r\nimport { IMapPoint } from \"../map/Map.types\";\r\nimport MapUtils from \"../map/Map.utils\";\r\nimport DashboardStyles from \"./Dashboard.styles\";\r\nimport DashboardUtils, { IAddressLookupResponse } from \"./Dashboard.utils\";\r\nimport * as webMercatorUtils from \"@arcgis/core/geometry/support/webMercatorUtils\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nconst DASHBOARD: React.FC> = () => {\r\n const initialFormData = {\r\n latitude: \"\",\r\n longitude: \"\",\r\n };\r\n\r\n const initialGeoLocResults: any = {\r\n streetAddress: null,\r\n pointAddress: null,\r\n xStreets: null,\r\n poi: null,\r\n };\r\n\r\n const [formData, updateFormData] = useState(initialFormData);\r\n const [geoLocResults, setGeoLocResults] = useState(initialGeoLocResults);\r\n\r\n /**\r\n * handleChange\r\n * @param {React.ChangeEvent} event\r\n */\r\n const handleChange = (event: React.ChangeEvent) => {\r\n updateFormData({\r\n ...formData,\r\n // Trimming any whitespace\r\n [event.target.name]: event.target.value.trim(),\r\n });\r\n };\r\n\r\n /**\r\n * handleAddressLookup\r\n * @param {React.FormEvent} event\r\n */\r\n const handleAddressLookup = async (\r\n event: React.FormEvent\r\n ): Promise => {\r\n event.preventDefault();\r\n const lat = parseFloat(formData.latitude);\r\n const lng = parseFloat(formData.longitude);\r\n\r\n DashboardUtils.fetchAddressData(\r\n new Point({\r\n longitude: lng,\r\n latitude: lat,\r\n })\r\n )\r\n .then((results: IAddressLookupResponse) => {\r\n const {\r\n streetAddressResponse,\r\n pointAddressResponse,\r\n xStreetResponse,\r\n poiResponse,\r\n } = results;\r\n\r\n setGeoLocResults({\r\n streetAddress: streetAddressResponse.data,\r\n pointAddress: pointAddressResponse.data,\r\n xStreets: xStreetResponse.data,\r\n poi: poiResponse.data,\r\n });\r\n\r\n return Promise.resolve(results);\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n return Promise.reject(error);\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n

    Testing Dashboard

    \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n Address Lookup\r\n ) =>\r\n handleAddressLookup(event)\r\n }\r\n >\r\n \r\n Latitude\r\n ) => {\r\n handleChange(event);\r\n }}\r\n />\r\n \r\n \r\n Longitude\r\n ) => {\r\n handleChange(event);\r\n }}\r\n />\r\n \r\n \r\n \r\n\r\n \r\n {geoLocResults.streetAddress &&\r\n !geoLocResults.streetAddress.error && (\r\n \r\n

    Street Address Results:

    \r\n
      \r\n
    • \r\n Address: {geoLocResults.streetAddress.address.Address}\r\n
    • \r\n
    • \r\n Long Label:{\" \"}\r\n {geoLocResults.streetAddress.address.LongLabel}\r\n
    • \r\n
    • \r\n Short Label:{\" \"}\r\n {geoLocResults.streetAddress.address.ShortLabel}\r\n
    • \r\n
    • \r\n Match Address:{\" \"}\r\n {geoLocResults.streetAddress.address.Match_addr}\r\n
    • \r\n
    \r\n
    \r\n )}\r\n {geoLocResults.pointAddress &&\r\n !geoLocResults.pointAddress.error && (\r\n \r\n

    Point Address Results:

    \r\n
      \r\n
    • \r\n Address: {geoLocResults.pointAddress.address.Address}\r\n
    • \r\n
    • \r\n Long Label:{\" \"}\r\n {geoLocResults.pointAddress.address.LongLabel}\r\n
    • \r\n
    • \r\n Short Label:{\" \"}\r\n {geoLocResults.pointAddress.address.ShortLabel}\r\n
    • \r\n
    • \r\n Match Address:{\" \"}\r\n {geoLocResults.pointAddress.address.Match_addr}\r\n
    • \r\n
    \r\n
    \r\n )}\r\n {geoLocResults.xStreets && !geoLocResults.xStreets.error && (\r\n \r\n

    Cross Street Results:

    \r\n
      \r\n
    • Address: {geoLocResults.xStreets.address.Address}
    • \r\n
    • \r\n Long Label: {geoLocResults.xStreets.address.LongLabel}\r\n
    • \r\n
    • \r\n Short Label: {geoLocResults.xStreets.address.ShortLabel}\r\n
    • \r\n
    • \r\n Match Address:{\" \"}\r\n {geoLocResults.xStreets.address.Match_addr}\r\n
    • \r\n
    \r\n
    \r\n )}\r\n {geoLocResults.poi && !geoLocResults.poi.error && (\r\n \r\n

    Point of Interest Results:

    \r\n
      \r\n
    • Address: {geoLocResults.poi.address.Address}
    • \r\n
    • Long Label: {geoLocResults.poi.address.LongLabel}
    • \r\n
    • \r\n Short Label: {geoLocResults.poi.address.ShortLabel}\r\n
    • \r\n
    • \r\n Match Address: {geoLocResults.poi.address.Match_addr}\r\n
    • \r\n
    \r\n
    \r\n )}\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default DASHBOARD;\r\n","import React from \"react\";\r\nimport { Col, Container, Row } from \"react-bootstrap\";\r\nimport DASHBOARD from \"../components/dashboard/Dashboard.component\";\r\nimport BASE_LAYOUT from \"../components/layout/BaseLayout.component\";\r\nimport { ViewContainer } from \"./View.styles\";\r\nimport { IViewProps } from \"./View.types\";\r\n\r\nconst DASHBOARD_VIEW: React.FC = ({ pageTitle }) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nexport default DASHBOARD_VIEW;\r\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport {\r\n BrowserRouter as Router,\r\n Switch,\r\n Route,\r\n useHistory,\r\n} from \"react-router-dom\";\r\nimport MAP_VIEW from \"./views/Map.view\";\r\nimport DASHBOARD_VIEW from \"./views/Dashboard.view\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { RootState } from \"./state-management/root-reducer\";\r\nimport {\r\n fetchAppConfig,\r\n setLoading,\r\n} from \"./state-management/slices/global/global.slice\";\r\nimport { PublicClientApplication } from \"@azure/msal-browser\";\r\nimport { MsalProvider } from \"@azure/msal-react\";\r\n\r\nfunction App(): React.ReactElement | null {\r\n const dispatch = useDispatch();\r\n const history = useHistory();\r\n\r\n const pca = useRef(null);\r\n\r\n // App State\r\n const { appConfig, ui } = useSelector(\r\n (state: RootState) => state.globalState\r\n );\r\n\r\n const [appConfigLoaded, setappConfigLoaded] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!appConfig && !ui.loading) {\r\n dispatch(setLoading(true));\r\n dispatch(fetchAppConfig());\r\n }\r\n\r\n if (appConfig !== null) {\r\n const msalConfig: any = {\r\n auth: {\r\n tenantId: appConfig?.azureTenantId,\r\n clientId: appConfig?.azureClientId,\r\n authority: appConfig?.azureAuthority,\r\n redirectUri: appConfig?.azureRedirectUri,\r\n postLogoutRedirectUri: \"/\",\r\n navigateToLoginRequestUrl: false,\r\n },\r\n cache: {\r\n cacheLocation: \"sessionStorage\", // This configures where your cache will be stored\r\n storeAuthStateInCookie: false, // Set this to \"true\" if you are having issues on IE11 or Edge\r\n },\r\n system: {\r\n allowNativeBroker: false, // Disables native brokering support\r\n },\r\n };\r\n pca.current = new PublicClientApplication(msalConfig);\r\n\r\n pca.current\r\n .handleRedirectPromise()\r\n .then((s) => {\r\n // to handle redirection with custom config\r\n })\r\n .catch((a) => {\r\n // to handle redirection with custom config\r\n });\r\n\r\n setappConfigLoaded(true);\r\n }\r\n }, [appConfig, dispatch, ui.loading]);\r\n\r\n return (\r\n appConfig &&\r\n pca.current && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n );\r\n}\r\n\r\nexport default App;\r\n","export const LOCAL_BASE_API_URL = \"https://localhost:5001/api\";\r\nexport const LOCAL_BASE_URL = \"http://localhost:3000\";\r\nexport const DEV_BASE_URL = \"https://streetlightsdev.consumersengergy.com\";\r\nexport const CONFIG_BASE_URL = \"../../\";\r\nexport const LOCAL_SWAGGER = \"https://localhost:5001/swagger/1/swagger.json\";\r\n\r\nexport const LOOKUPS_ENDPOINT = \"/lookups\";\r\nexport const OUTAGES_ENDPOINT = \"/outages\";\r\nexport const SEARCH_OUTAGES_ENDPOINT = \"/outages/search\";\r\nexport const ADMIN_OUTAGES_ENDPOINT = \"/outages/admin\";\r\nexport const ADMIN_LOGIN_ENDPOINT = \"/?admin_mode=true\";\r\nexport const VERSION_ENDPOINT = \"/version\";\r\nexport const CONFIG_ENDPOINT = \"environment.config.json\";\r\n\r\n/**\r\n * NOTE: THIS IS ONLY USED FOR TESTING. appConfig VALUES ARE\r\n * RETRIEVED FROM slices/globalSlice ==> fetchAppConfig and intialized in\r\n * BaseMap.component.\r\n */\r\nexport const DEFAULT_APP_CONFIG = {\r\n env: \"dev\",\r\n apiUrl: \"https://streetlightsdev.consumersenergy.com/api\",\r\n apimSubscriptionKey: \"218694dea0fe4d198fb5cf8220399fc5\",\r\n esriStreetlightLayerId: \"StreetlightsOutage_PROD\",\r\n esriRestrictedLayerId: \"Electric_WHQs\",\r\n esriGrandRapidsLayerId: \"Grand Rapids Streetlights\",\r\n esriSaginawLayerId: \"Saginaw_Streetlights_06082022_Non_Prod\",\r\n esriFeatureLayerUrl:\r\n \"https://services.arcgis.com/T2graiaSQnlmwwmp/arcgis/rest/services/StreetlightsOutage_NON_PROD_View/FeatureServer/0\",\r\n esriGrandRapidsLayerUrl:\r\n \"https://services.arcgis.com/T2graiaSQnlmwwmp/arcgis/rest/services/Grand_Rapids_Streetlights_View/FeatureServer/0\",\r\n esriRestrictedFeatureLayerUrl:\r\n \"https://services.arcgis.com/T2graiaSQnlmwwmp/arcgis/rest/services/UNK_Electric_WHQs/FeatureServer/0\",\r\n esriSaginawLayerUrl:\r\n \"https://services.arcgis.com/T2graiaSQnlmwwmp/ArcGIS/rest/services/Saginaw_Streetlights_06082022_Non_Prod/FeatureServer/0\",\r\n oktaClientId: \"0oa2gwqrxmYlTX7yj5d7\",\r\n oktaIssuer: \"https://dev-35438015.okta.com/oauth2/default\",\r\n oktaRedirectUri: \"http://localhost:3000/?logged_in=true\",\r\n oktaScopes: \"openid, profile, email\",\r\n oktaPKCE: \"true\",\r\n};\r\n","import { IStandardError } from \"../../shared/types/error.types\";\r\n\r\nexport const GENERIC_ERROR_MESSAGE =\r\n \"We are experiencing technical difficulties. Please try again later.\";\r\n\r\nconst INTERNAL_SERVER_ERROR: IStandardError = {\r\n code: 500,\r\n message: \"Internal Server Error\",\r\n displayMessage: \"Internal Server Error.\",\r\n};\r\n\r\nexport default { INTERNAL_SERVER_ERROR, GENERIC_ERROR_MESSAGE };\r\n","import { CreateOutageViewModel } from \"../../../api/generated/models\";\r\nimport { IFormValues } from \"../../../components/form/Form.types\";\r\nimport {\r\n ISelectedMarker,\r\n IStreetlightData,\r\n} from \"../../../components/map/Map.types\";\r\nimport {\r\n BracketTypeDisplayMap,\r\n EBracketTypes,\r\n LampTypeDisplayMap,\r\n} from \"../../../shared/enums/utility.enums\";\r\nimport { isNullOrUndefined } from \"../../../shared/utils/data.utils\";\r\nimport { getGlobalState } from \"../../../shared/utils/testing.utils\";\r\n\r\nexport const getMarkerStatusFlag = (key: string | null | undefined): number => {\r\n if (isNullOrUndefined(key)) {\r\n throw new Error(\"key must be defined - getMarkerStatusFlag\");\r\n }\r\n let reported = 0;\r\n switch (key) {\r\n case \"Reported\":\r\n reported = 1;\r\n break;\r\n case \"In Progress\":\r\n reported = 1;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return reported;\r\n};\r\n\r\nexport const getBracketTypeDisplayLabel = (key: string): string => {\r\n let retVal;\r\n\r\n if (key === BracketTypeDisplayMap.COB) {\r\n key = EBracketTypes.COBRA;\r\n }\r\n\r\n if (key === BracketTypeDisplayMap.PT) {\r\n key = EBracketTypes.POST_TOP;\r\n }\r\n\r\n if (key === BracketTypeDisplayMap.CS) {\r\n key = EBracketTypes.CENTER_SUSPENSION;\r\n }\r\n\r\n switch (key) {\r\n case EBracketTypes.BRACKET:\r\n retVal = BracketTypeDisplayMap.BKT;\r\n break;\r\n case EBracketTypes.COBRA:\r\n retVal = BracketTypeDisplayMap.COB;\r\n break;\r\n case EBracketTypes.CENTER_SUSPENSION:\r\n retVal = BracketTypeDisplayMap.CS;\r\n break;\r\n case EBracketTypes.POST_TOP:\r\n retVal = BracketTypeDisplayMap.PT;\r\n break;\r\n case EBracketTypes.MONGOOSE:\r\n retVal = BracketTypeDisplayMap.MON;\r\n break;\r\n case EBracketTypes.MID_POLE:\r\n retVal = BracketTypeDisplayMap.MID;\r\n break;\r\n case EBracketTypes.SECURITY:\r\n retVal = BracketTypeDisplayMap.SEC;\r\n break;\r\n case EBracketTypes.OTHER:\r\n retVal = BracketTypeDisplayMap.OTH;\r\n break;\r\n\r\n default:\r\n retVal = BracketTypeDisplayMap.UNK;\r\n break;\r\n }\r\n return retVal;\r\n};\r\n\r\nexport const getLampTypeLabel = (key: string): string => {\r\n let retVal;\r\n switch (key) {\r\n case \"HPS\":\r\n retVal = LampTypeDisplayMap.HPS;\r\n break;\r\n case \"MV\":\r\n retVal = LampTypeDisplayMap.MV;\r\n break;\r\n case \"MH\":\r\n retVal = LampTypeDisplayMap.MH;\r\n break;\r\n case \"LED\":\r\n retVal = LampTypeDisplayMap.LED;\r\n break;\r\n case \"LPS\":\r\n retVal = LampTypeDisplayMap.LPS;\r\n break;\r\n case \"INC\":\r\n retVal = LampTypeDisplayMap.INC;\r\n break;\r\n case \"FLUO\":\r\n retVal = LampTypeDisplayMap.FLUO;\r\n break;\r\n\r\n default:\r\n retVal = LampTypeDisplayMap.UNK;\r\n break;\r\n }\r\n\r\n return retVal;\r\n};\r\n\r\nexport const getCity = (\r\n gisCity: string | null,\r\n geoCity: string | null\r\n): string => {\r\n let city = \"\";\r\n if (!gisCity || /^\\s*$/.test(gisCity)) {\r\n if (geoCity) {\r\n city = geoCity;\r\n }\r\n } else {\r\n city = gisCity;\r\n }\r\n\r\n return city;\r\n};\r\n\r\nexport const buildSubmitPayload = (\r\n formValues: IFormValues,\r\n selectedMarker: ISelectedMarker\r\n): CreateOutageViewModel => {\r\n const { streetLightData, geoLocation } = selectedMarker;\r\n const { attributes } = streetLightData as IStreetlightData;\r\n const {\r\n outageFormName,\r\n outageFormEmail,\r\n outageFormPhone,\r\n outageFormDropdown,\r\n outageFormBracketType,\r\n outageFormComments,\r\n } = formValues;\r\n\r\n const geoLocAddress = geoLocation?.address?.Address || \"Address Unknown\";\r\n const geoLocCity = geoLocation?.address?.City;\r\n const pinModeState = getGlobalState().ui.pinMode;\r\n const routingState = getGlobalState().ui.routing;\r\n\r\n const { WATTAGE, LATITUDE, LONGITUDE, TRS } = attributes;\r\n let { LAMPTYPE, FIXTURESUP, CITY, COUNTY, GISID, TOWNSHIP, CONTRACT_A } =\r\n attributes;\r\n\r\n if (pinModeState.enabled) {\r\n GISID = null;\r\n CITY = geoLocCity;\r\n COUNTY = \"\";\r\n TOWNSHIP = \"\";\r\n CONTRACT_A = \"\";\r\n LAMPTYPE = LampTypeDisplayMap.UNK;\r\n FIXTURESUP = outageFormBracketType;\r\n }\r\n\r\n return {\r\n comments: outageFormComments,\r\n contacts: [\r\n {\r\n name: outageFormName,\r\n email: outageFormEmail,\r\n mobilePhone: outageFormPhone.toString(),\r\n },\r\n ],\r\n location: {\r\n locationId: GISID,\r\n address: geoLocAddress,\r\n coordinates: {\r\n latitude: LATITUDE,\r\n longitude: LONGITUDE,\r\n },\r\n city: getCity(CITY, geoLocCity),\r\n county: COUNTY,\r\n township: TOWNSHIP,\r\n crossStreets: geoLocation?.crossStreets,\r\n trs: TRS,\r\n contractAccountNumber: CONTRACT_A,\r\n },\r\n outageReason: outageFormDropdown,\r\n utility: {\r\n lampType: getLampTypeLabel(LAMPTYPE),\r\n bracketType: getBracketTypeDisplayLabel(FIXTURESUP),\r\n wattage: pinModeState.enabled ? null : WATTAGE.toString(),\r\n type: \"Streetlight\",\r\n },\r\n originator: routingState.originatorFlag\r\n ? routingState.originatorFlag\r\n : null,\r\n };\r\n};\r\n","export default __webpack_public_path__ + \"static/media/dot_streetlight.542c51e8.svg\";","export default __webpack_public_path__ + \"static/media/dot_reported.865951a2.svg\";","import { IBreakpoints } from \"../theme.types\";\r\n\r\nexport const breakpoints: IBreakpoints = {\r\n base: 0,\r\n mobile: 320,\r\n tablet: 768,\r\n computer: 992,\r\n largeScreen: 1200,\r\n widescreen: 1920,\r\n};\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport { AppDispatch, AppThunk } from \"../../store\";\r\nimport { DispatchLogger } from \"../../utils/dispatch-logger/DispatchLogger\";\r\nimport {\r\n LookupsResponse,\r\n LookupsViewModel,\r\n} from \"../../../api/generated/models\";\r\nimport { ELogTypes } from \"../../../shared/enums/logging.enums\";\r\nimport { IStandardError } from \"../../../shared/types/error.types\";\r\nimport ErrorConstants from \"../../../api/constants/error.constants\";\r\nimport { ApiService } from \"../../../api/api.service\";\r\nimport { setLoading } from \"../global/global.slice\";\r\n\r\nexport interface ILookupsState {\r\n lookupCollection: LookupsViewModel | null;\r\n isLoading: boolean;\r\n lookupCollectionError: any;\r\n}\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * INITIAL STATE\r\n * --------------------------------------------------------------------------\r\n */\r\nconst initialState: ILookupsState = {\r\n lookupCollection: null,\r\n isLoading: false,\r\n lookupCollectionError: null,\r\n};\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * STATE SLICE\r\n * --------------------------------------------------------------------------\r\n */\r\nconst lookupsSlice = createSlice({\r\n name: \"lookups\",\r\n initialState,\r\n reducers: {\r\n getLookupsSuccess(state, action: PayloadAction) {\r\n state.lookupCollection = action.payload;\r\n state.isLoading = false;\r\n state.lookupCollectionError = null;\r\n },\r\n getLookupsFailed(state, action: PayloadAction) {\r\n const error = { ...action.payload };\r\n state.lookupCollection = null;\r\n state.isLoading = false;\r\n state.lookupCollectionError = error;\r\n },\r\n setIsLoading(state, action: PayloadAction) {\r\n state.isLoading = action.payload;\r\n },\r\n clearLookupsError(state) {\r\n state.lookupCollectionError = null;\r\n },\r\n },\r\n});\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * ACTIONS\r\n * --------------------------------------------------------------------------\r\n */\r\nexport const {\r\n getLookupsSuccess,\r\n getLookupsFailed,\r\n setIsLoading,\r\n clearLookupsError,\r\n} = lookupsSlice.actions;\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * THUNKS\r\n * --------------------------------------------------------------------------\r\n */\r\nexport const fetchLookups = (): any => async (dispatch: AppDispatch) => {\r\n dispatch(setIsLoading(true));\r\n const apiService: ApiService = ApiService.getInstance();\r\n const { lookupsApi } = apiService;\r\n try {\r\n const results = (await lookupsApi.getLookups()) as LookupsResponse;\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n if (results.isAxiosError || results.name === \"Error\") {\r\n const axiosError = results.toJSON();\r\n const error: IStandardError = {\r\n message: axiosError.message,\r\n code: axiosError.code,\r\n displayMessage: ErrorConstants.GENERIC_ERROR_MESSAGE,\r\n };\r\n dispatchLogger.fire(\r\n getLookupsFailed,\r\n { ...error },\r\n {\r\n message: \"Lookup Collection Fetch Failed\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n dispatch(setLoading(false));\r\n } else {\r\n dispatchLogger.fire(\r\n getLookupsSuccess,\r\n { ...results },\r\n {\r\n message: \"Lookup Collection Fetched\",\r\n type: ELogTypes.API,\r\n data: { results },\r\n }\r\n );\r\n }\r\n dispatch(setIsLoading(false));\r\n } catch (error) {\r\n dispatch(getLookupsFailed(error));\r\n dispatch(setLoading(false));\r\n }\r\n};\r\n\r\nexport default lookupsSlice.reducer;\r\n","export default __webpack_public_path__ + \"static/media/dot_extended-repair.0115e4b1.svg\";","export default __webpack_public_path__ + \"static/media/dot_non-ce.fca64cb8.svg\";","import { createMedia } from \"@artsy/fresnel\";\r\nimport { breakpoints } from \"../layout/breakpoints\";\r\n\r\n/**\r\n * @note Utility for conditionally rendering components based on media query\r\n * @see https://github.com/artsy/fresnel\r\n * */\r\nconst AppMedia = createMedia({\r\n breakpoints: {\r\n ...breakpoints,\r\n },\r\n});\r\n\r\nexport default AppMedia;\r\n","/* istanbul ignore file */\r\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\r\nimport { IAppConfig } from \"../shared/types/config.types\";\r\nimport { IApiTestParams } from \"../shared/types/testing.types\";\r\nimport { CONFIG_BASE_URL, CONFIG_ENDPOINT } from \"./constants/urls.constants\";\r\n\r\nconst CONFIG_API = axios.create({\r\n baseURL: CONFIG_BASE_URL,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n});\r\n\r\nconst configAPI = {\r\n getConfig: async (\r\n params?: IApiTestParams\r\n ): Promise> => {\r\n return CONFIG_API({\r\n method: \"GET\",\r\n url: CONFIG_ENDPOINT,\r\n data: {},\r\n })\r\n .then(function (response: AxiosResponse) {\r\n return response.data;\r\n })\r\n .catch(function (error: AxiosError) {\r\n console.log(error);\r\n return error;\r\n });\r\n },\r\n};\r\n\r\nexport default configAPI;\r\n","import {\r\n AnyAction,\r\n createSlice,\r\n Dispatch,\r\n PayloadAction,\r\n} from \"@reduxjs/toolkit\";\r\nimport {\r\n GeoLocResponse,\r\n ILocationServices,\r\n ILocationServicesError,\r\n ISelectedMarker,\r\n IStreetlightData,\r\n IUserLocation,\r\n} from \"../../../components/map/Map.types\";\r\nimport { ILogMessage } from \"../../../shared/services/Logging.service\";\r\nimport { AppDispatch, AppThunk } from \"../../store\";\r\nimport { DispatchLogger } from \"../../utils/dispatch-logger/DispatchLogger\";\r\nimport { ELogTypes } from \"../../../shared/enums/logging.enums\";\r\nimport { IAppConfig } from \"../../../shared/types/config.types\";\r\nimport configAPI from \"../../../api/config.api\";\r\nimport { AxiosError } from \"axios\";\r\nimport { fetchLookups } from \"../lookups/lookups.slice\";\r\nimport { ApiService } from \"../../../api/api.service\";\r\nimport { EBracketTypes } from \"../../../shared/enums/utility.enums\";\r\nimport { ESearchWizardSteps } from \"../../../shared/enums/search.enums\";\r\nimport {\r\n OutagesIdResponse,\r\n OutageViewModel,\r\n} from \"../../../api/generated/models\";\r\nimport { AuthState } from \"@okta/okta-auth-js\";\r\nimport { AuthenticationResult } from \"@azure/msal-browser\";\r\n\r\nexport interface IAuthState {\r\n loggedIn: boolean;\r\n oktaAuthState: AuthState | null;\r\n entraAuthState: AuthenticationResult | null;\r\n}\r\n\r\nexport interface IRoutingState {\r\n outageId?: string | null;\r\n selectedOutage?: OutageViewModel | null;\r\n routeNavigationComplete: boolean;\r\n routingRoutineComplete: boolean;\r\n outageNotFound: boolean;\r\n originatorFlag: string | null;\r\n}\r\n\r\nexport interface IPinModeState {\r\n enabled: boolean;\r\n pin: ISelectedMarker;\r\n selectedBracketType: string | null;\r\n}\r\n\r\nexport interface ISearchModeState {\r\n enabled: boolean;\r\n searchText: string | null;\r\n activeView: \"search\" | \"results\" | \"detail\";\r\n}\r\n\r\nexport interface IAdminModeState {\r\n enabled: boolean;\r\n selectedOutage: (OutageViewModel & { contacts?: Array }) | null;\r\n showAdminModal: boolean;\r\n}\r\n\r\nexport interface IUIState {\r\n baseMapInitialized: boolean;\r\n featureLayerInitialized: boolean;\r\n restrictedLayerInitialized: boolean;\r\n grandRapidsLayerInitialized: boolean;\r\n saginawLayerInitialized: boolean;\r\n jacksonLayerInitialized: boolean;\r\n isDrawerOpen: boolean;\r\n selectedMarker: ISelectedMarker;\r\n loading: boolean;\r\n routing: IRoutingState;\r\n pinMode: IPinModeState;\r\n searchMode: ISearchModeState;\r\n adminMode: IAdminModeState;\r\n}\r\n\r\nexport interface IGlobalState {\r\n appConfig: IAppConfig | null;\r\n auth: IAuthState;\r\n locationServices: ILocationServices;\r\n logs: Array;\r\n ui: IUIState;\r\n}\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * INITIAL STATE\r\n * --------------------------------------------------------------------------\r\n */\r\nconst initialState: IGlobalState = {\r\n appConfig: null,\r\n auth: {\r\n loggedIn: false,\r\n oktaAuthState: null,\r\n entraAuthState: null,\r\n },\r\n locationServices: {\r\n locationDisabled: false,\r\n userLocation: null,\r\n locationServicesError: null,\r\n },\r\n logs: [],\r\n ui: {\r\n baseMapInitialized: false,\r\n featureLayerInitialized: false,\r\n restrictedLayerInitialized: false,\r\n grandRapidsLayerInitialized: false,\r\n saginawLayerInitialized: false,\r\n jacksonLayerInitialized: false,\r\n isDrawerOpen: false,\r\n loading: false,\r\n selectedMarker: {\r\n geoLocation: null,\r\n streetLightData: null,\r\n },\r\n routing: {\r\n outageId: null,\r\n selectedOutage: null,\r\n routeNavigationComplete: false,\r\n routingRoutineComplete: false,\r\n outageNotFound: false,\r\n originatorFlag: null,\r\n },\r\n pinMode: {\r\n enabled: false,\r\n pin: {\r\n geoLocation: null,\r\n streetLightData: null,\r\n },\r\n selectedBracketType: null,\r\n },\r\n searchMode: {\r\n enabled: false,\r\n searchText: null,\r\n activeView: ESearchWizardSteps.SEARCH,\r\n },\r\n adminMode: {\r\n enabled: false,\r\n selectedOutage: null,\r\n showAdminModal: false,\r\n },\r\n },\r\n};\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * STATE SLICE\r\n * --------------------------------------------------------------------------\r\n */\r\nconst globalStateSlice = createSlice({\r\n name: \"globalState\",\r\n initialState,\r\n reducers: {\r\n setDrawerState(state, action: PayloadAction<{ isDrawerOpen: boolean }>) {\r\n const { isDrawerOpen } = action.payload;\r\n state.ui.isDrawerOpen = isDrawerOpen;\r\n },\r\n getConfigSuccess(state, action: PayloadAction) {\r\n if (action.payload.results) {\r\n state.appConfig = action.payload.results;\r\n } else {\r\n state.appConfig = action.payload;\r\n }\r\n },\r\n getConfigFailure(state, action: PayloadAction>) {\r\n state.appConfig = null;\r\n },\r\n setLoading(state, action: PayloadAction) {\r\n state.ui.loading = action.payload;\r\n },\r\n setLoggedIn(state, action: PayloadAction) {\r\n state.auth.loggedIn = action.payload;\r\n },\r\n setOktaAuthState(state, action: PayloadAction) {\r\n state.auth.oktaAuthState = action.payload;\r\n },\r\n setEntraAuthstate(\r\n state,\r\n action: PayloadAction\r\n ) {\r\n state.auth.entraAuthState = action.payload;\r\n },\r\n setBaseMapInitialized(state, action: PayloadAction) {\r\n state.ui.baseMapInitialized = action.payload;\r\n },\r\n setFeatureLayerInitialized(state, action: PayloadAction) {\r\n state.ui.featureLayerInitialized = action.payload;\r\n },\r\n setRestrictedLayerInitialized(state, action: PayloadAction) {\r\n state.ui.restrictedLayerInitialized = action.payload;\r\n },\r\n setGrandRapidsLayerInitialized(state, action: PayloadAction) {\r\n state.ui.grandRapidsLayerInitialized = action.payload;\r\n },\r\n setSaginawLayerInitialized(state, action: PayloadAction) {\r\n state.ui.saginawLayerInitialized = action.payload;\r\n },\r\n setJacksonLayerInitialized(state, action: PayloadAction) {\r\n state.ui.jacksonLayerInitialized = action.payload;\r\n },\r\n setRoutingOutageId(state, action: PayloadAction) {\r\n state.ui.routing.outageId = action.payload;\r\n },\r\n setRoutingOutage(state, action: PayloadAction) {\r\n state.ui.routing.selectedOutage = action.payload;\r\n state.ui.routing.routeNavigationComplete = true;\r\n },\r\n setOutageNotFound(state, action: PayloadAction) {\r\n state.ui.routing.outageNotFound = action.payload;\r\n state.ui.routing.routeNavigationComplete = true;\r\n },\r\n setRoutingRoutineComplete(state, action: PayloadAction) {\r\n state.ui.routing.routingRoutineComplete = true;\r\n },\r\n setOriginatorFlag(state, action: PayloadAction) {\r\n state.ui.routing.originatorFlag = action.payload;\r\n },\r\n setUserLocation(\r\n state,\r\n action: PayloadAction<{ userLocation: IUserLocation | null }>\r\n ) {\r\n const { userLocation } = action.payload;\r\n state.locationServices.userLocation = userLocation;\r\n state.locationServices.locationServicesError = null;\r\n state.locationServices.locationDisabled = false;\r\n },\r\n setUserLocationError(\r\n state,\r\n action: PayloadAction<{ error: ILocationServicesError }>\r\n ) {\r\n const { error } = action.payload;\r\n state.locationServices.userLocation = null;\r\n state.locationServices.locationServicesError = error;\r\n state.locationServices.locationDisabled = true;\r\n },\r\n setSelectedMarkerGeoLoc(\r\n state,\r\n action: PayloadAction<{ selectedMarker: any }>\r\n ) {\r\n const { selectedMarker } = action.payload;\r\n state.ui.selectedMarker.geoLocation = selectedMarker;\r\n },\r\n setSelectedMarkerData(\r\n state,\r\n action: PayloadAction<{ streetlightData: IStreetlightData }>\r\n ) {\r\n const { streetlightData } = action.payload;\r\n state.ui.selectedMarker.streetLightData = streetlightData;\r\n },\r\n setSelectedOutageAdminMode(\r\n state,\r\n action: PayloadAction<{ selectedOutage: OutageViewModel }>\r\n ) {\r\n state.ui.adminMode.selectedOutage = action.payload.selectedOutage;\r\n },\r\n setSearchMode(state, action: PayloadAction<{ enabled: boolean }>) {\r\n const { enabled } = action.payload;\r\n state.ui.searchMode.enabled = enabled;\r\n state.ui.isDrawerOpen = enabled;\r\n },\r\n setSearchView(\r\n state,\r\n action: PayloadAction<{ activeView: \"search\" | \"results\" | \"detail\" }>\r\n ) {\r\n const { activeView } = action.payload;\r\n state.ui.searchMode.activeView = activeView;\r\n },\r\n setSearchTerm(state, action: PayloadAction) {\r\n state.ui.searchMode.searchText = action.payload;\r\n },\r\n setShowAdminModal(state, action: PayloadAction<{ show: boolean }>) {\r\n const { show } = action.payload;\r\n state.ui.adminMode.showAdminModal = show;\r\n },\r\n setAdminMode(state, action: PayloadAction<{ enabled: boolean }>) {\r\n const { enabled } = action.payload;\r\n state.ui.adminMode.enabled = enabled;\r\n },\r\n setPinMode(state, action: PayloadAction<{ enabled: boolean }>) {\r\n const { enabled } = action.payload;\r\n state.ui.pinMode.enabled = enabled;\r\n },\r\n setPin(\r\n state,\r\n action: PayloadAction<{\r\n geoLocation: any;\r\n selectedMarkerData: IStreetlightData;\r\n }>\r\n ) {\r\n const { geoLocation, selectedMarkerData } = action.payload;\r\n state.ui.pinMode.pin.geoLocation = geoLocation;\r\n state.ui.pinMode.pin.streetLightData = selectedMarkerData;\r\n },\r\n setPinBracketType(\r\n state,\r\n action: PayloadAction<{\r\n bracketType: EBracketTypes | null;\r\n }>\r\n ) {\r\n const { bracketType } = action.payload;\r\n state.ui.pinMode.selectedBracketType = bracketType;\r\n },\r\n updateLogs(state, action: PayloadAction) {\r\n state.logs.push(action.payload);\r\n },\r\n clearLocationError(state) {\r\n state.locationServices.locationServicesError = null;\r\n },\r\n clearSearchTerm(state) {\r\n state.ui.searchMode.searchText = null;\r\n },\r\n clearSelectedMarker(state) {\r\n state.ui.selectedMarker = {\r\n geoLocation: null,\r\n streetLightData: null,\r\n };\r\n },\r\n },\r\n});\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * ACTIONS\r\n * --------------------------------------------------------------------------\r\n */\r\nexport const {\r\n setDrawerState,\r\n setUserLocation,\r\n setUserLocationError,\r\n getConfigSuccess,\r\n getConfigFailure,\r\n updateLogs,\r\n setOutageNotFound,\r\n setLoading,\r\n setLoggedIn,\r\n setOktaAuthState,\r\n setEntraAuthstate,\r\n setBaseMapInitialized,\r\n setFeatureLayerInitialized,\r\n setRestrictedLayerInitialized,\r\n setGrandRapidsLayerInitialized,\r\n setSaginawLayerInitialized,\r\n setJacksonLayerInitialized,\r\n setRoutingOutageId,\r\n setRoutingOutage,\r\n setRoutingRoutineComplete,\r\n setOriginatorFlag,\r\n setSelectedMarkerGeoLoc,\r\n setSelectedMarkerData,\r\n setSelectedOutageAdminMode,\r\n setAdminMode,\r\n setShowAdminModal,\r\n setPinMode,\r\n setPin,\r\n setSearchMode,\r\n setSearchView,\r\n setSearchTerm,\r\n setPinBracketType,\r\n clearLocationError,\r\n clearSearchTerm,\r\n clearSelectedMarker,\r\n} = globalStateSlice.actions;\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * THUNKS\r\n * @todo: Create seperate file for these\r\n * --------------------------------------------------------------------------\r\n */\r\nexport const fetchAppConfig =\r\n (): any => async (dispatch: Dispatch, getState: any) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n try {\r\n const results: any = await configAPI.getConfig();\r\n\r\n if (results.env) {\r\n const apiService: ApiService = ApiService.getInstance();\r\n apiService.appConfig = results;\r\n apiService.initializeAPIs();\r\n\r\n dispatchLogger.fire(\r\n getConfigSuccess,\r\n { results },\r\n {\r\n message: \"App Config Fetched.\",\r\n type: ELogTypes.API,\r\n data: { results },\r\n }\r\n );\r\n\r\n dispatch(fetchLookups());\r\n } else {\r\n dispatchLogger.fire(\r\n getConfigFailure,\r\n { results },\r\n {\r\n message: \"App Config Failed.\",\r\n type: ELogTypes.ERROR,\r\n data: { results },\r\n }\r\n );\r\n dispatch(getConfigFailure(results));\r\n }\r\n } catch (error) {\r\n dispatchLogger.fire(\r\n getConfigFailure,\r\n { error },\r\n {\r\n message: \"App Config Failed.\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n }\r\n };\r\n\r\nexport const updateUserLocation =\r\n (userLocation: IUserLocation): any =>\r\n (dispatch: Dispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setUserLocation,\r\n { userLocation },\r\n {\r\n message: \"User location updated.\",\r\n type: ELogTypes.GEO_LOC_EVENT,\r\n data: { userLocation },\r\n }\r\n );\r\n };\r\n\r\nexport const updateUserLocationError =\r\n (error: ILocationServicesError): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setUserLocationError,\r\n { error },\r\n {\r\n message: error.message || \"\",\r\n type: ELogTypes.ERROR,\r\n data: { error },\r\n }\r\n );\r\n };\r\n\r\nexport const updateMarkerGeoLoc =\r\n (selectedMarker: GeoLocResponse): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setSelectedMarkerGeoLoc,\r\n { selectedMarker },\r\n {\r\n message: \"Selected Marker Geo Location Updated.\",\r\n type: ELogTypes.GEO_LOC_EVENT,\r\n data: { selectedMarker },\r\n }\r\n );\r\n };\r\n\r\nexport const updateMarkerData =\r\n (streetlightData: IStreetlightData): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setSelectedMarkerData,\r\n { streetlightData },\r\n {\r\n message: \"Selected Marker Data Updated.\",\r\n type: ELogTypes.MAP_CLICK,\r\n data: { streetlightData },\r\n }\r\n );\r\n };\r\n\r\nexport const updateDrawerState =\r\n (isDrawerOpen: boolean): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setDrawerState,\r\n { isDrawerOpen },\r\n {\r\n message: \"Drawer State Changed\",\r\n type: ELogTypes.STATE_CHANGED,\r\n data: { isDrawerOpen },\r\n }\r\n );\r\n };\r\n\r\nexport const updateSearchModeState =\r\n (enabled: boolean): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setSearchMode,\r\n { enabled },\r\n {\r\n message: \"Search Mode Changed\",\r\n type: ELogTypes.STATE_CHANGED,\r\n data: { enabled },\r\n }\r\n );\r\n };\r\n\r\nexport const updatePinModeState =\r\n (enabled: boolean): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setPinMode,\r\n { enabled },\r\n {\r\n message: \"Pin Mode Changed\",\r\n type: ELogTypes.STATE_CHANGED,\r\n data: { enabled },\r\n }\r\n );\r\n };\r\n\r\nexport const updateAdminModeState =\r\n (enabled: boolean): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setAdminMode,\r\n { enabled },\r\n {\r\n message: \"Admin Mode Changed\",\r\n type: ELogTypes.STATE_CHANGED,\r\n data: { enabled },\r\n }\r\n );\r\n };\r\n\r\nexport const updatePin =\r\n (geoLocation: any, selectedMarkerData: IStreetlightData): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setPin,\r\n { geoLocation, selectedMarkerData },\r\n {\r\n message: \"Pin Set\",\r\n type: ELogTypes.STATE_CHANGED,\r\n data: { geoLocation, selectedMarkerData },\r\n }\r\n );\r\n };\r\n\r\nexport const updateSearchView =\r\n (activeView: \"search\" | \"results\" | \"detail\"): any =>\r\n (dispatch: AppDispatch) => {\r\n const dispatchLogger = DispatchLogger.getInstance(dispatch);\r\n dispatchLogger.fire(\r\n setSearchView,\r\n { activeView },\r\n {\r\n message: \"Search Wizard View Changed\",\r\n type: ELogTypes.STATE_CHANGED,\r\n data: { activeView },\r\n }\r\n );\r\n };\r\n\r\nexport default globalStateSlice.reducer;\r\n","import { ILogMessage } from \"../../../shared/services/Logging.service\";\r\nimport faker from \"faker\";\r\nimport { ELogTypes } from \"../../../shared/enums/logging.enums\";\r\n\r\nconst createLog = (): ILogMessage => {\r\n const logTypeArray = [];\r\n for (const [propertyKey, propertyValue] of Object.entries(ELogTypes)) {\r\n logTypeArray.push(propertyValue);\r\n }\r\n\r\n return {\r\n message: faker.random.words(20),\r\n type: faker.random.arrayElement(logTypeArray),\r\n data: {\r\n testData: true,\r\n },\r\n timestamp: new Date().toDateString(),\r\n };\r\n};\r\n\r\nconst getMockLogs = (numberOfLogs: number): Array => {\r\n return Array.from({ length: numberOfLogs }, createLog);\r\n};\r\n\r\nexport default { createLog, getMockLogs };\r\n","/* eslint-disable node/no-unsupported-features/node-builtins */\r\n/* eslint-disable no-console */\r\nimport { updateLogs } from \"../../state-management/slices/global/global.slice\";\r\nimport { AppDispatch } from \"../../state-management/store\";\r\nimport MockLogs from \"../../api/mock/data/logs\";\r\nimport { ELogTypes } from \"../enums/logging.enums\";\r\n\r\nexport interface ILogMessage {\r\n type: ELogTypes;\r\n message: string;\r\n timestamp?: string;\r\n data?: any;\r\n}\r\n\r\nexport class LoggingService {\r\n private logs: Array;\r\n private dispatch: AppDispatch;\r\n private static instance: LoggingService;\r\n\r\n private constructor(dispatch: AppDispatch) {\r\n this.dispatch = dispatch;\r\n this.logs = [];\r\n MockLogs.createLog();\r\n }\r\n\r\n public static getInstance(dispatch: AppDispatch): LoggingService {\r\n if (!LoggingService.instance) {\r\n LoggingService.instance = new LoggingService(dispatch);\r\n }\r\n\r\n return LoggingService.instance;\r\n }\r\n\r\n getLogs(): Array {\r\n return this.logs;\r\n }\r\n\r\n logMessage(log: ILogMessage): void {\r\n const newLog = {\r\n timestamp: new Date().toISOString(),\r\n ...log,\r\n };\r\n\r\n this.logs.push(newLog);\r\n\r\n if (process.env.REACT_APP_ENABLE_LOGGING === \"true\") {\r\n this.dispatch(updateLogs(newLog));\r\n console.info(`[${log.type}]:`, log);\r\n }\r\n }\r\n}\r\n","export const OVERLAY_LAYER_ID = \"PIN-MODE-OVERLAY\";\r\nexport const PIN_MODE_LAYER_ID = \"PIN-MODE-LAYER\";\r\n\r\nexport const LOCATOR_URL =\r\n \"https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer\";\r\n\r\nexport const DEFAULT_ZOOM_LEVEL_DESKTOP = 7;\r\nexport const DEFAULT_ZOOM_LEVEL_MOBILE = 6;\r\nexport const DEFAULT_CENTER_POINT = [-84.611389, 43.408611];\r\nexport const JACKSON_MI_CENTER = [-84.4013, 42.2459];\r\nexport const MIN_SCALE = 36111.909643;\r\nexport const OUT_FIELDS = [\"*\"];\r\n\r\nexport enum ELocationServicesErrorMessages {\r\n PERMISSION_DENIED = \"Location services disabled. To help find nearby streetlights, go to your browser settings, enable your location, and ​​​​​​​refresh this page.\",\r\n POSITION_UNAVAILABLE = \"There was an error retrieving your location; please refresh the page to try again.\",\r\n TIMEOUT = \"Geolocation request timed out; please try again.\",\r\n UNKNOWN = \"An unknown error occured; please try again.\",\r\n}\r\n\r\nexport enum EMarkerStatuses {\r\n REPORTED = \"Reported\",\r\n IN_PROGRESS = \"In Progress\",\r\n EXTENDED_REPAIR = \"Extended Repair\",\r\n COMPLETED = \"Completed\",\r\n NON_CE = \"Non-CE Streetlight\",\r\n DOES_NOT_EXIST = \"Streetlight DNE\",\r\n}\r\n","export enum EBracketTypes {\r\n BRACKET = \"BKT\",\r\n COBRA = \"COB\",\r\n SECURITY = \"SEC\",\r\n CENTER_SUSPENSION = \"CS\",\r\n POST_TOP = \"PT\",\r\n MID_POLE = \"MID\",\r\n MONGOOSE = \"MON\",\r\n OTHER = \"OTH\",\r\n UNKNOWN = \"UNK\",\r\n}\r\n\r\nexport const LampTypeDisplayMap = {\r\n HPS: \"High Pressure Sodium\",\r\n MV: \"Mercury Vapor\",\r\n MH: \"Metal Halide\",\r\n LED: \"LED\",\r\n LPS: \"Low Pressure Sodium\",\r\n INC: \"Incandescent\",\r\n FLUO: \"Fluorescent\",\r\n UNK: \"Unknown\",\r\n};\r\n\r\nexport const BracketTypeDisplayMap = {\r\n BKT: \"Bracket\",\r\n COB: \"Cobra\",\r\n SEC: \"Security\",\r\n CS: \"Center Suspension\",\r\n PT: \"Post Top\",\r\n MID: \"Mid-Pole Mounting\",\r\n MON: \"Mongoose\",\r\n OTH: \"Other\",\r\n UNK: \"Unknown\",\r\n};\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport {\r\n OutagesResponse,\r\n OutageViewModel,\r\n OutageViewModelWithContacts,\r\n} from \"../../../api/generated/models\";\r\nimport { IStandardError } from \"../../../shared/types/error.types\";\r\n\r\nexport interface ISubmittedOutage {\r\n isSubmitted: boolean;\r\n outage: OutageViewModel | null;\r\n submitOutageError: IStandardError | null;\r\n}\r\nexport interface ISearchedOutages {\r\n outageCollection: Array | null;\r\n searchedOutagesError: IStandardError | null;\r\n}\r\nexport interface IAdminOutages {\r\n outageCollection: Array | null;\r\n pagination: {\r\n currentPage: number;\r\n pageSize: number;\r\n totalCount: number | null;\r\n };\r\n adminOutagesError: IStandardError | null;\r\n updateAdminOutagesError: IStandardError | null;\r\n isLoading: boolean;\r\n}\r\n\r\nexport interface IImageUploadState {\r\n imgDataUrl?: string | ArrayBuffer | null;\r\n fileData?: Blob | null;\r\n imageProcessing: boolean;\r\n showSafetyTooltip: boolean;\r\n}\r\n\r\nexport interface IOutagesState {\r\n outageCollection: Array;\r\n submittedOutage: ISubmittedOutage;\r\n searchedOutages: ISearchedOutages;\r\n adminOutages: IAdminOutages;\r\n isLoading: boolean;\r\n outagesError: IStandardError | null;\r\n imageUpload: IImageUploadState;\r\n}\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * INITIAL STATE\r\n * --------------------------------------------------------------------------\r\n */\r\nconst initialState: IOutagesState = {\r\n outageCollection: [],\r\n submittedOutage: {\r\n isSubmitted: false,\r\n outage: null,\r\n submitOutageError: null,\r\n },\r\n searchedOutages: {\r\n outageCollection: null,\r\n searchedOutagesError: null,\r\n },\r\n adminOutages: {\r\n outageCollection: null,\r\n pagination: {\r\n currentPage: 1,\r\n pageSize: 10,\r\n totalCount: null,\r\n },\r\n adminOutagesError: null,\r\n updateAdminOutagesError: null,\r\n isLoading: false,\r\n },\r\n imageUpload: {\r\n imgDataUrl: null,\r\n fileData: null,\r\n imageProcessing: false,\r\n showSafetyTooltip: false,\r\n },\r\n isLoading: false,\r\n outagesError: null,\r\n};\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * STATE SLICE\r\n * --------------------------------------------------------------------------\r\n */\r\nconst outagesSlice = createSlice({\r\n name: \"outages\",\r\n initialState,\r\n reducers: {\r\n getOutagesSuccess(state, action: PayloadAction) {\r\n state.outageCollection = action.payload;\r\n state.outagesError = null;\r\n state.isLoading = false;\r\n },\r\n getOutagesFailed(state, action: PayloadAction) {\r\n const error = {\r\n ...action.payload,\r\n };\r\n state.outageCollection = [];\r\n state.outagesError = error;\r\n state.isLoading = false;\r\n },\r\n submitOutagesSuccess(state, action: PayloadAction) {\r\n const data = action.payload;\r\n state.submittedOutage = {\r\n isSubmitted: true,\r\n outage: data,\r\n submitOutageError: null,\r\n };\r\n state.isLoading = false;\r\n },\r\n submitOutagesFailed(state, action: PayloadAction) {\r\n const error = action.payload;\r\n state.submittedOutage = {\r\n isSubmitted: false,\r\n outage: null,\r\n submitOutageError: error,\r\n };\r\n state.isLoading = false;\r\n },\r\n searchOutagesSuccess(state, action: PayloadAction) {\r\n state.searchedOutages.outageCollection = action.payload.results;\r\n state.searchedOutages.searchedOutagesError = null;\r\n state.isLoading = false;\r\n },\r\n searchOutagesFailed(state, action: PayloadAction) {\r\n const error = action.payload;\r\n state.searchedOutages = {\r\n outageCollection: null,\r\n searchedOutagesError: error,\r\n };\r\n state.isLoading = false;\r\n },\r\n adminOutagesSuccess(state, action: PayloadAction) {\r\n const { currentPage, outageViewModelWithContacts, pageSize, totalCount } =\r\n action.payload.results;\r\n\r\n state.adminOutages = {\r\n ...state.adminOutages,\r\n outageCollection: outageViewModelWithContacts,\r\n pagination: {\r\n currentPage,\r\n pageSize,\r\n totalCount,\r\n },\r\n adminOutagesError: null,\r\n isLoading: false,\r\n };\r\n },\r\n adminOutagesFailed(state, action: PayloadAction) {\r\n const error = action.payload;\r\n state.adminOutages = {\r\n ...state.adminOutages,\r\n outageCollection: null,\r\n adminOutagesError: error,\r\n isLoading: false,\r\n };\r\n },\r\n updateAdminOutagesFailed(state, action: PayloadAction) {\r\n const error = action.payload;\r\n state.adminOutages = {\r\n ...state.adminOutages,\r\n updateAdminOutagesError: error,\r\n isLoading: false,\r\n };\r\n },\r\n setIsAdminLoading(state, action: PayloadAction) {\r\n state.adminOutages.isLoading = action.payload;\r\n },\r\n setIsLoading(state, action: PayloadAction) {\r\n state.isLoading = action.payload;\r\n },\r\n setImageProcessing(state, action: PayloadAction) {\r\n state.imageUpload.imageProcessing = action.payload;\r\n },\r\n setImageDataUrl(\r\n state,\r\n action: PayloadAction\r\n ) {\r\n state.imageUpload.imgDataUrl = action.payload;\r\n },\r\n setFileData(state, action: PayloadAction) {\r\n state.imageUpload.fileData = action.payload;\r\n },\r\n setShowSafetyTooltip(state, action: PayloadAction) {\r\n state.imageUpload = {\r\n ...state.imageUpload,\r\n showSafetyTooltip: action.payload,\r\n };\r\n },\r\n clearImageData(state) {\r\n state.imageUpload = {\r\n imageProcessing: false,\r\n fileData: null,\r\n imgDataUrl: null,\r\n showSafetyTooltip: false,\r\n };\r\n },\r\n clearOutageError(state) {\r\n state.outagesError = null;\r\n state.isLoading = false;\r\n },\r\n clearSubmittedOutage(state) {\r\n state.submittedOutage = {\r\n isSubmitted: false,\r\n outage: null,\r\n submitOutageError: null,\r\n };\r\n state.isLoading = false;\r\n },\r\n clearSearchedOutages(state) {\r\n state.searchedOutages = {\r\n outageCollection: null,\r\n searchedOutagesError: null,\r\n };\r\n state.isLoading = false;\r\n },\r\n },\r\n});\r\n\r\n/**\r\n * --------------------------------------------------------------------------\r\n * ACTIONS\r\n * --------------------------------------------------------------------------\r\n */\r\nexport const {\r\n getOutagesSuccess,\r\n getOutagesFailed,\r\n searchOutagesSuccess,\r\n searchOutagesFailed,\r\n adminOutagesSuccess,\r\n adminOutagesFailed,\r\n updateAdminOutagesFailed,\r\n setIsAdminLoading,\r\n submitOutagesSuccess,\r\n submitOutagesFailed,\r\n setIsLoading,\r\n setImageDataUrl,\r\n setFileData,\r\n setImageProcessing,\r\n setShowSafetyTooltip,\r\n clearImageData,\r\n clearOutageError,\r\n clearSubmittedOutage,\r\n clearSearchedOutages,\r\n} = outagesSlice.actions;\r\n\r\nexport default outagesSlice.reducer;\r\n","import React from \"react\";\r\n\r\nimport ReactDOM from \"react-dom\";\r\nimport { Provider } from \"react-redux\";\r\n// import reportWebVitals from \"./reportWebVitals\";\r\nimport { GTMProvider } from \"@elgorditosalsero/react-gtm-hook\";\r\nimport { ThemeProvider } from \"@emotion/react\";\r\nimport Theme from \"./theme\";\r\nimport store from \"./state-management/store\";\r\nimport AppMedia from \"./theme/utils/AppMedia\";\r\n\r\nimport \"@arcgis/core/assets/esri/themes/light/main.css\";\r\nimport \"./theme/global-styles/index.scss\";\r\n\r\nconst { MediaContextProvider } = AppMedia;\r\nconst render = () => {\r\n const App = require(\"./App\").default;\r\n const gtmParams = { id: \"GTM-5T2S9J\" };\r\n\r\n ReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n );\r\n};\r\n\r\nrender();\r\n\r\nif (process.env.NODE_ENV === \"development\") {\r\n if (process.env.REACT_APP_ENABLE_MOCK === \"true\") {\r\n const { worker } = require(\"./api/mock/browser\");\r\n worker.start();\r\n }\r\n\r\n if (module.hot) {\r\n module.hot.accept(\"./App\", render);\r\n }\r\n}\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\n// reportWebVitals();\r\n","export enum ELogTypes {\r\n STATE_CHANGED = \"STATE CHANGED\",\r\n API = \"API CALL\",\r\n GEO_LOC_EVENT = \"GEOLOC LOOKUP\",\r\n MAP_CLICK = \"MAP CLICK\",\r\n SEARCH = \"SEARCH\",\r\n ERROR = \"ERROR\",\r\n}\r\n\r\nexport enum EGoogleEventTypes {\r\n MAP_MARKER_CLICKED = \"Map Marker\",\r\n REPORT_OUTAGE_CLICKED = \"REPORT_OUTAGE_CLICKED\",\r\n OUTAGE_SUBMITTED = \"OUTAGE_SUBMITTED\",\r\n SEARCH = \"SEARCH_QUERY\",\r\n CLOSE_BUTTON_CLICKED = \"CLOSE_BUTTON_CLICKED\",\r\n CANCEL_BUTTON_CLICKED = \"CANCEL_BUTTON_CLICKED\",\r\n BACK_TO_MAP_CLICKED = \"BACK_TO_MAP_CLICKED\",\r\n ERROR = \"ERROR\",\r\n}\r\n"],"sourceRoot":""}