From 9209b78b89a8cc8c44bb3e93c7652fffe64f1903 Mon Sep 17 00:00:00 2001 From: nocnico Date: Mon, 21 Apr 2025 01:22:48 +0200 Subject: [PATCH] Add tabs to aircraft popup --- apps/dispatch/app/_store/mapStore.ts | 15 +++++ .../_components/map/AircraftMarker.tsx | 62 ++++++++++++++++--- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/apps/dispatch/app/_store/mapStore.ts b/apps/dispatch/app/_store/mapStore.ts index f13b0c84..c2b1bbf4 100644 --- a/apps/dispatch/app/_store/mapStore.ts +++ b/apps/dispatch/app/_store/mapStore.ts @@ -51,6 +51,13 @@ interface MapStore { elementId: number; } | null; setSearchPopup: (popup: MapStore["searchPopup"]) => void; + aircraftTabs: { + [aircraftId: string]: "home" | "fms" | "aircraft" | "mission" | "chat"; + }; + setAircraftTab: ( + aircraftId: string, + tab: MapStore["aircraftTabs"][string], + ) => void; } export const useMapStore = create((set, get) => ({ @@ -91,4 +98,12 @@ export const useMapStore = create((set, get) => ({ set((state) => ({ searchElements: elements, })), + aircraftTabs: {}, + setAircraftTab: (aircraftId, tab) => + set((state) => ({ + aircraftTabs: { + ...state.aircraftTabs, + [aircraftId]: tab, + }, + })), })); diff --git a/apps/dispatch/app/dispatch/_components/map/AircraftMarker.tsx b/apps/dispatch/app/dispatch/_components/map/AircraftMarker.tsx index 9e3d1483..26bd8475 100644 --- a/apps/dispatch/app/dispatch/_components/map/AircraftMarker.tsx +++ b/apps/dispatch/app/dispatch/_components/map/AircraftMarker.tsx @@ -2,7 +2,14 @@ import { Aircraft, useAircraftsStore } from "_store/aircraftsStore"; import { Marker, Popup, useMap } from "react-leaflet"; import { DivIcon, Marker as LMarker, Popup as LPopup } from "leaflet"; import { useMapStore } from "_store/mapStore"; -import { Fragment, useCallback, useEffect, useRef, useState } from "react"; +import { + Fragment, + useCallback, + useEffect, + useRef, + useState, + useMemo, +} from "react"; import { cn } from "helpers/cn"; import { ChevronsRightLeft, @@ -41,6 +48,38 @@ export const FMS_STATUS_TEXT_COLORS: { [key: string]: string } = { }; const AircraftPopupContent = ({ aircraft }: { aircraft: Aircraft }) => { + const setAircraftTab = useMapStore((state) => state.setAircraftTab); + const currentTab = useMapStore( + (state) => state.aircraftTabs[aircraft.id] || "home", + ); + + // Memoize the tab change handler to avoid unnecessary re-renders + const handleTabChange = useCallback( + (tab: "home" | "fms" | "aircraft" | "mission" | "chat") => { + if (currentTab !== tab) { + setAircraftTab(aircraft.id, tab); + } + }, + [currentTab, aircraft.id, setAircraftTab], + ); + + const renderTabContent = useMemo(() => { + switch (currentTab) { + case "home": + return
Home Content
; + case "fms": + return
FMS Content
; + case "aircraft": + return
Aircraft Content
; + case "mission": + return
Mission Content
; + case "chat": + return
Chat Content
; + default: + return
Default Content
; + } + }, [currentTab]); + const setOpenAircraftMarker = useMapStore( (state) => state.setOpenAircraftMarker, ); @@ -88,15 +127,16 @@ const AircraftPopupContent = ({ aircraft }: { aircraft: Aircraft }) => { }} >
handleTabChange("home")} >
{
handleTabChange("fms")} > {aircraft.fmsStatus}
handleTabChange("aircraft")} > - {/* {aircraft.bosName} */} Christophorus 1 + Christophorus 1
RTH
handleTabChange("mission")} > Einsatz
__202504161
handleTabChange("chat")} >
-
test
+
{renderTabContent}
); };