added DME, fixed sync and bugs. Rewrote setDisplay logic

This commit is contained in:
PxlLoewe
2025-05-19 22:23:15 -07:00
parent 46c58ae127
commit 61e7caf6c8
23 changed files with 776 additions and 242 deletions

View File

@@ -107,7 +107,7 @@ const AircraftPopupContent = ({
return missions?.find(
(m) =>
(m.state === "running" || m.state === "draft") &&
m.missionStationIds.includes(aircraft.Station.id.toString()),
m.missionStationIds.includes(aircraft.Station.id),
);
}, [missions, aircraft.Station.id]);

View File

@@ -16,6 +16,7 @@ import {
Trash,
User,
SmartphoneNfc,
CheckCheck,
} from "lucide-react";
import {
getPublicUser,
@@ -23,15 +24,18 @@ import {
MissionLog,
MissionMessageLog,
Prisma,
Station,
} from "@repo/db";
import { usePannelStore } from "_store/pannelStore";
import { useSession } from "next-auth/react";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import {
deleteMissionAPI,
editMissionAPI,
sendMissionAPI,
} from "querys/missions";
import { getConnectedAircraftsAPI } from "querys/aircrafts";
import { getStationsAPI } from "querys/stations";
const Einsatzdetails = ({ mission }: { mission: Mission }) => {
const queryClient = useQueryClient();
@@ -58,6 +62,22 @@ const Einsatzdetails = ({ mission }: { mission: Mission }) => {
});
},
});
const editMissionMutation = useMutation({
mutationKey: ["missions"],
mutationFn: ({
id,
mission,
}: {
id: number;
mission: Prisma.MissionUpdateInput;
}) => editMissionAPI(id, mission),
onSuccess: () => {
toast.success("Gespeichert");
queryClient.invalidateQueries({
queryKey: ["missions"],
});
},
});
const { setMissionFormValues, setOpen } = usePannelStore((state) => state);
return (
<div className="p-4 text-base-content">
@@ -66,28 +86,48 @@ const Einsatzdetails = ({ mission }: { mission: Mission }) => {
<Flag /> Einsatzdetails
</h2>
{mission.state !== "draft" && (
<div
className="tooltip tooltip-primary tooltip-left font-semibold"
data-tip="Einsatzdaten übernehmen"
>
<button
className="btn btn-xs btn-primary btn-dash flex items-center gap-2"
onClick={() => {
setMissionFormValues({
...mission,
id: undefined,
hpgAmbulanceState: null,
hpgFireEngineState: null,
hpgPoliceState: null,
hpgLocationLat: undefined,
hpgLocationLng: undefined,
state: "draft",
});
setOpen(true);
}}
<div className="space-x-2">
<div
className="tooltip tooltip-primary tooltip-left font-semibold"
data-tip="Einsatzdaten übernehmen"
>
<Repeat2 size={16} />
</button>
<button
className="btn btn-xs btn-primary btn-dash flex items-center gap-2"
onClick={() => {
setMissionFormValues({
...mission,
id: undefined,
hpgAmbulanceState: null,
hpgFireEngineState: null,
hpgPoliceState: null,
hpgLocationLat: undefined,
hpgLocationLng: undefined,
state: "draft",
});
setOpen(true);
}}
>
<Repeat2 size={16} />
</button>
</div>
<div
className="tooltip tooltip-warning tooltip-left font-semibold z-[9999]"
data-tip="Einsatz abschließen"
>
<button
className="btn btn-xs btn-warning flex items-center gap-2"
onClick={() => {
editMissionMutation.mutate({
id: mission.id,
mission: {
state: "finished",
},
});
}}
>
<CheckCheck size={16} />
</button>
</div>
</div>
)}
</div>
@@ -177,46 +217,84 @@ const Patientdetails = ({ mission }: { mission: Mission }) => {
};
const Rettungsmittel = ({ mission }: { mission: Mission }) => {
/* const [stations, setStations] = useState<Station[]>([]);
useEffect(() => {
getStations().then((data) => {
setStations(data);
});
}, []); */
// Mockup data
const mockupData = [
{ bosCallsign: "Christoph 31", FMSstatus: 2, min: 6 },
{ bosCallsign: "RTW", FMSstatus: 3, min: 2 },
{ bosCallsign: "Polizei", FMSstatus: 4, min: 0 },
];
const { data: conenctedAircrafts } = useQuery({
queryKey: ["aircrafts"],
queryFn: getConnectedAircraftsAPI,
});
const { data: stations } = useQuery({
queryKey: ["mission", "stations-mission", mission.id],
queryFn: () =>
getStationsAPI({
id: {
in: mission.missionStationIds,
},
}),
});
const sendAlertMutation = useMutation({
mutationKey: ["missions"],
mutationFn: sendMissionAPI,
onError: (error) => {
console.error(error);
toast.error("Fehler beim Alarmieren");
},
onSuccess: (data) => {
toast.success(data.message);
},
});
return (
<div className="p-4 text-base-content">
<h2 className="flex items-center gap-2 text-lg font-bold mb-3">
<SmartphoneNfc /> Rettungsmittel
</h2>
<div className="flex items-center w-full justify-between">
<h2 className="flex items-center gap-2 text-lg font-bold mb-3">
<SmartphoneNfc /> Rettungsmittel
</h2>
<div
className="tooltip tooltip-primary tooltip-left font-semibold"
data-tip="Einsatz erneut alarmieren"
>
<button
className="btn btn-xs btn-primary btn-outline"
onClick={() => {
sendAlertMutation.mutate(mission.id);
}}
>
<BellRing size={16} />
</button>
</div>
</div>
<ul className="space-y-2 max-h-[300px] overflow-y-auto overflow-x-auto">
{mockupData.map((item, index) => (
<li key={index} className="flex items-center gap-2">
<span
className="font-bold text-base"
style={{
color: FMS_STATUS_TEXT_COLORS[item.FMSstatus],
}}
>
{item.FMSstatus}
</span>
<span className="text-base-content">
<span className="font-bold">{item.bosCallsign}</span>
{item.min > 0 && (
<>
<br />
Ankunft in ca. {item.min} min
</>
{stations?.map((station, index) => {
const connectedAircraft = conenctedAircrafts?.find(
(aircraft) => aircraft.stationId === station.id,
);
return (
<li key={index} className="flex items-center gap-2">
{connectedAircraft && (
<span
className="font-bold text-base"
style={{
color: FMS_STATUS_TEXT_COLORS[connectedAircraft.fmsStatus],
}}
>
{connectedAircraft.fmsStatus}
</span>
)}
</span>
</li>
))}
<span className="text-base-content">
<div>
<span className="font-bold">{station.bosCallsign}</span>
{/* {item.min > 0 && (
<>
<br />
Ankunft in ca. {item.min} min
</>
)} */}
</div>
</span>
</li>
);
})}
</ul>
<div className="divider mt-0 mb-0" />
<div className="flex items-center gap-2">