|
1 | | -import { DataList, SimpleGrid, Tabs, Text } from "@chakra-ui/react"; |
2 | | -import { LuFolder, LuFolderMinus } from "react-icons/lu"; |
| 1 | +import { |
| 2 | + Card, |
| 3 | + DataList, |
| 4 | + Heading, |
| 5 | + IconButton, |
| 6 | + Image, |
| 7 | + Link, |
| 8 | + SimpleGrid, |
| 9 | + Stack, |
| 10 | + Tabs, |
| 11 | + Wrap, |
| 12 | +} from "@chakra-ui/react"; |
| 13 | +import { useEffect, useState } from "react"; |
| 14 | +import { |
| 15 | + LuExternalLink, |
| 16 | + LuFolder, |
| 17 | + LuFolderMinus, |
| 18 | + LuInfo, |
| 19 | +} from "react-icons/lu"; |
| 20 | +import type { StacItem } from "stac-ts"; |
3 | 21 | import type { StacGeoparquetMetadata } from "./stac-geoparquet/context"; |
4 | 22 | import { useStacGeoparquet } from "./stac-geoparquet/hooks"; |
5 | 23 |
|
6 | | -function Info({ |
7 | | - metadata, |
8 | | - id, |
9 | | -}: { |
10 | | - metadata?: StacGeoparquetMetadata; |
11 | | - id?: string; |
12 | | -}) { |
13 | | - if (metadata) { |
14 | | - return ( |
| 24 | +function Metadata({ metadata }: { metadata: StacGeoparquetMetadata }) { |
| 25 | + return ( |
| 26 | + <DataList.Root orientation={"horizontal"} size={"sm"}> |
| 27 | + <DataList.Item> |
| 28 | + <DataList.ItemLabel>Count</DataList.ItemLabel> |
| 29 | + <DataList.ItemValue>{metadata.count}</DataList.ItemValue> |
| 30 | + </DataList.Item> |
| 31 | + </DataList.Root> |
| 32 | + ); |
| 33 | +} |
| 34 | + |
| 35 | +function Item({ item }: { item: StacItem }) { |
| 36 | + return ( |
| 37 | + <Stack> |
15 | 38 | <DataList.Root orientation={"horizontal"} size={"sm"}> |
16 | 39 | <DataList.Item> |
17 | | - <DataList.ItemLabel>Count</DataList.ItemLabel> |
18 | | - <DataList.ItemValue>{metadata.count}</DataList.ItemValue> |
| 40 | + <DataList.ItemLabel>ID</DataList.ItemLabel> |
| 41 | + <DataList.ItemValue>{item.id}</DataList.ItemValue> |
19 | 42 | </DataList.Item> |
20 | 43 | <DataList.Item> |
21 | | - <DataList.ItemLabel>Active item</DataList.ItemLabel> |
22 | | - <DataList.ItemValue>{id || "none"}</DataList.ItemValue> |
| 44 | + <DataList.ItemLabel>STAC version</DataList.ItemLabel> |
| 45 | + <DataList.ItemValue>{item.stac_version}</DataList.ItemValue> |
23 | 46 | </DataList.Item> |
24 | 47 | </DataList.Root> |
25 | | - ); |
26 | | - } else { |
27 | | - return <Text>No file loaded...</Text>; |
28 | | - } |
| 48 | + |
| 49 | + <Heading size={"sm"} mt={4}> |
| 50 | + Assets |
| 51 | + </Heading> |
| 52 | + |
| 53 | + <Wrap> |
| 54 | + {Object.entries(item.assets).map(([key, asset]) => { |
| 55 | + // TODO make this configurable |
| 56 | + const showImage = |
| 57 | + asset.type && ["image/jpeg", "image/png"].includes(asset.type); |
| 58 | + return ( |
| 59 | + <Card.Root key={item.id + key} size={"sm"}> |
| 60 | + <Card.Header>{key}</Card.Header> |
| 61 | + <Card.Body> |
| 62 | + {asset.title && <Card.Title>{asset.title}</Card.Title>} |
| 63 | + {asset.description && ( |
| 64 | + <Card.Description>{asset.description}</Card.Description> |
| 65 | + )} |
| 66 | + {showImage && <Image src={asset.href} maxH={200} />} |
| 67 | + </Card.Body> |
| 68 | + <Card.Footer> |
| 69 | + <Link href={asset.href}> |
| 70 | + <IconButton variant={"plain"} size={"sm"}> |
| 71 | + <LuExternalLink></LuExternalLink> |
| 72 | + </IconButton> |
| 73 | + </Link> |
| 74 | + </Card.Footer> |
| 75 | + </Card.Root> |
| 76 | + ); |
| 77 | + })} |
| 78 | + </Wrap> |
| 79 | + </Stack> |
| 80 | + ); |
29 | 81 | } |
30 | 82 |
|
31 | 83 | export default function Sidebar() { |
32 | | - const { metadata, id } = useStacGeoparquet(); |
| 84 | + const { metadata, item } = useStacGeoparquet(); |
| 85 | + const [value, setValue] = useState("metadata"); |
| 86 | + |
| 87 | + useEffect(() => { |
| 88 | + if (item) { |
| 89 | + setValue("item"); |
| 90 | + } else { |
| 91 | + setValue("metadata"); |
| 92 | + } |
| 93 | + }, [item]); |
33 | 94 |
|
34 | 95 | return ( |
35 | | - <SimpleGrid columns={3} my={2} pointerEvents={"auto"}> |
| 96 | + <SimpleGrid columns={3} my={2}> |
36 | 97 | <Tabs.Root |
37 | 98 | bg={"bg.muted"} |
38 | 99 | px={4} |
39 | 100 | pt={2} |
40 | 101 | pb={4} |
41 | 102 | fontSize={"sm"} |
42 | 103 | rounded={"sm"} |
43 | | - defaultValue={"info"} |
| 104 | + value={value} |
| 105 | + onValueChange={(e) => setValue(e.value)} |
| 106 | + pointerEvents={"auto"} |
44 | 107 | > |
45 | 108 | <Tabs.List> |
46 | | - <Tabs.Trigger value="info"> |
| 109 | + <Tabs.Trigger value="metadata"> |
47 | 110 | {(metadata && <LuFolder></LuFolder>) || ( |
48 | 111 | <LuFolderMinus></LuFolderMinus> |
49 | 112 | )} |
50 | 113 | </Tabs.Trigger> |
| 114 | + <Tabs.Trigger value="item" disabled={item === undefined}> |
| 115 | + <LuInfo></LuInfo> |
| 116 | + </Tabs.Trigger> |
51 | 117 | </Tabs.List> |
52 | | - <Tabs.Content value="info"> |
53 | | - <Info metadata={metadata} id={id}></Info> |
| 118 | + <Tabs.Content value="metadata"> |
| 119 | + {(metadata && <Metadata metadata={metadata}></Metadata>) || |
| 120 | + "No file loaded..."} |
| 121 | + </Tabs.Content> |
| 122 | + <Tabs.Content value="item"> |
| 123 | + {(item && <Item item={item}></Item>) || "No item selected..."} |
54 | 124 | </Tabs.Content> |
55 | 125 | </Tabs.Root> |
56 | 126 | </SimpleGrid> |
|
0 commit comments