From 133eee50fd84adeeb9f3383747a0497abf190802 Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Wed, 26 Mar 2025 22:01:04 -0700 Subject: [PATCH] Added Marker for mission --- .../(dispatch)/_components/map/BaseMaps.tsx | 6 +- .../app/(dispatch)/_components/map/Map.tsx | 2 + .../_components/map/MissionMarkers.tsx | 72 ++++++++++++++++++ apps/dispatch/app/_store/missionsStore.ts | 30 ++------ apps/dispatch/app/globals.css | 21 +++++ apps/dispatch/public/icons/MissionIcon.png | Bin 0 -> 12263 bytes grafana/grafana.db | Bin 1122304 -> 1122304 bytes .../database/prisma/schema/mission.prisma | 24 ++++++ 8 files changed, 130 insertions(+), 25 deletions(-) create mode 100644 apps/dispatch/app/(dispatch)/_components/map/MissionMarkers.tsx create mode 100644 apps/dispatch/public/icons/MissionIcon.png create mode 100644 packages/database/prisma/schema/mission.prisma diff --git a/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx b/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx index 938e95d0..e27759c2 100644 --- a/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx +++ b/apps/dispatch/app/(dispatch)/_components/map/BaseMaps.tsx @@ -7,7 +7,11 @@ export const BaseMaps = () => { + ); diff --git a/apps/dispatch/app/(dispatch)/_components/map/Map.tsx b/apps/dispatch/app/(dispatch)/_components/map/Map.tsx index 2552837d..caeec90b 100644 --- a/apps/dispatch/app/(dispatch)/_components/map/Map.tsx +++ b/apps/dispatch/app/(dispatch)/_components/map/Map.tsx @@ -4,6 +4,7 @@ import { useMapStore } from "_store/mapStore"; import { MapContainer } from "react-leaflet"; import { BaseMaps } from "(dispatch)/_components/map/BaseMaps"; import { ContextMenu } from "(dispatch)/_components/map/ContextMenu"; +import { MissionMarkers } from "(dispatch)/_components/map/MissionMarkers"; export default ({}) => { const { map } = useMapStore(); @@ -12,6 +13,7 @@ export default ({}) => { + ); }; diff --git a/apps/dispatch/app/(dispatch)/_components/map/MissionMarkers.tsx b/apps/dispatch/app/(dispatch)/_components/map/MissionMarkers.tsx new file mode 100644 index 00000000..5b7fe48d --- /dev/null +++ b/apps/dispatch/app/(dispatch)/_components/map/MissionMarkers.tsx @@ -0,0 +1,72 @@ +import { MissionOptionalDefaults } from "@repo/db/zod"; +import { useMissionsStore } from "_store/missionsStore"; +import { Icon, Marker as LMarker } from "leaflet"; +import { House, Route } from "lucide-react"; +import { RefObject, useEffect, useRef, useState } from "react"; +import { Marker, Popup, useMap } from "react-leaflet"; + +export const MissionMarker = ({ + mission, +}: { + mission: MissionOptionalDefaults; +}) => { + const [zoom, setZoom] = useState(0); + const map = useMap(); + const markerRef = useRef>(null); + + useEffect(() => { + markerRef.current?.openPopup(); + + const handleZoom = () => { + setZoom(map.getZoom()); + }; + map.on("zoom", handleZoom); + return () => { + map.off("zoom", handleZoom); + }; + }, [map]); + + return ( +
+ + +
+
+
+ +
+
+ +
+
+ {mission.missionCategory} +
+
+
+
+
+
+ ); +}; + +export const MissionMarkers = () => { + const { missions } = useMissionsStore(); + + return ( + <> + {missions.map((mission) => ( + + ))} + + ); +}; diff --git a/apps/dispatch/app/_store/missionsStore.ts b/apps/dispatch/app/_store/missionsStore.ts index 92379961..9e186a5c 100644 --- a/apps/dispatch/app/_store/missionsStore.ts +++ b/apps/dispatch/app/_store/missionsStore.ts @@ -1,27 +1,9 @@ +import { MissionOptionalDefaults } from "@repo/db/zod"; import { create } from "zustand"; -interface Mission { - id: string; - addressLat: number; - addressLng: number; - addressStreet: string; - addressCity: string; - addressZip: string; - missionCategory: string; - missionKeyword: string; - missionSummary: string; - missionPatientInfo: string; - missionAdditionalInfo: string; - hpgAmbulanceState?: "ready" | "arrived" | "onway"; - hpgFireEngineState?: "ready" | "arrived" | "onway"; - hpgPoliceState?: "ready" | "arrived" | "onway"; - hpgLocationLat?: number; - hpgLocationLng?: number; -} - interface MissionStore { - missions: Mission[]; - setMissions: (missions: Mission[]) => void; + missions: MissionOptionalDefaults[]; + setMissions: (missions: MissionOptionalDefaults[]) => void; } export const useMissionsStore = create((set) => ({ @@ -34,9 +16,9 @@ export const useMissionsStore = create((set) => ({ addressCity: "Berlin", addressZip: "10178", missionAdditionalInfo: "Additional info", - missionCategory: "Category", - missionKeyword: "Keyword", - missionPatientInfo: "Patient info", + missionCategory: "AB_Atmung", + missionKeyword: "Zunehmende Atemnot", + missionPatientInfo: "M/10", missionSummary: "Summary", }, ], diff --git a/apps/dispatch/app/globals.css b/apps/dispatch/app/globals.css index dca6a6c6..db106d6d 100644 --- a/apps/dispatch/app/globals.css +++ b/apps/dispatch/app/globals.css @@ -2,3 +2,24 @@ @plugin "daisyui" { themes: dark, nord; } + +.leaflet-popup-tip-container { + display: none; +} +.leaflet-popup-content-wrapper { + background: transparent !important; + pointer-events: none !important; +} + +.leaflet-popup-content { + width: 0 !important; + margin: 0 !important; +} +.leaflet-popup { + left: 0 !important; + top: 0 !important; +} + +.leaflet-popup-close-button { + display: none; +} diff --git a/apps/dispatch/public/icons/MissionIcon.png b/apps/dispatch/public/icons/MissionIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..6e508b2ed45c696297c210924c40991e953f0530 GIT binary patch literal 12263 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