Tones/hooks/useCallFeed/useCallFeed.jsx

175 lines
5 KiB
React
Raw Normal View History

2025-08-10 20:05:17 +00:00
import React, { useState, useEffect } from "react";
import { useDepartments } from "../useDepartments";
import {
C,
Cardiology,
Cpr,
FourByFour,
} from "healthicons-react-native/dist/outline";
import { useWebSocketContext } from "@/hooks";
const callIconMap = {
2025-08-10 20:05:17 +00:00
"CHEST PAIN|HEART PROBLEMS": Cardiology,
"CARDIAC ARREST|DEATH": Cpr,
"MOTOR VEHICLE COLLISION (MVC)": FourByFour,
};
// Squares
// Cariology - Heart
// BurnUnit - Fire
// AccidentAndEmergency - Misc.
// Rheumatology - Bone/Crash
// Sonography - Baby
// PainManagement - CPR/Cardiac Arrest
// Respiratory - Diff Breathing
// Others
// HeartOrgan - Heart
// Burn - Burns
// FHIR - Structure Fire
// Sonogram - Baby
// SUV - Crash
// Joints - Bone
// Pain - CPR/Cardiac Arrest
// Skull - CPR/Cardiac Arrest
// CPR - CPR/Cardiac Arrest
// Pneumonia - Diff Breathing
// CoughingAlt - Diff Breathing
// Diabetes - Diabetic Emergency
// BloodDrop - Bleeding Emergencies
// Bacteria - Sick
// RuralClinic - Medical Facility Response
2025-04-19 06:36:25 +00:00
const formatCallTimePast = (callValue) => {
2025-08-10 20:05:17 +00:00
const initDate = new Date(callValue);
const currentTime = new Date();
const timeDifference = currentTime - initDate;
const days = Math.floor(timeDifference / (1000 * 60 * 60 * 24));
const hours = Math.floor(
(timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
);
const minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((timeDifference % (1000 * 60)) / 1000);
if (days && days !== 0) {
return `${days} day${days === 1 ? "" : "s"} ago`;
} else if (hours && hours !== 0) {
return `${hours} hour${hours === 1 ? "" : "s"} ago`;
} else if (minutes && minutes !== 0) {
return `${minutes} minute${minutes === 1 ? "" : "s"} ago`;
} else if (seconds && seconds !== 0) {
return `${seconds} second${seconds === 1 ? "" : "s"} ago`;
}
return `Unknown Time Past`;
};
2025-04-19 06:36:25 +00:00
const formatCallDateTime = (callValue) => {
const initDate = new Date(callValue);
if (initDate) {
2025-08-10 20:05:17 +00:00
const formattedDate = `${initDate.toLocaleDateString("en-US", {
month: "short",
day: "numeric",
year: "numeric",
})}`;
2025-08-10 20:05:17 +00:00
const hours = initDate.getHours().toString().padStart(2, "0");
const minutes = initDate.getMinutes().toString().padStart(2, "0");
const formattedTime = `${hours}:${minutes}`;
2025-04-19 06:36:25 +00:00
return `${formattedDate} - ${formattedTime}`;
}
2025-08-10 20:05:17 +00:00
return "Date Unavailable";
};
const getIncidents = async (departments, incidentStatus) => {
let response;
try {
2025-08-12 16:19:05 +00:00
response = await fetch(`${process.env.EXPO_PUBLIC_DATABASE_URL}/getCallsParams`, {
method: "POST",
2025-08-10 20:05:17 +00:00
headers: {
2025-08-12 16:19:05 +00:00
apiKey: process.env.EXPO_PUBLIC_DATABASE_API_KEY,
"Content-Type": 'application/json'
2025-08-10 20:05:17 +00:00
},
2025-08-12 16:19:05 +00:00
body: JSON.stringify({
numCalls: 25,
departments,
status: incidentStatus
}),
2025-08-10 20:05:17 +00:00
});
2025-08-12 16:19:05 +00:00
console.log('response: ', response);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
2025-08-10 20:05:17 +00:00
} catch (e) {
console.error("Failed to fetch initial calls:", e);
}
return response?.json() || [];
};
2025-04-19 06:36:25 +00:00
export const useCallFeed = () => {
2025-08-10 20:05:17 +00:00
const departments = useDepartments();
const { lastMessage } = useWebSocketContext();
const [allCalls, setAllCalls] = useState([]);
const [init, setInit] = useState(true);
const { CallThemes, InitList } = departments?.accountDetails;
const { CriticalCallList, HighCallList, MediumCallList, LowCallList } =
CallThemes;
const [selectedStatus, setSelectedStatus] = useState({id: 'all', value: 'All Incidents'});
useEffect(() => {
2025-08-11 19:34:16 +00:00
async function fetchData() {
2025-08-12 16:19:05 +00:00
const incidents = await getIncidents(InitList?.map((dept) => { return dept?.deptId }), selectedStatus?.id);
2025-08-11 19:34:16 +00:00
setAllCalls(incidents);
setInit(false);
}
fetchData();
2025-08-10 20:05:17 +00:00
}, []);
useEffect(() => {
if (lastMessage && !init) {
const parsedMessage = JSON?.parse(lastMessage);
if (parsedMessage?.data) {
setAllCalls([...allCalls, parsedMessage]);
}
2025-08-10 20:05:17 +00:00
}
}, [lastMessage]);
2025-08-10 20:05:17 +00:00
useEffect(() => {
2025-08-11 19:34:16 +00:00
async function fetchData() {
2025-08-12 16:19:05 +00:00
const incidents = await getIncidents(InitList?.map((dept) => { return dept?.deptId }), selectedStatus?.id);
2025-08-10 20:05:17 +00:00
setAllCalls(incidents);
}
2025-08-11 19:34:16 +00:00
if (!init) {
fetchData();
}
2025-08-10 20:05:17 +00:00
}, [selectedStatus]);
const callColorSelector = (callAcuity, cardiacArrestCall, status) => {
2025-08-11 19:34:16 +00:00
if (status?.toLowerCase() === "closed") {
2025-08-10 20:05:17 +00:00
return "#0000CD";
2025-08-12 16:19:05 +00:00
} else if (CriticalCallList.some(critical => cardiacArrestCall.includes(critical))) {
2025-08-10 20:05:17 +00:00
return "#8B0000";
2025-08-12 16:19:05 +00:00
} else if (HighCallList.some(high => callAcuity.includes(high))) {
2025-08-10 20:05:17 +00:00
return "#FF0000";
2025-08-12 16:19:05 +00:00
} else if (MediumCallList.some(medium => callAcuity.includes(medium))) {
2025-08-10 20:05:17 +00:00
return "#FF8C00";
2025-08-12 16:19:05 +00:00
} else if (LowCallList.some(low => callAcuity.includes(low))) {
2025-08-10 20:05:17 +00:00
return "#228B22";
}
2025-08-10 20:05:17 +00:00
return "grey";
};
return {
departments,
callIconMap,
callDetails: allCalls,
callColorSelector,
formatCallTimePast,
formatCallDateTime,
selectedStatus,
setSelectedStatus
};
};