Skip to content

Commit ac1f7e4

Browse files
committed
feat: workin it
1 parent d82bfcf commit ac1f7e4

File tree

16 files changed

+258
-598
lines changed

16 files changed

+258
-598
lines changed

src/App.tsx

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
import { Box } from "@chakra-ui/react";
2+
import { Layer } from "@deck.gl/core";
3+
import { useState } from "react";
24
import "./app.css";
3-
import Map from "./components/map";
5+
import { Map } from "./components/map";
46
import Overlay from "./components/overlay";
5-
import { StacProvider } from "./components/stac/provider";
67
import { Toaster } from "./components/ui/toaster";
78

89
function App() {
10+
const [layers, setLayers] = useState<Layer[]>([]);
11+
912
return (
10-
<StacProvider>
11-
<Box
12-
style={{
13-
position: "absolute",
14-
top: 0,
15-
left: 0,
16-
zIndex: 0,
17-
}}
18-
>
19-
<Map></Map>
13+
<>
14+
<Box position={"absolute"} top={0} left={0} zIndex={0}>
15+
<Map layers={layers}></Map>
2016
</Box>
21-
<Box style={{ zIndex: 1 }}>
22-
<Overlay></Overlay>
17+
<Box zIndex={1}>
18+
<Overlay setLayers={setLayers}></Overlay>
2319
</Box>
2420
<Toaster></Toaster>
25-
</StacProvider>
21+
</>
2622
);
2723
}
2824

src/components/footer.tsx

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/components/header.tsx

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,52 @@
11
import {
22
Button,
3-
Group,
43
HStack,
54
Input,
5+
InputGroup,
66
Menu,
77
Portal,
8-
type MenuSelectionDetails,
98
} from "@chakra-ui/react";
10-
import { useState } from "react";
11-
import { useStacDispatch } from "./stac/hooks";
12-
import { ColorModeButton } from "./ui/color-mode";
9+
import { type Dispatch, type SetStateAction } from "react";
10+
import { LuSearch } from "react-icons/lu";
1311

14-
export default function Header() {
15-
const [href, setHref] = useState<string>("");
16-
const dispatch = useStacDispatch();
17-
18-
async function onSelectExample(details: MenuSelectionDetails) {
19-
setHref(details.value);
20-
dispatch({ type: "set-href", href: details.value });
21-
}
12+
const EXAMPLES = [
13+
["eoAPI DevSeed", "https://stac.eoapi.dev/"],
14+
[
15+
"Microsoft Planetary Computer",
16+
"https://planetarycomputer.microsoft.com/api/stac/v1",
17+
],
18+
[
19+
"Simple item",
20+
"https://raw.githubusercontent.com/radiantearth/stac-spec/refs/heads/master/examples/simple-item.json",
21+
],
22+
];
2223

24+
export default function Header({
25+
setHref,
26+
}: {
27+
setHref: Dispatch<SetStateAction<string>>;
28+
}) {
2329
return (
24-
<HStack spaceX={2} pointerEvents={"auto"}>
25-
<Group
26-
attached
27-
w={"full"}
28-
as={"form"}
29-
onSubmit={async (e) => {
30-
e.preventDefault();
31-
dispatch({ type: "set-href", href });
32-
}}
33-
>
34-
<Input
35-
variant={"subtle"}
36-
flex={"1"}
37-
value={href}
38-
onChange={(e) => setHref(e.currentTarget.value)}
39-
></Input>
40-
<Button
41-
variant={"outline"}
42-
bg={"bg.subtle"}
43-
type={"submit"}
44-
hideBelow={"md"}
45-
>
46-
Load
47-
</Button>
48-
</Group>
49-
<Menu.Root onSelect={onSelectExample}>
30+
<HStack py={4} pointerEvents={"auto"}>
31+
<InputGroup w="full" startElement={<LuSearch></LuSearch>}>
32+
<Input flex={1} variant={"subtle"} rounded={4}></Input>
33+
</InputGroup>
34+
<Menu.Root onSelect={(details) => setHref(details.value)}>
5035
<Menu.Trigger asChild>
51-
<Button variant={"subtle"}>Examples</Button>
36+
<Button variant={"surface"}>Examples</Button>
5237
</Menu.Trigger>
5338
<Portal>
5439
<Menu.Positioner>
5540
<Menu.Content>
56-
<Menu.Item value="https://stac.eoapi.dev/">
57-
eoAPI DevSeed STAC
58-
</Menu.Item>
59-
<Menu.Item value="https://planetarycomputer.microsoft.com/api/stac/v1">
60-
Microsoft Planetary Computer
61-
</Menu.Item>
62-
<Menu.Item value="https://raw.githubusercontent.com/developmentseed/labs-375-stac-geoparquet-backend/refs/heads/main/data/naip.parquet">
63-
Colorado NAIP
64-
</Menu.Item>
41+
{EXAMPLES.map(([text, href], index) => (
42+
<Menu.Item key={"example-" + index} value={href}>
43+
{text}
44+
</Menu.Item>
45+
))}
6546
</Menu.Content>
6647
</Menu.Positioner>
6748
</Portal>
6849
</Menu.Root>
69-
<ColorModeButton></ColorModeButton>
7050
</HStack>
7151
);
7252
}

src/components/map.tsx

Lines changed: 2 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import { Layer, type DeckProps } from "@deck.gl/core";
22
import { MapboxOverlay } from "@deck.gl/mapbox";
3-
import { GeoArrowPolygonLayer } from "@geoarrow/deck.gl-layers";
4-
import { GeoJsonLayer } from "deck.gl";
53
import "maplibre-gl/dist/maplibre-gl.css";
6-
import { useEffect, useRef, useState } from "react";
4+
import { useRef } from "react";
75
import {
86
Map as MaplibreMap,
97
useControl,
108
type MapRef,
119
} from "react-map-gl/maplibre";
12-
import { useStac } from "./stac/hooks";
1310
import { useColorModeValue } from "./ui/color-mode";
1411

1512
function DeckGLOverlay(props: DeckProps) {
@@ -18,78 +15,13 @@ function DeckGLOverlay(props: DeckProps) {
1815
return <></>;
1916
}
2017

21-
export default function Map() {
22-
const { table, bbox, geojson } = useStac();
23-
const [tableLayer, setTableLayer] = useState<GeoArrowPolygonLayer>();
24-
const [geoJsonLayer, setGeoJsonLayer] = useState<Layer>();
25-
const [layers, setLayers] = useState<Layer[]>([]);
18+
export function Map({ layers }: { layers: Layer[] }) {
2619
const mapRef = useRef<MapRef>(null);
2720
const mapStyle = useColorModeValue(
2821
"positron-gl-style",
2922
"dark-matter-gl-style"
3023
);
3124

32-
useEffect(() => {
33-
if (table) {
34-
const layer = new GeoArrowPolygonLayer({
35-
id: "geoarrow-polygons",
36-
data: table,
37-
stroked: true,
38-
filled: true,
39-
getFillColor: () => {
40-
return [207, 63, 2, 100];
41-
},
42-
pickable: true,
43-
autoHighlight: true,
44-
highlightColor: [252, 192, 38],
45-
});
46-
setTableLayer(layer);
47-
} else {
48-
setTableLayer(undefined);
49-
}
50-
}, [table]);
51-
52-
useEffect(() => {
53-
if (bbox) {
54-
if (mapRef.current) {
55-
mapRef.current.fitBounds(
56-
[
57-
[bbox[0], bbox[1]],
58-
[bbox[2], bbox[3]],
59-
],
60-
{ padding: 100 }
61-
);
62-
}
63-
}
64-
}, [bbox]);
65-
66-
useEffect(() => {
67-
if (geojson) {
68-
const layer = new GeoJsonLayer({
69-
id: "geojson",
70-
data: geojson,
71-
stroked: false,
72-
filled: true,
73-
pickable: true,
74-
getFillColor: [160, 160, 180, 200],
75-
});
76-
setGeoJsonLayer(layer);
77-
} else {
78-
setGeoJsonLayer(undefined);
79-
}
80-
}, [geojson]);
81-
82-
useEffect(() => {
83-
const layers = [];
84-
if (geoJsonLayer) {
85-
layers.push(geoJsonLayer);
86-
}
87-
if (tableLayer) {
88-
layers.push(tableLayer);
89-
}
90-
setLayers(layers);
91-
}, [geoJsonLayer, tableLayer]);
92-
9325
return (
9426
<MaplibreMap
9527
ref={mapRef}

src/components/overlay.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import { Container } from "@chakra-ui/react";
2-
import Footer from "./footer";
2+
import type { Layer } from "@deck.gl/core";
3+
import { useState, type Dispatch, type SetStateAction } from "react";
34
import Header from "./header";
4-
import Panel from "./panel";
5+
import { Panel } from "./panel";
56

6-
export default function Overlay() {
7+
export default function Overlay({
8+
setLayers,
9+
}: {
10+
setLayers: Dispatch<SetStateAction<Layer[]>>;
11+
}) {
12+
const [href, setHref] = useState("");
713
return (
8-
<Container fluid py={2} h={"100vh"} pointerEvents={"none"}>
9-
<Header></Header>
10-
<Panel></Panel>
11-
<Footer></Footer>
14+
<Container fluid h={"100vh"} pointerEvents={"none"}>
15+
<Header setHref={setHref}></Header>
16+
<Panel href={href} setLayers={setLayers}></Panel>
1217
</Container>
1318
);
1419
}

0 commit comments

Comments
 (0)