import { useState, useEffect } from "react"; import { PMTiles } from "../../js"; import { styled } from "./stitches.config"; import Inspector from "./Inspector"; import LeafletMap from "./LeafletMap"; import MaplibreMap from "./MaplibreMap"; import { MagnifyingGlassIcon, ImageIcon } from "@radix-ui/react-icons"; import * as ToolbarPrimitive from "@radix-ui/react-toolbar"; import * as DialogPrimitive from "@radix-ui/react-dialog"; const StyledToolbar = styled(ToolbarPrimitive.Root, { display: "flex", height: "$4", width: "100%", boxSizing: "border-box", minWidth: "max-content", backgroundColor: "white", boxShadow: `0 2px 10px "black"`, }); const itemStyles = { all: "unset", flex: "0 0 auto", color: "$black", display: "inline-flex", padding: "0 $1 0 $1", fontSize: "$2", alignItems: "center", "&:hover": { backgroundColor: "$hover", color: "$white" }, "&:focus": { position: "relative", boxShadow: `0 0 0 2px blue` }, }; const StyledLink = styled( ToolbarPrimitive.Link, { ...itemStyles, backgroundColor: "transparent", color: "black", display: "inline-flex", justifyContent: "center", alignItems: "center", }, { "&:hover": { backgroundColor: "$hover", color:"$white", cursor: "pointer" } } ); const StyledToggleGroup = styled(ToolbarPrimitive.ToggleGroup, { display: "inline-flex", borderRadius: 4, }); const StyledToggleItem = styled(ToolbarPrimitive.ToggleItem, { ...itemStyles, boxShadow: 0, backgroundColor: "white", marginLeft: 2, cursor: "pointer", "&:first-child": { marginLeft: 0 }, "&[data-state=on]": { backgroundColor: "$primary", color: "$primaryText" }, }); const MetadataButton = styled(DialogPrimitive.Trigger, { backgroundColor:"$primary", color:"$primaryText", padding:"$1", cursor: "pointer" }) const StyledOverlay = styled(DialogPrimitive.Overlay, { backgroundColor: "black", position: "fixed", inset: 0, opacity: "40%", zIndex: 3, }); const StyledContent = styled(DialogPrimitive.Content, { backgroundColor: "#222", padding:"$1", borderRadius: 6, position: "fixed", top: "50%", left: "50%", transform: "translate(-50%, -50%)", width: "90vw", zIndex: 4, "&:focus": { outline: "none" }, }); const MetadataTable = styled("table", { tableLayout:"fixed", width:"100%" }); const MetadataKey = styled("td", { padding: "0 $1" }); const MetadataValue = styled("td", { fontFamily:"monospace", }); const JsonValue = styled(MetadataValue, { overflowX:"scroll" }) const Toolbar = StyledToolbar; const ToolbarLink = StyledLink; const ToolbarToggleGroup = StyledToggleGroup; const ToolbarToggleItem = StyledToggleItem; function Loader(props: { file: PMTiles }) { let [tab, setTab] = useState("inspector"); let [metadata, setMetadata] = useState<[string, string][]>([]); let [modalOpen, setModalOpen] = useState(false); let view; if (tab === "leaflet") { view = ; } else if (tab === "maplibre") { view = ; } else { view = ; } useEffect(() => { let pmtiles = props.file; const fetchData = async () => { let m = await pmtiles.getMetadata(); let tmp: [string, string][] = []; for (var key in m) { tmp.push([key, m[key]]); } setMetadata(tmp); }; fetchData(); }, [props.file]); const metadataRows = metadata.map((d, i) => { let Cls = (d[0] === 'json') ? JsonValue : MetadataValue return {d[0]} {d[1]} }); const closeModal = () => { setModalOpen(false); }; return ( <> Tile Inspector Leaflet MapLibre {props.file.source.getKey()} setModalOpen(true)}> Metadata key value {metadataRows} {view} ); } export default Loader;