Skip to content

Commit 47bf3d9

Browse files
refactor: optimize amdb
1 parent 18733e8 commit 47bf3d9

File tree

4 files changed

+54
-36
lines changed

4 files changed

+54
-36
lines changed

examples/playground/src/MainWindow.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import MapPane from "./components/Map";
1+
import MapPane from "./components/map";
22

33
export default function MainWindow() {
44
return (
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { useRecoilValue } from "recoil";
2+
import { amdbLayersState } from "../../state/amdb";
3+
import { AmdbLayerName, getAmdbAPI } from "@navigraph/amdb";
4+
import { userState } from "../../state/user";
5+
import { Scope } from "@navigraph/app";
6+
import { memo } from "react";
7+
import { useQuery } from "@tanstack/react-query";
8+
import { GeoJSON, Popup } from "react-leaflet";
9+
10+
const AmdbLayer = memo(({ idarpt, layer, amdb }: { idarpt: string, layer: AmdbLayerName, amdb: ReturnType<typeof getAmdbAPI> }) => {
11+
const { data } = useQuery({
12+
queryKey: ['amdb-data', idarpt, layer],
13+
queryFn: async () => {
14+
return amdb.getAmdbLayer({ icao: idarpt, layer })
15+
}
16+
})
17+
18+
if (!data) return null;
19+
20+
return (
21+
<GeoJSON data={data}>
22+
<Popup>
23+
{layer}
24+
</Popup>
25+
</GeoJSON>
26+
)
27+
});
28+
29+
export default function AmdbManager() {
30+
const amdbLayers = useRecoilValue(amdbLayersState);
31+
32+
const user = useRecoilValue(userState);
33+
34+
if (!user?.scope.includes(Scope.AMDB)) return;
35+
36+
const amdb = getAmdbAPI();
37+
38+
return amdbLayers.map(([idarpt, layers]) => <>
39+
<AmdbLayer key={`${idarpt}/aerodromereferencepoint`} amdb={amdb} idarpt={idarpt} layer="aerodromereferencepoint" />
40+
{layers.map((layer) => <AmdbLayer key={`${idarpt}/${layer}`} amdb={amdb} idarpt={idarpt} layer={layer} />)}
41+
</>)
42+
}

examples/playground/src/components/Map.tsx renamed to examples/playground/src/components/map/index.tsx

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
1-
import { MapContainer, useMap, TileLayer, ImageOverlay, GeoJSON, Popup } from "react-leaflet";
2-
import { memo, useEffect, useMemo, useRef } from "react";
1+
import { MapContainer, useMap, TileLayer, ImageOverlay } from "react-leaflet";
2+
import { useEffect, useMemo, useRef } from "react";
33
import { LatLngBounds, Map } from "leaflet";
44
import { useRecoilState, useRecoilValue } from "recoil";
5-
import { appState } from "../state/app";
5+
import { appState } from "../../state/app";
66
import { NavigraphRasterSource, NavigraphTheme, NavigraphTileLayer, PresetConfig } from "@navigraph/leaflet";
7-
import { userState } from "../state/user";
7+
import { userState } from "../../state/user";
88
import { NavigraphAuth } from "@navigraph/auth";
99
import { Scope } from "@navigraph/app";
1010

1111
import "leaflet/dist/leaflet.css"
12-
import { mapFaaState, mapSourceState, mapTacState, mapThemeState } from "../state/mapStyle";
13-
import { chartOverlayOpacityState, chartOverlayState } from "../state/chartOverlay";
12+
import { mapFaaState, mapSourceState, mapTacState, mapThemeState } from "../../state/mapStyle";
13+
import { chartOverlayOpacityState, chartOverlayState } from "../../state/chartOverlay";
1414
import { calculateChartBounds } from "@navigraph/charts";
1515
import { useQuery } from "@tanstack/react-query";
16-
import { protectedPage } from "./protectedPage";
16+
import { protectedPage } from "../protectedPage";
1717
import { TbCircleX } from "react-icons/tb";
18-
import Button from "./Button";
19-
import { AmdbLayerName } from "@navigraph/amdb";
20-
import { amdbLayersState } from "../state/amdb";
18+
import Button from "../Button";
19+
import AmdbManager from "./amdb";
2120

2221
export function createPreset(source: NavigraphRasterSource, theme: NavigraphTheme, faa: boolean, tac: boolean): PresetConfig {
2322
if (source === 'WORLD') {
@@ -30,27 +29,6 @@ export function createPreset(source: NavigraphRasterSource, theme: NavigraphThem
3029
return { source, theme, type: faa ? 'FAA' : 'Navigraph' }
3130
}
3231

33-
const AmdbLayer = protectedPage<{ idarpt: string, layers: AmdbLayerName[] }, [Scope.AMDB]>(memo(({ idarpt, layers, amdb }) => {
34-
const { data } = useQuery({
35-
queryKey: ['amdb-data', idarpt, layers],
36-
queryFn: async () => {
37-
return amdb.getAmdbLayers({ icao: idarpt, include: ['aerodromereferencepoint', ...layers] })
38-
}
39-
})
40-
41-
if (!data) return null;
42-
43-
return (
44-
Object.entries(data).map(([layerName, data]) =>
45-
<GeoJSON data={data}>
46-
<Popup>
47-
{layerName}
48-
</Popup>
49-
</GeoJSON>
50-
)
51-
)
52-
}), [Scope.AMDB]);
53-
5432
const ChartOverlay = protectedPage(({ charts }) => {
5533
const theme = useRecoilValue(mapThemeState);
5634

@@ -153,8 +131,6 @@ export default function MapPane() {
153131
const app = useRecoilValue(appState);
154132
const user = useRecoilValue(userState);
155133

156-
const amdbLayers = useRecoilValue(amdbLayersState);
157-
158134
return (
159135
<div className='w-full'>
160136
<MapContainer center={[51.505, -0.09]} zoom={13} className='h-screen' zoomControl={false} ref={mapRef} whenReady={() => {
@@ -170,7 +146,7 @@ export default function MapPane() {
170146
/>
171147
)}
172148
<ChartOverlay />
173-
{amdbLayers.map((layer) => <AmdbLayer key={layer[0]} idarpt={layer[0]} layers={layer[1]} />)}
149+
<AmdbManager />
174150
</MapContainer>
175151
</div>
176152
)

examples/playground/src/pages/Tiles.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Button from "../components/Button";
33
import { mapFaaState, mapSourceState, mapTacState, mapThemeState } from "../state/mapStyle";
44
import { FaMoon, FaSun } from "react-icons/fa";
55
import JsonView from "../components/JsonView";
6-
import { createPreset } from "../components/Map";
6+
import { createPreset } from "../components/map";
77
import { protectedPage } from "../components/protectedPage";
88
import { Scope } from "@navigraph/app";
99

0 commit comments

Comments
 (0)