2020-03-20 17:56:34 +11:00
|
|
|
import React, { useRef } from "react";
|
|
|
|
|
import { Box, Image } from "theme-ui";
|
2020-03-19 17:33:57 +11:00
|
|
|
|
2020-03-20 11:05:40 +11:00
|
|
|
import Token from "../components/Token";
|
2020-03-20 13:33:12 +11:00
|
|
|
import ProxyToken from "../components/ProxyToken";
|
|
|
|
|
|
|
|
|
|
const mapTokenClassName = "map-token";
|
2020-03-20 17:56:34 +11:00
|
|
|
const defaultTokenSize = 48;
|
2020-03-20 13:33:12 +11:00
|
|
|
|
2020-03-20 17:56:34 +11:00
|
|
|
function Map({ mapSource, mapData, tokens, onMapTokenMove, onMapTokenRemove }) {
|
2020-03-20 13:33:12 +11:00
|
|
|
function handleProxyDragEnd(isOnMap, token) {
|
|
|
|
|
if (isOnMap && onMapTokenMove) {
|
|
|
|
|
onMapTokenMove(token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isOnMap && onMapTokenRemove) {
|
|
|
|
|
onMapTokenRemove(token);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-20 11:05:40 +11:00
|
|
|
|
2020-03-20 17:56:34 +11:00
|
|
|
const mapRef = useRef(null);
|
|
|
|
|
const rows = mapData && mapData.rows;
|
|
|
|
|
const tokenSizePercent = (1 / rows) * 100;
|
|
|
|
|
const aspectRatio = (mapData && mapData.width / mapData.height) || 1;
|
|
|
|
|
|
2020-03-19 17:33:57 +11:00
|
|
|
return (
|
2020-03-20 13:33:12 +11:00
|
|
|
<>
|
2020-03-20 17:56:34 +11:00
|
|
|
<Box
|
2020-03-20 13:33:12 +11:00
|
|
|
className="map"
|
2020-03-20 17:56:34 +11:00
|
|
|
sx={{ flexGrow: 1, position: "relative", overflow: "hidden" }}
|
2020-03-20 13:33:12 +11:00
|
|
|
bg="background"
|
2020-03-20 11:05:40 +11:00
|
|
|
>
|
2020-03-20 13:33:12 +11:00
|
|
|
<Box
|
|
|
|
|
sx={{
|
2020-03-20 17:56:34 +11:00
|
|
|
position: "relative",
|
|
|
|
|
overflow: "hidden",
|
|
|
|
|
top: "50%",
|
|
|
|
|
left: "50%",
|
|
|
|
|
transform: "translate(-50%, -50%)"
|
2020-03-20 13:33:12 +11:00
|
|
|
}}
|
|
|
|
|
>
|
2020-03-20 17:56:34 +11:00
|
|
|
<Box
|
|
|
|
|
sx={{
|
|
|
|
|
width: "100%",
|
|
|
|
|
height: 0,
|
|
|
|
|
paddingBottom: `${(1 / aspectRatio) * 100}%`
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<Box
|
|
|
|
|
sx={{ position: "absolute", top: 0, right: 0, bottom: 0, left: 0 }}
|
|
|
|
|
>
|
|
|
|
|
<Image ref={mapRef} id="map" src={mapSource} />
|
|
|
|
|
</Box>
|
|
|
|
|
<Box
|
|
|
|
|
sx={{
|
|
|
|
|
position: "absolute",
|
|
|
|
|
top: 0,
|
|
|
|
|
left: 0,
|
|
|
|
|
right: 0,
|
|
|
|
|
bottom: 0
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{Object.values(tokens).map(token => (
|
|
|
|
|
<Box
|
|
|
|
|
key={token.id}
|
|
|
|
|
style={{
|
|
|
|
|
left: `${token.x * 100}%`,
|
|
|
|
|
top: `${token.y * 100}%`,
|
|
|
|
|
width: `${tokenSizePercent}%`
|
|
|
|
|
}}
|
|
|
|
|
sx={{
|
|
|
|
|
position: "absolute",
|
|
|
|
|
display: "flex"
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<Token
|
|
|
|
|
tokenId={token.id}
|
|
|
|
|
image={token.image}
|
|
|
|
|
className={mapTokenClassName}
|
|
|
|
|
/>
|
|
|
|
|
</Box>
|
|
|
|
|
))}
|
|
|
|
|
</Box>
|
2020-03-20 13:33:12 +11:00
|
|
|
</Box>
|
2020-03-20 17:56:34 +11:00
|
|
|
</Box>
|
2020-03-20 13:33:12 +11:00
|
|
|
<ProxyToken
|
|
|
|
|
tokenClassName={mapTokenClassName}
|
|
|
|
|
onProxyDragEnd={handleProxyDragEnd}
|
2020-03-20 17:56:34 +11:00
|
|
|
size={defaultTokenSize}
|
2020-03-20 13:33:12 +11:00
|
|
|
/>
|
|
|
|
|
</>
|
2020-03-19 17:33:57 +11:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Map;
|