{"version":3,"sources":["app/DeviceSlice.ts","app/hooks.ts","app/InputSlice.ts","components/Header/index.tsx","components/Map/index.tsx","pages/daily/DailyAQISlice.ts","components/Map/mapmarker.tsx","api/getTodaysData.ts","api/getTodaysData2.ts","pages/daily/index.tsx","pages/hourly/HourlyAQISlice.ts","api/getHourAvgHistorical.ts","util/addIndex.ts","util/sortComparator.ts","util/logo_base64.ts","pages/hourly/index.tsx","pages/history/index.tsx","api/getDeviceList.ts","App.tsx","pages/user/UserSlice.ts","app/store.ts","serviceWorker.ts","index.tsx"],"names":["DeviceSliceInitialState","DeviceSlice","createSlice","name","initialState","reducers","populate","state","action","payload","empty","actions","DeviceReducer","reducer","useAppDispatch","useDispatch","useAppSelector","useSelector","InitialInputState","device","selectedDate","moment","selectedHour","subtract","hour","InputSlice","changeDevice","changeSelectedDate","changeSelectedHour","InputReducer","routeNames","path","Header","s","user","location","username","useLocation","className","style","backgroundColor","href","target","rel","src","alt","map","r","to","pathname","GoogleMapBox","children","options","mapref","useRef","bootstrapURLKeys","key","defaultCenter","lat","lng","defaultZoom","zoom","resetBoundsOnResize","ref","current","height","DailyAQISliceInitialState","DailyAQISlice","DailyAQIReducer","MapMarker","text","pm25","selected","onClick","background","getTodaysData","dev_id","datehour","a","config","method","url","format","axios","result","getTodaysData2","data","then","e","DailyAQI","devices","daily_data","daily","useState","newData","setNewData","loading","setLoading","dispatch","root","input","useEffect","data2","console","log","callAPI","customStyles","singleValue","provided","color","placeholder","control","border","isFocused","boxShadow","Options","setOptions","district","setDistrict","label","value","selectedDistrict","setSelectedDistrict","filterdData","filter","k","deviceOptionArray","item","districtOptionArray","Set","JSON","stringify","parse","center","parseFloat","long","length","d","styles","classNamePrefix","isSearchable","onChange","find","i","newDevice","size","ext_humi","ext_temp","date","pm25_avg","pm25_min","pm25_max","pm10_avg","pm10_min","pm10_max","ext_temp_avg","ext_temp_min","ext_temp_max","ext_humi_avg","ext_humi_min","ext_humi_max","wind_direction_avg","wind_speed_avg","toFixed","wind_speed_min","wind_speed_max","HourlyAQISliceInitialState","HourlyAQISlice","HourlyAQIReducer","getHourAvgHistorical","id","start_datetime","end_datetime","addSerialId","index","serial","sortComparator","cmp","wbpcb_base64","enableRipple","HourlyAQI","rowIndexValue","hourly","StartDateTime","setStartDateTime","EndDateTime","setEndDateTime","LoadingData","setLoadingData","gridref","gridData","setgridData","aqi","defaultValue","toDate","change","openOnFocus","refresh","width","dataSource","toolbar","toolbarClick","args","excelExport","fileName","header","headerRows","rows","cells","colSpan","backColor","fontColor","fontSize","hAlign","bold","pdfExport","pageSize","pageOrientation","theme","fontName","record","contents","type","position","x","y","textBrushColor","fromTop","csvExport","enableStickyHeader","allowExcelExport","allowFiltering","allowSorting","allowPdfExport","allowResizing","enableAltRow","enableHover","filterSettings","excelHeaderQueryCellInfo","excelExportModule","sheet","images","undefined","excelImage","image","row","column","lastRow","lastColumn","push","field","headerText","sortComparer","services","Sort","Filter","Resize","ExcelExport","PdfExport","Toolbar","Search","HistoricAQI","getDeviceList","response","App","devicesData","loadDevices","backgroundImage","exact","component","UserSlice","login","userId","token","logInTime","updateLogStatus","reset","rootReducer","combineReducers","UserReducer","persistConfig","storage","blacklist","persistedReducer","persistReducer","store","configureStore","persistor","persistStore","Boolean","window","hostname","match","ReactDOM","render","StrictMode","document","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","error","message"],"mappings":"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","file":"static/js/main.2c3000d5.chunk.js","sourcesContent":["import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport { getDeviceList_returns_data_item } from \"../api/getDeviceList\";\r\n\r\nexport const DeviceSliceInitialState: getDeviceList_returns_data_item[] = [];\r\n\r\nexport const DeviceSlice = createSlice({\r\n name: 'devices',\r\n initialState: DeviceSliceInitialState,\r\n reducers: {\r\n populate: (state: getDeviceList_returns_data_item[], action: PayloadAction) => {\r\n return action.payload;\r\n },\r\n empty: (state: getDeviceList_returns_data_item[], action: PayloadAction) => {\r\n return DeviceSliceInitialState;\r\n }\r\n }\r\n});\r\n\r\nexport const { populate, empty } = DeviceSlice.actions;\r\nexport const DeviceReducer = DeviceSlice.reducer;","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\r\nimport type { RootState, AppDispatch } from './store';\r\n\r\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\r\nexport const useAppDispatch = () => useDispatch();\r\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport moment, { Moment } from \"moment\";\r\nimport { getDeviceList_returns_data_item as Device } from \"../api/getDeviceList\";\r\n\r\n\r\nexport interface IInputState {\r\n device: Device|null;\r\n selectedDate: Moment;\r\n selectedHour: number;\r\n}\r\n\r\nconst InitialInputState: IInputState = {\r\n device: null,\r\n selectedDate: moment(),\r\n selectedHour: moment().subtract(1, 'hour').hour()\r\n}\r\n\r\nexport const InputSlice = createSlice({\r\n name: \"input\",\r\n initialState: InitialInputState,\r\n reducers: {\r\n changeDevice: (state: IInputState, action: PayloadAction) => {\r\n state.device = action.payload;\r\n return state;\r\n },\r\n changeSelectedDate: (state: IInputState, action: PayloadAction) => {\r\n state.selectedDate = action.payload;\r\n return state;\r\n },\r\n changeSelectedHour: (state: IInputState, action: PayloadAction) => {\r\n state.selectedHour = action.payload;\r\n return state;\r\n },\r\n },\r\n});\r\n\r\nexport const { changeDevice,changeSelectedDate,changeSelectedHour } = InputSlice.actions;\r\nexport const InputReducer = InputSlice.reducer;","import React from \"react\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { useAppDispatch, useAppSelector } from \"../../app/hooks\";\r\nimport { reset } from \"../../pages/user/UserSlice\";\r\n\r\nexport const routeNames: { path: string; name: string }[] = [\r\n {\r\n path: \"/daily\",\r\n name: \"Today's Data\",\r\n },\r\n {\r\n path: \"/hourly\",\r\n name: \"Hourly Historic Data\",\r\n },\r\n // {\r\n // path: \"/history\",\r\n // name: \"Historic Data\",\r\n // },\r\n];\r\n\r\nexport const Header: React.FC<{}> = () => {\r\n const { state, username } = useAppSelector((s) => s.user);\r\n const location = useLocation();\r\n const dispatch = useAppDispatch();\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n CONTINUOUS AIR QUALITY MONITORING SYSTEM\r\n
\r\n
\r\n {routeNames.map((r) => (\r\n \r\n {r.name}\r\n \r\n ))}\r\n {/* {state === \"loggedIn\" ? (\r\n <>\r\n
\r\n {username}\r\n
\r\n {\r\n dispatch(reset());\r\n }}\r\n className={`text-gray-600 border-2 border-gray-600 rounded-full p-2 font-sans text-sm hover:bg-white hover:text-blue-500 ${\r\n location.pathname === \"/signin\"\r\n ? \"border-b-8\"\r\n : \"text-gray-600 bg-transparent\"\r\n }`}\r\n >\r\n Logout\r\n \r\n \r\n ) : null} */}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Header;\r\n","import React, { useRef } from \"react\";\r\nimport GoogleMapReact from \"google-map-react\";\r\nimport googleMapReact from \"google-map-react\";\r\n\r\nexport const GoogleMapBox: React.FC<{\r\n options?: Partial;\r\n}> = ({ children, options }) => {\r\n const mapref = useRef(null);\r\n\r\n return (\r\n
\r\n (mapref.current = r)}\r\n style={{\r\n height: \"100%\",\r\n }}\r\n {...options}\r\n >\r\n {children}\r\n \r\n
\r\n );\r\n};\r\n\r\nexport const GoogleMapBoxMemoized = React.memo(GoogleMapBox);\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport { getDailyAQI_returns_data_item } from \"../../api/getDailyAQI\";\r\nimport { getTodaysData_Item } from \"../../api/getTodaysData\";\r\n\r\nexport type getDailyAQIData = getTodaysData_Item[];\r\n\r\nexport const DailyAQISliceInitialState: getDailyAQIData = [];\r\n\r\nexport const DailyAQISlice = createSlice({\r\n name: \"daily\",\r\n initialState: DailyAQISliceInitialState,\r\n reducers: {\r\n populate: (\r\n state: getDailyAQIData,\r\n action: PayloadAction\r\n ) => {\r\n return action.payload;\r\n },\r\n empty: (state: getDailyAQIData, action: PayloadAction) => {\r\n return DailyAQISliceInitialState;\r\n },\r\n },\r\n});\r\n\r\nexport const { populate, empty } = DailyAQISlice.actions;\r\nexport const DailyAQIReducer = DailyAQISlice.reducer;\r\n","import React, { useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport ReactTooltip from \"react-tooltip\";\r\nimport { RootState } from \"../../app/store\";\r\n\r\nexport const getColorFromAQIValue = (aqi: number | undefined) => {\r\n if (aqi !== undefined && aqi >= 0) {\r\n switch (true) {\r\n case aqi === 0:\r\n return \"#efefef\";\r\n case aqi < 50:\r\n return \"#00B050\";\r\n case aqi < 100:\r\n return \"#92D050\";\r\n case aqi < 200:\r\n return \"#FFFF00\";\r\n case aqi < 300:\r\n return \"#FFC000\";\r\n case aqi <= 400:\r\n return \"#FF0000\";\r\n case aqi > 400:\r\n return \"#C00000\";\r\n }\r\n }\r\n};\r\n\r\nexport const MapMarker: React.FC<{\r\n onClick: () => void;\r\n lat: number;\r\n lng: number;\r\n text: string;\r\n pm25: number;\r\n selected?: boolean;\r\n}> = ({ text, selected, pm25, onClick }) => {\r\n // let color = getColorFromAQIValue(aqi);\r\n\r\n\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n

{pm25}

\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport const MapMarkerMemoized = React.memo(MapMarker);\r\n","import axios, { AxiosRequestConfig, AxiosResponse } from \"axios\";\r\nimport { Moment } from \"moment\";\r\n\r\nexport interface getTodaysData_Item {\r\n id: number;\r\n dev_id: string;\r\n date: string;\r\n hour: number;\r\n so2_min: string;\r\n so2_avg: string;\r\n so2_max: string;\r\n no2_min: string;\r\n no2_avg: string;\r\n no2_max: string;\r\n pm1_min: string;\r\n pm1_avg: string;\r\n pm1_max: string;\r\n pm25_min: string;\r\n pm25_avg: string;\r\n pm25_max: string;\r\n pm10_min: string;\r\n pm10_avg: string;\r\n pm10_max: string;\r\n int_temp_min: string;\r\n int_temp_avg: string;\r\n int_temp_max: string;\r\n int_humi_min: string;\r\n int_humi_avg: string;\r\n int_humi_max: string;\r\n ext_temp_min: string;\r\n ext_temp_avg: string;\r\n ext_temp_max: string;\r\n ext_humi_min: string;\r\n ext_humi_avg: string;\r\n ext_humi_max: string;\r\n pm_temp_min: string;\r\n pm_temp_avg: string;\r\n pm_temp_max: string;\r\n pm_humi_min: string;\r\n pm_humi_avg: string;\r\n pm_humi_max: string;\r\n wind_direction_avg: string;\r\n wind_speed_avg: number;\r\n wind_speed_max: number;\r\n wind_speed_min: number;\r\n AQI: number;\r\n createdAt: Date;\r\n updatedAt: Date;\r\n}\r\n\r\nexport interface getTodaysData_Returns {\r\n status: string;\r\n total_data: number;\r\n data: getTodaysData_Item[];\r\n}\r\n\r\nexport const getTodaysData = async (\r\n dev_id: string,\r\n datehour: Moment\r\n): Promise> => {\r\n const config: AxiosRequestConfig = {\r\n method: \"get\",\r\n url: `https://aqmsdata.wbpcb.gov.in:1443/v1.0/sens/real/get_24h_avg?dev_id=${dev_id}&date_hour=${datehour.format(\r\n \"YYYY-MM-DD HH\"\r\n )}`,\r\n };\r\n const result: AxiosResponse = await axios(config);\r\n return result;\r\n};\r\n","import axios, { AxiosRequestConfig, AxiosResponse } from \"axios\";\r\n\r\nexport const getTodaysData2 = async (dev_id: string) => {\r\n const data = {\r\n dev_id: dev_id,\r\n };\r\n\r\n const config: AxiosRequestConfig = {\r\n method: \"post\",\r\n url: \"https://aqmsdata.wbpcb.gov.in:1443/v1.0/sens/get_latest_data\",\r\n data: data,\r\n };\r\n const result = await axios(config).then((e) => e);\r\n return result;\r\n};\r\n","import React, { useEffect, useMemo, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { useAppDispatch } from \"../../app/hooks\";\r\nimport { RootState } from \"../../app/store\";\r\nimport { GoogleMapBox } from \"../../components/Map\";\r\nimport { populate } from \"./DailyAQISlice\";\r\nimport { info } from \"../../components/rangeInfo/AQIDangerRanges\";\r\nimport { MapMarker } from \"../../components/Map/mapmarker\";\r\nimport { changeDevice } from \"../../app/InputSlice\";\r\nimport { getTodaysData } from \"../../api/getTodaysData\";\r\nimport moment from \"moment\";\r\nimport { getTodaysData2 } from \"../../api/getTodaysData2\";\r\nimport Select from \"react-select\";\r\nimport { VscLoading } from \"react-icons/vsc\";\r\n\r\nconst DailyAQI: React.FC<{}> = () => {\r\n const devices = useSelector((state: RootState) => state.devices);\r\n const daily_data = useSelector((state: RootState) => state.daily);\r\n const [newData, setNewData] = useState();\r\n const [loading, setLoading] = useState(false);\r\n const data = daily_data[0];\r\n\r\n const dispatch = useAppDispatch();\r\n\r\n const { device } = useSelector((root: RootState) => root.input);\r\n\r\n useEffect(() => {\r\n const callAPI = async () => {\r\n if (device === null) return;\r\n try {\r\n setLoading(true);\r\n const data = await getTodaysData(device.dev_id, moment());\r\n const data2 = await getTodaysData2(device.dev_id);\r\n setNewData(data2.data.data);\r\n dispatch(populate(data.data.data));\r\n setLoading(false);\r\n } catch (error) {\r\n console.log(error);\r\n setLoading(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n callAPI();\r\n }, [device]);\r\n\r\n const { state } = useSelector((state: RootState) => state.user);\r\n const [key, setKey] = useState(1);\r\n\r\n const customStyles = {\r\n singleValue: (provided: any) => ({\r\n ...provided,\r\n color: \"#ffffff\",\r\n }),\r\n\r\n placeholder: (provided: any) => ({\r\n ...provided,\r\n color: \"#ffffff\",\r\n }),\r\n\r\n control: (provided: any, state: any) => ({\r\n ...provided,\r\n backgroundColor: \"#60A5FA\",\r\n color: \"#ffffff\",\r\n border: state.isFocused ? 0 : 0,\r\n // This line disable the blue border\r\n boxShadow: state.isFocused ? 0 : 0,\r\n \"&:hover\": {\r\n border: state.isFocused ? 0 : 0,\r\n },\r\n }),\r\n };\r\n\r\n const [Options, setOptions] = useState([]);\r\n const [district, setDistrict] = useState([]);\r\n const [selectedDistrict, setSelectedDistrict] = useState({\r\n label: \"North 24 Pgs.\",\r\n value: \"North 24 Pgs.\",\r\n });\r\n\r\n useEffect(() => {\r\n const filterdData = devices?.filter(\r\n (k) => k.district === selectedDistrict?.value\r\n );\r\n\r\n const deviceOptionArray = filterdData?.map((item) => ({\r\n value: item.dev_id,\r\n label: item.location,\r\n }));\r\n\r\n setOptions(deviceOptionArray);\r\n }, [selectedDistrict, devices]);\r\n\r\n useEffect(() => {\r\n const districtOptionArray = devices?.map((item) => ({\r\n value: item.district,\r\n label: item.district,\r\n }));\r\n\r\n setDistrict(\r\n //@ts-ignore\r\n [...new Set(districtOptionArray.map((a) => JSON.stringify(a)))].map((a) =>\r\n JSON.parse(a)\r\n )\r\n );\r\n }, [devices]);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n {!!devices && devices.length > 0\r\n ? devices\r\n .filter((d) => d.lat !== null && d.long !== null)\r\n .map((d) =>\r\n device?.dev_id === d.dev_id ? (\r\n {\r\n dispatch(changeDevice(d));\r\n }}\r\n />\r\n ) : (\r\n {\r\n dispatch(changeDevice(d));\r\n }}\r\n />\r\n )\r\n )\r\n : null}\r\n \r\n {!!device ? (\r\n <>\r\n
\r\n
\r\n \r\n
\r\n District\r\n
\r\n i.value === device?.district\r\n // )}\r\n value={selectedDistrict}\r\n onChange={(e: any) => {\r\n setSelectedDistrict(e);\r\n }}\r\n options={district}\r\n />\r\n
\r\n \r\n
\r\n Device\r\n
\r\n i.value === device?.dev_id)?.label\r\n }\r\n value={\r\n Options.find((i) => i.value === device?.dev_id)?.label\r\n }\r\n onChange={(e: any) => {\r\n const newDevice = devices.find(\r\n (d) => d.dev_id === e.value\r\n );\r\n if (!!newDevice) dispatch(changeDevice(newDevice));\r\n }}\r\n options={Options}\r\n />\r\n
\r\n
\r\n\r\n {loading ? (\r\n
\r\n \r\n
\r\n ) : (\r\n <>\r\n
\r\n
\r\n
Device Location
\r\n
\r\n {device.location}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Relative Humidity
\r\n
\r\n {\r\n //@ts-ignore\r\n !!newData?.ext_humi ? newData?.ext_humi : \"N/A\"\r\n }{\" \"}\r\n %\r\n
\r\n
\r\n
\r\n
Temperature
\r\n
\r\n {\r\n //@ts-ignore\r\n !!newData?.ext_temp ? newData?.ext_temp : \"N/A\"\r\n }{\" \"}\r\n °C\r\n
\r\n
\r\n {/*
\r\n
AQI
\r\n
\r\n {!!data?.AQI ? data.AQI : \"N/A\"}\r\n
\r\n
*/}\r\n
\r\n
\r\n
\r\n

Latitude

\r\n

\r\n {device.lat}\r\n

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

Longitude

\r\n

\r\n {device.long}\r\n

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

Date and Hour

\r\n

\r\n {data?.date + \", \" + data?.hour} hours\r\n

\r\n
\r\n
\r\n
\r\n\r\n {typeof data !== \"undefined\" ? (\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\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\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\n \r\n\r\n {!!data?.wind_direction_avg &&\r\n data?.wind_direction_avg !== \"(due) N\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!!data?.wind_speed_avg && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n Pollutant\r\n \r\n Average\r\n \r\n Minimum\r\n \r\n Maximum\r\n
\r\n SO2\r\n \r\n {data.so2_avg} µg/m3\r\n \r\n {data.so2_min} µg/m3\r\n \r\n {data.so2_max} µg/m3\r\n
\r\n NO2\r\n \r\n {data.no2_avg} µg/m3\r\n \r\n {data.no2_min} µg/m3\r\n \r\n {data.no2_max} µg/m3\r\n
PM 1\r\n {data.pm1_avg} µg/m3\r\n \r\n {data.pm1_min} µg/m3\r\n \r\n {data.pm1_max} µg/m3\r\n
PM 2.5\r\n {data.pm25_avg} µg/m3\r\n \r\n {data.pm25_min} µg/m3\r\n \r\n {data.pm25_max} µg/m3\r\n
PM 10\r\n {data.pm10_avg} µg/m3\r\n \r\n {data.pm10_min} µg/m3\r\n \r\n {data.pm10_max} µg/m3\r\n
\r\n Temperature\r\n \r\n {data.ext_temp_avg} °C\r\n \r\n {data.ext_temp_min} °C\r\n \r\n {data.ext_temp_max} °C\r\n
\r\n Humidity\r\n \r\n {data.ext_humi_avg} %\r\n \r\n {data.ext_humi_min} %\r\n \r\n {data.ext_humi_max} %\r\n
\r\n Wind Direction (°)\r\n \r\n {data?.wind_direction_avg}\r\n --
\r\n Wind Speed (m/s)\r\n \r\n {data?.wind_speed_avg.toFixed(2)}\r\n \r\n {data?.wind_speed_min.toFixed(2)}\r\n \r\n {data?.wind_speed_max.toFixed(2)}\r\n
\r\n
\r\n
\r\n ) : (\r\n
\r\n No Data Available\r\n
\r\n )}\r\n \r\n )}\r\n\r\n
\r\n

\r\n Disclaimer: West Bengal pollution Control Board has developed\r\n a sensor based air pollution Monitoring network. The sensors\r\n are periodically calibrated against the reference-grade\r\n monitors and are being used for air quality management for the\r\n state. The data represent broad trends of air pollution in the\r\n locality.These data are being used for the purpose of research\r\n only and not to meant for regulatory intent.\r\n

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

\r\n 24-Hourly NAAQS\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 PM 2.5 (ug/m3)\r\n \r\n PM 10 (ug/m3)\r\n
\r\n 60\r\n \r\n 100\r\n
\r\n
\r\n
\r\n
\r\n \r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default DailyAQI;\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport { getHourAvgHistorical_item } from \"../../api/getHourAvgHistorical\";\r\nimport { getHourlyAQI_returns_data_item } from \"../../api/getHourlyAQI\";\r\n\r\ninterface dataItem extends getHourAvgHistorical_item {\r\n serial: number;\r\n}\r\n\r\nexport type getHourlyAQIData = dataItem[];\r\n\r\nexport const HourlyAQISliceInitialState: getHourlyAQIData = [];\r\n\r\nexport const HourlyAQISlice = createSlice({\r\n name: \"hourly\",\r\n initialState: HourlyAQISliceInitialState,\r\n reducers: {\r\n populate: (\r\n state: getHourlyAQIData,\r\n action: PayloadAction\r\n ) => {\r\n return action.payload;\r\n },\r\n empty: (\r\n state: getHourlyAQIData,\r\n action: PayloadAction\r\n ) => {\r\n return HourlyAQISliceInitialState;\r\n },\r\n },\r\n});\r\n\r\nexport const { populate, empty } = HourlyAQISlice.actions;\r\nexport const HourlyAQIReducer = HourlyAQISlice.reducer;","import axios, { AxiosRequestConfig, AxiosResponse } from \"axios\";\r\nimport { Moment } from \"moment\";\r\n\r\nexport interface getHourAvgHistorical_item {\r\n id: number;\r\n dev_id: string;\r\n date: string;\r\n hour: number;\r\n so2_min: string;\r\n so2_avg: string;\r\n so2_max: string;\r\n no2_min: string;\r\n no2_avg: string;\r\n no2_max: string;\r\n pm1_min: string;\r\n pm1_avg: string;\r\n pm1_max: string;\r\n pm25_min: string;\r\n pm25_avg: string;\r\n pm25_max: string;\r\n pm10_min: string;\r\n pm10_avg: string;\r\n pm10_max: string;\r\n int_temp_min: string;\r\n int_temp_avg: string;\r\n int_temp_max: string;\r\n int_humi_min: string;\r\n int_humi_avg: string;\r\n int_humi_max: string;\r\n ext_temp_min: string;\r\n ext_temp_avg: string;\r\n ext_temp_max: string;\r\n ext_humi_min: string;\r\n ext_humi_avg: string;\r\n ext_humi_max: string;\r\n pm_temp_min: string;\r\n pm_temp_avg: string;\r\n pm_temp_max: string;\r\n pm_humi_min: string;\r\n pm_humi_avg: string;\r\n pm_humi_max: string;\r\n createdAt: Date;\r\n updatedAt: Date;\r\n}\r\n\r\nexport interface getHourAvgHistorical_Returns {\r\n status: string;\r\n total_data: number;\r\n data: getHourAvgHistorical_item[];\r\n}\r\n\r\nexport const getHourAvgHistorical = async (\r\n id: number,\r\n start_datetime: Moment,\r\n end_datetime: Moment\r\n): Promise> => {\r\n const config: AxiosRequestConfig = {\r\n method: \"get\",\r\n // url: `https://monster1.distronix.in:1443/avgdata/v2.0/get_hourly_avg?location_id=${id}&start_time=${start_datetime.format(\r\n // \"YYYY-MM-DD HH:mm:ss\"\r\n // )}&end_time=${end_datetime.format(\"YYYY-MM-DD HH:mm:ss\")}`,\r\n url: `https://aqmsdata.wbpcb.gov.in:1443/v1.0/sens/real/get_hour_avg?start_date_hour=${start_datetime.format(\r\n \"YYYY-MM-DD HH:mm:ss\"\r\n )}&end_date_hour=${end_datetime.format(\r\n \"YYYY-MM-DD HH:mm:ss\"\r\n )}&location_id=${id}`,\r\n };\r\n const result: AxiosResponse = await axios(\r\n config\r\n );\r\n return result;\r\n};\r\n","export function addSerialId(data: T[]) {\r\n return data.map((i, index) => ({...i, serial: index+1}))\r\n};","import { ValueType } from \"@syncfusion/ej2-grids\";\r\n\r\nexport const sortComparator = (ref: ValueType, cmp: ValueType) => {\r\n if (typeof ref !== typeof cmp) return 0;\r\n else {\r\n switch (typeof ref) {\r\n case 'string':\r\n // @ts-ignore\r\n return parseFloat(ref) - parseFloat(cmp);\r\n case 'number':\r\n // @ts-ignore\r\n return ref - cmp;\r\n default:\r\n return 0;\r\n }\r\n }\r\n}\r\n","export const wbpcb_base64 =\r\n \"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\";\r\n","import moment, { Moment } from \"moment\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport {\r\n DateTimePickerComponent,\r\n Inject,\r\n} from \"@syncfusion/ej2-react-calendars\";\r\nimport { useAppDispatch } from \"../../app/hooks\";\r\nimport { RootState } from \"../../app/store\";\r\nimport { populate } from \"./HourlyAQISlice\";\r\nimport { VscLoading } from \"react-icons/all\";\r\nimport { changeDevice } from \"../../app/InputSlice\";\r\nimport { enableRipple } from \"@syncfusion/ej2-base\";\r\nimport {\r\n GridComponent,\r\n ColumnsDirective,\r\n ColumnDirective,\r\n ExcelExport,\r\n Filter,\r\n Resize,\r\n Sort,\r\n FilterSettingsModel,\r\n ToolbarItems,\r\n PdfExport,\r\n Search,\r\n Toolbar,\r\n} from \"@syncfusion/ej2-react-grids\";\r\nimport { getHourAvgHistorical } from \"../../api/getHourAvgHistorical\";\r\nimport { ClickEventArgs } from \"@syncfusion/ej2-navigations\";\r\nimport { addSerialId } from \"../../util/addIndex\";\r\nimport { sortComparator } from \"../../util/sortComparator\";\r\nimport Select from \"react-select\";\r\nimport { wbpcb_base64 } from \"../../util/logo_base64\";\r\n\r\nenableRipple(true);\r\nconst HourlyAQI: React.FC<{}> = () => {\r\n const rowIndexValue = useRef(0);\r\n const devices = useSelector((state: RootState) => state.devices);\r\n const data = useSelector((state: RootState) => state.hourly);\r\n const [StartDateTime, setStartDateTime] = useState(\r\n moment().subtract(1, \"day\")\r\n );\r\n const [EndDateTime, setEndDateTime] = useState(moment());\r\n const dispatch = useAppDispatch();\r\n const { device } = useSelector((root: RootState) => root.input);\r\n const [LoadingData, setLoadingData] = useState(false);\r\n const toolbar: ToolbarItems[] = [\r\n \"ExcelExport\",\r\n \"PdfExport\",\r\n // \"CsvExport\",\r\n \"Search\",\r\n \"Print\",\r\n ];\r\n const filterOptions: FilterSettingsModel = {\r\n type: \"Excel\",\r\n };\r\n\r\n const excelHeaderQueryCellInfo = (args: ClickEventArgs) => {\r\n if (\r\n (gridref.current?.excelExportModule as any).sheet.images === null ||\r\n (gridref.current?.excelExportModule as any).sheet.images === undefined\r\n ) {\r\n (gridref.current?.excelExportModule as any).sheet.images = [];\r\n }\r\n const excelImage: any = {\r\n image: wbpcb_base64,\r\n row: 1,\r\n column: 1,\r\n lastRow: 2,\r\n lastColumn: 2,\r\n };\r\n (gridref.current?.excelExportModule as any).sheet.images.push(excelImage);\r\n };\r\n\r\n const toolbarClick = (args: ClickEventArgs | undefined) => {\r\n if (gridref.current === null || !args) return;\r\n switch (args.item.text) {\r\n case \"Excel Export\":\r\n rowIndexValue.current = 0;\r\n gridref.current.excelExport({\r\n fileName: `${device?.location}-${StartDateTime.format(\r\n \"ll\"\r\n )}-${EndDateTime.format(\"ll\")}.xlsx`,\r\n header: {\r\n headerRows: 7,\r\n rows: [\r\n {\r\n cells: [\r\n {\r\n colSpan: 15,\r\n value: \"WBPCB\",\r\n style: {\r\n backColor: \"#cde6f7\",\r\n fontColor: \"#000000\",\r\n fontSize: 18,\r\n hAlign: \"Center\",\r\n bold: true,\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n cells: [\r\n {\r\n colSpan: 15,\r\n value: \"West Bengal Pollution Control Board\",\r\n style: {\r\n backColor: \"#cde6f7\",\r\n fontColor: \"#000000\",\r\n fontSize: 16,\r\n hAlign: \"Center\",\r\n bold: true,\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n cells: [\r\n {\r\n colSpan: 15,\r\n value: `Device: ${\r\n Options.find((i) => i.value === device?.dev_id)?.label\r\n }`,\r\n style: {\r\n fontSize: 12,\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n cells: [\r\n {\r\n colSpan: 15,\r\n value:\r\n \"Parameter: AQI |\tNO2 AVG (µg/m³) |\tSO2 AVG (µg/m³) |\tPM 1 AVG (µg/m³)\t| PM 2.5 AVG (µg/m³) |\tPM 10 AVG (µg/m³) |\tREL HUMI (%) |\tTEMPERATURE (°C)\",\r\n style: {\r\n fontSize: 12,\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n cells: [\r\n {\r\n colSpan: 15,\r\n value: `From: ${moment(StartDateTime).format(\r\n \"DD/MM/YYYY hh:mm:ss\"\r\n )} To: ${moment(EndDateTime).format(\r\n \"DD/MM/YYYY hh:mm:ss\"\r\n )}`,\r\n style: {\r\n fontSize: 12,\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n cells: [\r\n {\r\n colSpan: 15,\r\n value: `Downloaded on ${moment().format(\r\n \"DD-MM-YYYY hh:mm:ss A\"\r\n )}`,\r\n style: {\r\n fontSize: 12,\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n cells: [\r\n {\r\n colSpan: 15,\r\n value: Options.find((i) => i.value === device?.dev_id)\r\n ?.label,\r\n style: {\r\n backColor: \"#204FAC\",\r\n fontColor: \"#ffffff\",\r\n fontSize: 13,\r\n hAlign: \"Center\",\r\n },\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n });\r\n break;\r\n case \"PDF Export\":\r\n rowIndexValue.current = 0;\r\n gridref.current.pdfExport({\r\n pageSize: \"B1\",\r\n fileName: `${device?.location},-${StartDateTime.format(\r\n \"ll\"\r\n )}-${EndDateTime.format(\"ll\")}.pdf`,\r\n pageOrientation: \"Landscape\",\r\n theme: {\r\n header: {\r\n bold: true,\r\n // border: { color: '#64FA50' },\r\n fontColor: \"#000000\",\r\n fontName: \"Calibri\",\r\n fontSize: 14,\r\n },\r\n record: {\r\n fontColor: \"#000000\",\r\n fontName: \"Calibri\",\r\n fontSize: 12,\r\n },\r\n },\r\n header: {\r\n contents: [\r\n {\r\n type: \"Image\",\r\n src: wbpcb_base64,\r\n position: { x: 0, y: 0 },\r\n size: { height: 100, width: 400 },\r\n },\r\n {\r\n position: { x: 0, y: 100 },\r\n style: { textBrushColor: \"#000000\", fontSize: 25 },\r\n type: \"Text\",\r\n value: \"CONTINUOUS AIR QUALITY MONITORING SYSTEM\",\r\n },\r\n {\r\n position: { x: 0, y: 135 },\r\n style: { textBrushColor: \"#000000\", fontSize: 18 },\r\n type: \"Text\",\r\n value: `Created at: ${moment().format(\"DD-MM-YYYY HH:mm:ss\")}`,\r\n },\r\n {\r\n position: { x: 300, y: 135 },\r\n style: { textBrushColor: \"#000000\", fontSize: 18 },\r\n type: \"Text\",\r\n value: `From ${moment(StartDateTime).format(\r\n \"DD-MM-YYYY\"\r\n )} To ${moment(EndDateTime).format(\"DD-MM-YYYY\")}`,\r\n },\r\n {\r\n position: { x: 0, y: 165 },\r\n style: { textBrushColor: \"#000000\", fontSize: 18 },\r\n type: \"Text\",\r\n value: `${\r\n Options.find((i) => i.value === device?.dev_id)?.label\r\n }`,\r\n },\r\n ],\r\n fromTop: 0,\r\n height: 200,\r\n },\r\n });\r\n break;\r\n case \"CSV Export\":\r\n rowIndexValue.current = 0;\r\n gridref.current.csvExport({\r\n fileName: `${device?.location},-${StartDateTime.format(\r\n \"ll\"\r\n )}-${EndDateTime.format(\"ll\")}.csv`,\r\n });\r\n break;\r\n }\r\n };\r\n useEffect(() => {\r\n const callAPI = async () => {\r\n if (device === null) return;\r\n\r\n const data = await getHourAvgHistorical(\r\n device.id,\r\n StartDateTime,\r\n EndDateTime\r\n );\r\n dispatch(populate(addSerialId(data.data.data)));\r\n };\r\n callAPI();\r\n }, []);\r\n\r\n const gridref = useRef(null);\r\n const { state } = useSelector((state: RootState) => state.user);\r\n\r\n const [gridData, setgridData] = useState([]);\r\n useEffect(() => {\r\n setgridData([]);\r\n data.map((item) =>\r\n setgridData((d) => [\r\n ...d,\r\n {\r\n ...item,\r\n aqi: device?.aqi,\r\n location: device?.location,\r\n district: device?.district,\r\n lat: device?.lat,\r\n long: device?.long,\r\n },\r\n ])\r\n );\r\n }, [data]);\r\n\r\n const [Options, setOptions] = useState([]);\r\n const [district, setDistrict] = useState([]);\r\n const [selectedDistrict, setSelectedDistrict] = useState({\r\n label: \"North 24 Pgs.\",\r\n value: \"North 24 Pgs.\",\r\n });\r\n\r\n useEffect(() => {\r\n const filterdData = devices?.filter(\r\n (k) => k.district === selectedDistrict?.value\r\n );\r\n\r\n const deviceOptionArray = filterdData?.map((item) => ({\r\n value: item.dev_id,\r\n label: item.location,\r\n }));\r\n\r\n setOptions(deviceOptionArray);\r\n }, [devices, selectedDistrict]);\r\n\r\n useEffect(() => {\r\n const districtOptionArray = devices?.map((item) => ({\r\n value: item.district,\r\n label: item.district,\r\n }));\r\n\r\n setDistrict(\r\n //@ts-ignore\r\n [...new Set(districtOptionArray.map((a) => JSON.stringify(a)))].map((a) =>\r\n JSON.parse(a)\r\n )\r\n );\r\n }, [devices]);\r\n\r\n const customStyles = {\r\n singleValue: (provided: any) => ({\r\n ...provided,\r\n color: \"#ffffff\",\r\n }),\r\n\r\n placeholder: (provided: any) => ({\r\n ...provided,\r\n color: \"#ffffff\",\r\n }),\r\n\r\n control: (provided: any, state: any) => ({\r\n ...provided,\r\n backgroundColor: \"#60A5FA\",\r\n color: \"#ffffff\",\r\n border: state.isFocused ? 0 : 0,\r\n // This line disable the blue border\r\n boxShadow: state.isFocused ? 0 : 0,\r\n \"&:hover\": {\r\n border: state.isFocused ? 0 : 0,\r\n },\r\n }),\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n \r\n
\r\n District\r\n
\r\n {\r\n setSelectedDistrict(e);\r\n }}\r\n options={district}\r\n />\r\n
\r\n\r\n \r\n
Device
\r\n i.value === device?.dev_id)?.label}\r\n onChange={(e: any) => {\r\n const newDevice = devices.find((d) => d.dev_id === e.value);\r\n if (!!newDevice) dispatch(changeDevice(newDevice));\r\n }}\r\n options={Options}\r\n />\r\n
\r\n \r\n
Start DateTime
\r\n {\r\n setStartDateTime(moment(e.value));\r\n }}\r\n openOnFocus={true}\r\n />\r\n
\r\n \r\n
End DateTime
\r\n {\r\n setEndDateTime(moment(e.value));\r\n }}\r\n />\r\n
\r\n {\r\n setLoadingData(true);\r\n if (device === null) return;\r\n console.log(\"calling api\");\r\n const data = await getHourAvgHistorical(\r\n device.id,\r\n StartDateTime,\r\n EndDateTime\r\n );\r\n dispatch(populate(addSerialId(data.data.data)));\r\n setLoadingData(false);\r\n if (gridref.current !== null) gridref.current.refresh();\r\n console.log(\"dispatching data\");\r\n }}\r\n >\r\n
\r\n {LoadingData ? (\r\n \r\n ) : (\r\n \"Find\"\r\n )}\r\n
\r\n \r\n
\r\n \r\n (gridref.current = r)}\r\n toolbar={toolbar}\r\n toolbarClick={toolbarClick}\r\n enableStickyHeader\r\n allowExcelExport\r\n allowFiltering\r\n allowSorting\r\n allowPdfExport\r\n allowResizing\r\n enableAltRow\r\n enableHover\r\n filterSettings={filterOptions}\r\n excelHeaderQueryCellInfo={excelHeaderQueryCellInfo}\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\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n

\r\n Disclaimer: West Bengal pollution Control Board has developed a sensor\r\n based air pollution Monitoring network. The sensors are periodically\r\n calibrated against the reference-grade monitors and are being used for\r\n air quality management for the state. The data represent broad trends\r\n of air pollution in the locality.These data are being used for the\r\n purpose of research only and not to meant for regulatory intent.\r\n

\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default HourlyAQI;\r\n","import React from 'react'\r\n\r\nconst HistoricAQI = () => {\r\n \r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default HistoricAQI\r\n","import axios, { AxiosRequestConfig, AxiosResponse } from \"axios\";\r\n\r\nexport interface getDeviceList_returns_data_item {\r\n dev_id: string;\r\n location: string;\r\n lat: string;\r\n long: string;\r\n aqi: string;\r\n district?: string | null;\r\n pm25: string;\r\n id: number;\r\n}\r\n\r\nexport interface getDeviceList_returns_data {\r\n status: string;\r\n data: getDeviceList_returns_data_item[];\r\n}\r\n\r\nexport const getDeviceList = async (): Promise<\r\n AxiosResponse\r\n> => {\r\n const config: AxiosRequestConfig = {\r\n url: \"https://aqmsdata.wbpcb.gov.in:1443/v1.0/sens/get_device_list\",\r\n method: \"POST\",\r\n };\r\n const response: AxiosResponse = await axios(\r\n config\r\n );\r\n return response;\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport {\r\n BrowserRouter as Router,\r\n Switch,\r\n Route,\r\n Redirect,\r\n} from \"react-router-dom\";\r\n\r\nimport { populate } from \"./app/DeviceSlice\";\r\nimport { useAppDispatch } from \"./app/hooks\";\r\nimport { changeDevice } from \"./app/InputSlice\";\r\nimport { RootState } from \"./app/store\";\r\nimport Header from \"./components/Header\";\r\nimport DailyAQI from \"./pages/daily\";\r\nimport HourlyAQI from \"./pages/hourly\";\r\nimport HistoricAQI from \"./pages/history\";\r\nimport { getDeviceList } from \"./api/getDeviceList\";\r\n\r\nfunction App() {\r\n const dispatch = useAppDispatch();\r\n useEffect(() => {\r\n const loadDevices = async () => {\r\n const devicesData = await getDeviceList();\r\n const devices = devicesData.data.data;\r\n dispatch(populate(devices));\r\n dispatch(changeDevice(devices[devices.length - 1]));\r\n };\r\n loadDevices();\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\n}\r\n\r\nexport default App;\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\n\r\nexport type logState = \"loggedIn\" | \"guest\" | \"loggingIn\";\r\n\r\nexport type UserInputCredentials = {\r\n userId: string;\r\n password: string;\r\n};\r\n\r\nexport interface UserState {\r\n userId?: string;\r\n username?: string;\r\n token?: string;\r\n state: logState;\r\n logInTime?: string;\r\n}\r\n\r\nexport const initialState: UserState = {\r\n state: \"guest\",\r\n};\r\n\r\nexport const UserSlice = createSlice({\r\n name: \"user\",\r\n initialState,\r\n reducers: {\r\n login: (\r\n state: UserState,\r\n action: PayloadAction, \"state\">>\r\n ) => {\r\n state.userId = action.payload.userId;\r\n state.username = action.payload.username;\r\n state.token = action.payload.token;\r\n state.logInTime = action.payload.logInTime;\r\n state.state = \"loggedIn\";\r\n return state;\r\n },\r\n updateLogStatus: (state: UserState, action: PayloadAction) => {\r\n state.state = action.payload;\r\n return state;\r\n\r\n },\r\n reset: (state: UserState, action: PayloadAction) => {\r\n // state = initialState;\r\n return initialState;\r\n\r\n },\r\n },\r\n});\r\n\r\nexport const { login, reset, updateLogStatus } = UserSlice.actions;\r\nexport default UserSlice.reducer;\r\n","import { configureStore, ThunkAction, Action, combineReducers } from '@reduxjs/toolkit';\r\nimport { persistStore, persistReducer, PersistConfig } from \"redux-persist\";\r\nimport storage from \"redux-persist/lib/storage\";\r\n\r\nimport { DailyAQIReducer } from '../pages/daily/DailyAQISlice';\r\nimport { HourlyAQIReducer } from '../pages/hourly/HourlyAQISlice';\r\nimport UserReducer from '../pages/user/UserSlice';\r\nimport { DeviceReducer } from './DeviceSlice';\r\nimport { InputReducer } from './InputSlice';\r\n\r\nconst rootReducer = combineReducers({\r\n user: UserReducer,\r\n devices: DeviceReducer,\r\n hourly: HourlyAQIReducer,\r\n daily: DailyAQIReducer,\r\n input: InputReducer,\r\n});\r\n\r\nconst persistConfig = {\r\n key: \"root\",\r\n storage,\r\n blacklist: ['input','hourly', 'daily']\r\n};\r\n\r\n\r\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\r\n\r\nexport const store = configureStore({\r\n reducer: persistedReducer\r\n});\r\n\r\nexport const persistor = persistStore(store);\r\n\r\nexport type AppDispatch = typeof store.dispatch;\r\nexport type RootState = ReturnType;\r\nexport type AppThunk = ThunkAction<\r\n ReturnType,\r\n RootState,\r\n unknown,\r\n Action\r\n>;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' },\r\n })\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then((registration) => {\r\n registration.unregister();\r\n })\r\n .catch((error) => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\nimport App from \"./App\";\r\nimport { persistor, store } from \"./app/store\";\r\nimport { Provider } from \"react-redux\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\nimport { PersistGate } from \"redux-persist/integration/react\";\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}