Files
hpos-web/src/App.js

131 lines
4.6 KiB
JavaScript
Raw Normal View History

import './App.css';
2023-07-05 07:12:43 +05:30
import React, { useEffect, useState } from 'react';
import moment from 'moment';
2023-07-05 07:12:43 +05:30
2023-11-11 15:51:18 +05:30
import { collection, onSnapshot, query, where } from "firebase/firestore";
2023-07-07 04:51:55 +05:30
import Card from './components/Card';
import db from './firebase';
function App() {
2023-11-11 15:51:18 +05:30
const registrationCached = 16329;
const malesCached = 6741;
const femalesCached = 9179;
const normalCached = 7153;
const traitsCached = 2312;
const diseasesCached = 365;
2023-07-07 08:48:14 +05:30
const [totalScreened, setTotalScreened] = useState(0);
2023-07-05 07:12:43 +05:30
const [males, setMales] = useState(0);
2023-07-07 08:48:14 +05:30
const [females, setFemales] = useState(0);
const [normal, setNormal] = useState(0);
2023-07-26 15:35:17 +05:30
// const [positives, setPositives] = useState(0);
2023-07-07 08:48:14 +05:30
const [traits, setTraits] = useState(0);
const [diseases, setDiseases] = useState(0);
const [lastUpdate, setLastUpdate] = useState(moment());
2023-07-21 08:20:39 +05:30
const [devMode, setDevMode] = useState(false);
2023-07-05 07:12:43 +05:30
useEffect(() => {
2023-11-11 15:51:18 +05:30
// const q = query(collection(db, "patientData")); // cached
2023-11-24 19:28:16 +05:30
const notCachedDate = "2023-11-12";
const q = query(collection(db, "patientData"), where("createdAt", ">=", moment(notCachedDate).format("YYYY-MM-DD")));
2023-07-07 08:48:14 +05:30
const unsub = onSnapshot(q, (querySnapshot) => {
const patients = [];
let maleCount = 0;
let femaleCount = 0;
querySnapshot.forEach((document) => {
const patient = document.data();
patients.push(patient);
2023-07-07 09:01:35 +05:30
const { gender } = patient;
2023-07-20 17:53:59 +05:30
if (gender?.toLowerCase() === 'male') {
2023-07-07 08:48:14 +05:30
maleCount++;
}
2023-07-20 17:53:59 +05:30
if (gender?.toLowerCase() === 'female') {
2023-07-07 08:48:14 +05:30
femaleCount++;
}
});
2023-11-11 15:51:18 +05:30
setTotalScreened(registrationCached + patients?.length);
setMales(malesCached + maleCount);
setFemales(femalesCached + femaleCount);
setLastUpdate(moment());
2023-07-07 08:48:14 +05:30
});
2023-07-26 15:35:17 +05:30
return () => unsub;
2023-07-07 08:48:14 +05:30
}, []);
useEffect(() => {
2023-11-24 19:28:16 +05:30
const notCachedDate = "2023-11-12";
const q = query(collection(db, "testData"), where("testTime", ">=", moment(notCachedDate).format("YYYY-MM-DD")));
2023-07-07 08:48:14 +05:30
const unsub = onSnapshot(q, (querySnapshot) => {
const hposTests = [];
let normalCount = 0;
2023-07-07 08:48:14 +05:30
let traitCount = 0;
let diseaseCount = 0;
querySnapshot.forEach((document) => {
const hposTestData = document.data();
hposTests.push(hposTestData);
2023-07-07 09:01:35 +05:30
const { result } = hposTestData;
2023-10-28 12:52:00 +05:30
const { classificationResult } = hposTestData;
if (result === "NORMAL" || classificationResult === 'Normal') {
normalCount++;
}
2023-10-28 12:52:00 +05:30
if (result === 'SICKLECELLTRAIT' || classificationResult === 'Sickle Cell Trait') {
2023-07-07 08:48:14 +05:30
traitCount++;
}
2023-10-28 12:52:00 +05:30
if (result === 'SICKLECELLDISEASE' || classificationResult === 'Sickle Cell Disease') {
2023-07-07 08:48:14 +05:30
diseaseCount++;
}
});
2023-11-11 15:51:18 +05:30
setNormal(normalCached + normalCount);
2023-07-26 15:35:17 +05:30
// setPositives(traitCount + diseaseCount);
2023-11-11 15:51:18 +05:30
setTraits(traitsCached + traitCount);
setDiseases(diseasesCached + diseaseCount);
setLastUpdate(moment());
2023-07-07 08:48:14 +05:30
});
2023-07-26 15:35:17 +05:30
return () => unsub;
}, []);
2023-07-05 07:12:43 +05:30
return (
<div>
2023-07-26 15:49:51 +05:30
<div className='dashboard-title'>
2023-07-26 15:35:17 +05:30
<img className="nscm-logo" src={require('./logo_nobg.png')} alt='img' />
<div className='title-text'>HPOS Sickle Cell Test Dashboard</div>
2023-07-26 15:35:17 +05:30
<img className="gov-logo-1" src={require('./gov_logo2.png')} alt='img' />
<img className="gov-logo" src={require('./gov_logo3.png')} alt='img' />
<img className="gov-logo-3" src={require('./gov_logo4.png')} alt='img' />
</div>
2023-07-11 14:30:00 +05:30
2023-07-07 04:51:55 +05:30
<div className='cards-container'>
<div className='cards-row'>
<Card title={"Registration"} counter={totalScreened} color={'black'} backgroundColor={'rgb(254, 240, 227)'} />
2023-07-07 08:48:14 +05:30
<Card title={"Male"} counter={males} backgroundColor={'rgb(234, 240, 230)'} />
<Card title={"Female"} counter={females} backgroundColor={'rgb(234, 246, 245)'} />
2023-07-07 04:51:55 +05:30
</div>
<div className='cards-row'>
<Card title={"Normal"} counter={normal} backgroundColor={'rgb(192,233, 199)'} />
2023-07-07 08:48:14 +05:30
<Card title={"Trait"} counter={traits} backgroundColor={'rgb(237, 190, 190)'} />
<Card title={"Disease"} counter={diseases} backgroundColor={'rgb(249, 195, 195)'} />
2023-07-07 04:51:55 +05:30
</div>
2023-07-20 19:29:37 +05:30
</div>
2023-07-20 19:29:37 +05:30
<div className='footer'>
2023-07-26 15:35:17 +05:30
<div className='last-update'>
Updated at: {moment(lastUpdate).format("DD-MM-YYYY hh:mm:ss a")}
</div>
2023-07-11 14:30:00 +05:30
2023-07-26 15:35:17 +05:30
<div className='developer' onClick={() => setDevMode(!devMode)}>
Developed by <img className="dev-logo" alt='img' src={require('./smi-logo-120x120.webp')} /> ShanMukha
</div>
2023-07-21 08:20:39 +05:30
2023-07-26 15:35:17 +05:30
{/* {devMode &&
2023-07-21 08:20:39 +05:30
<div>dev mode is on</div>} */}
2023-07-26 15:35:17 +05:30
</div>
</div>
);
}
export default App;