111 lines
2.5 KiB
TypeScript
111 lines
2.5 KiB
TypeScript
import { popup } from "leaflet";
|
|
import { create } from "zustand";
|
|
|
|
interface MapStore {
|
|
contextMenu: {
|
|
lat: number;
|
|
lng: number;
|
|
} | null;
|
|
map: {
|
|
center: L.LatLngExpression;
|
|
zoom: number;
|
|
};
|
|
openMissionMarker: {
|
|
id: number;
|
|
tab: "home" | "details" | "patient" | "log";
|
|
}[];
|
|
setOpenMissionMarker: (mission: {
|
|
open: MapStore["openMissionMarker"];
|
|
close: number[];
|
|
}) => void;
|
|
openAircraftMarker: {
|
|
id: string;
|
|
tab: "home" | "fms" | "aircraft" | "mission" | "chat";
|
|
}[];
|
|
setOpenAircraftMarker: (aircraft: {
|
|
open: MapStore["openAircraftMarker"];
|
|
close: string[];
|
|
}) => void;
|
|
searchElements: {
|
|
id: number;
|
|
nodes: {
|
|
lat: number;
|
|
lon: number;
|
|
}[];
|
|
tags?: {
|
|
"addr:country"?: string;
|
|
"addr:city"?: string;
|
|
"addr:housenumber"?: string;
|
|
"addr:postcode"?: string;
|
|
"addr:street"?: string;
|
|
"addr:suburb"?: string;
|
|
building?: string;
|
|
};
|
|
type: string;
|
|
}[];
|
|
setSearchElements: (elements: MapStore["searchElements"]) => void;
|
|
setContextMenu: (popup: MapStore["contextMenu"]) => void;
|
|
searchPopup: {
|
|
lat: number;
|
|
lng: number;
|
|
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<MapStore>((set, get) => ({
|
|
openMissionMarker: [],
|
|
setOpenMissionMarker: ({ open, close }) => {
|
|
const oldMarkers = get().openMissionMarker.filter(
|
|
(m) => !close.includes(m.id) && !open.find((o) => o.id === m.id),
|
|
);
|
|
set(() => ({
|
|
openMissionMarker: [...oldMarkers, ...open],
|
|
}));
|
|
},
|
|
openAircraftMarker: [],
|
|
setOpenAircraftMarker: ({ open, close }) => {
|
|
const oldMarkers = get().openAircraftMarker.filter(
|
|
(m) => !close.includes(m.id) && !open.find((o) => o.id === m.id),
|
|
);
|
|
set(() => ({
|
|
openAircraftMarker: [...oldMarkers, ...open],
|
|
}));
|
|
},
|
|
map: {
|
|
center: [51.5, 10.5],
|
|
zoom: 6,
|
|
},
|
|
searchPopup: null,
|
|
searchElements: [],
|
|
setSearchPopup: (popup) =>
|
|
set((state) => ({
|
|
searchPopup: popup,
|
|
})),
|
|
contextMenu: null,
|
|
setContextMenu: (contextMenu) =>
|
|
set((state) => ({
|
|
contextMenu,
|
|
})),
|
|
setSearchElements: (elements) =>
|
|
set((state) => ({
|
|
searchElements: elements,
|
|
})),
|
|
aircraftTabs: {},
|
|
setAircraftTab: (aircraftId, tab) =>
|
|
set((state) => ({
|
|
aircraftTabs: {
|
|
...state.aircraftTabs,
|
|
[aircraftId]: tab,
|
|
},
|
|
})),
|
|
missionTabs: {},
|
|
}));
|