Readded map token remove
This commit is contained in:
parent
05df26491f
commit
118878d9e1
@ -7,6 +7,7 @@ import MapToken from "./MapToken";
|
|||||||
|
|
||||||
import TokenDataContext from "../../contexts/TokenDataContext";
|
import TokenDataContext from "../../contexts/TokenDataContext";
|
||||||
import TokenMenu from "../token/TokenMenu";
|
import TokenMenu from "../token/TokenMenu";
|
||||||
|
import TokenDragOverlay from "../token/TokenDragOverlay";
|
||||||
|
|
||||||
function Map({
|
function Map({
|
||||||
map,
|
map,
|
||||||
@ -141,6 +142,7 @@ function Map({
|
|||||||
|
|
||||||
const [isTokenMenuOpen, setIsTokenMenuOpen] = useState(false);
|
const [isTokenMenuOpen, setIsTokenMenuOpen] = useState(false);
|
||||||
const [tokenMenuOptions, setTokenMenuOptions] = useState({});
|
const [tokenMenuOptions, setTokenMenuOptions] = useState({});
|
||||||
|
const [draggingTokenState, setDraggingTokenState] = useState();
|
||||||
function handleTokenMenuOpen(tokenStateId, tokenImage) {
|
function handleTokenMenuOpen(tokenStateId, tokenImage) {
|
||||||
setTokenMenuOptions({ tokenStateId, tokenImage });
|
setTokenMenuOptions({ tokenStateId, tokenImage });
|
||||||
setIsTokenMenuOpen(true);
|
setIsTokenMenuOpen(true);
|
||||||
@ -156,6 +158,8 @@ function Map({
|
|||||||
tokenSizePercent={tokenSizePercent}
|
tokenSizePercent={tokenSizePercent}
|
||||||
onTokenStateChange={onMapTokenStateChange}
|
onTokenStateChange={onMapTokenStateChange}
|
||||||
onTokenMenuOpen={handleTokenMenuOpen}
|
onTokenMenuOpen={handleTokenMenuOpen}
|
||||||
|
onTokenDragStart={() => setDraggingTokenState(tokenState)}
|
||||||
|
onTokenDragEnd={() => setDraggingTokenState(null)}
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
|
|
||||||
@ -169,6 +173,15 @@ function Map({
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const tokenDragOverlay = draggingTokenState && (
|
||||||
|
<TokenDragOverlay
|
||||||
|
onTokenStateRemove={() => {
|
||||||
|
onMapTokenStateRemove(draggingTokenState);
|
||||||
|
setDraggingTokenState(null);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MapInteraction
|
<MapInteraction
|
||||||
map={map}
|
map={map}
|
||||||
@ -176,6 +189,7 @@ function Map({
|
|||||||
<>
|
<>
|
||||||
{mapControls}
|
{mapControls}
|
||||||
{tokenMenu}
|
{tokenMenu}
|
||||||
|
{tokenDragOverlay}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
@ -19,6 +19,8 @@ function MapToken({
|
|||||||
tokenSizePercent,
|
tokenSizePercent,
|
||||||
onTokenStateChange,
|
onTokenStateChange,
|
||||||
onTokenMenuOpen,
|
onTokenMenuOpen,
|
||||||
|
onTokenDragStart,
|
||||||
|
onTokenDragEnd,
|
||||||
}) {
|
}) {
|
||||||
const { userId } = useContext(AuthContext);
|
const { userId } = useContext(AuthContext);
|
||||||
const {
|
const {
|
||||||
@ -46,6 +48,7 @@ function MapToken({
|
|||||||
y: event.target.y() / mapHeight,
|
y: event.target.y() / mapHeight,
|
||||||
lastEditedBy: userId,
|
lastEditedBy: userId,
|
||||||
});
|
});
|
||||||
|
onTokenDragEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleClick(event) {
|
function handleClick(event) {
|
||||||
@ -61,7 +64,12 @@ function MapToken({
|
|||||||
const imageRef = useRef();
|
const imageRef = useRef();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const image = imageRef.current;
|
const image = imageRef.current;
|
||||||
if (image && tokenSourceStatus === "loaded") {
|
if (
|
||||||
|
image &&
|
||||||
|
tokenSourceStatus === "loaded" &&
|
||||||
|
tokenWidth > 0 &&
|
||||||
|
tokenHeight > 0
|
||||||
|
) {
|
||||||
image.cache({
|
image.cache({
|
||||||
pixelRatio: debouncedStageScale,
|
pixelRatio: debouncedStageScale,
|
||||||
});
|
});
|
||||||
@ -71,6 +79,10 @@ function MapToken({
|
|||||||
}
|
}
|
||||||
}, [debouncedStageScale, tokenWidth, tokenHeight, tokenSourceStatus]);
|
}, [debouncedStageScale, tokenWidth, tokenHeight, tokenSourceStatus]);
|
||||||
|
|
||||||
|
if (!tokenWidth || !tokenHeight) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Group
|
<Group
|
||||||
width={tokenWidth}
|
width={tokenWidth}
|
||||||
@ -84,6 +96,7 @@ function MapToken({
|
|||||||
onTouchEnd={() => setPreventMapInteraction(false)}
|
onTouchEnd={() => setPreventMapInteraction(false)}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
onDragEnd={handleDragEnd}
|
onDragEnd={handleDragEnd}
|
||||||
|
onDragStart={onTokenDragStart}
|
||||||
>
|
>
|
||||||
<KonvaImage
|
<KonvaImage
|
||||||
ref={imageRef}
|
ref={imageRef}
|
||||||
|
40
src/components/token/TokenDragOverlay.js
Normal file
40
src/components/token/TokenDragOverlay.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import React, { useContext } from "react";
|
||||||
|
import { Box, IconButton } from "theme-ui";
|
||||||
|
|
||||||
|
import RemoveTokenIcon from "../../icons/RemoveTokenIcon";
|
||||||
|
|
||||||
|
import MapInteractionContext from "../../contexts/MapInteractionContext";
|
||||||
|
|
||||||
|
function TokenDragOverlay({ onTokenStateRemove }) {
|
||||||
|
const { setPreventMapInteraction } = useContext(MapInteractionContext);
|
||||||
|
|
||||||
|
function handleTokenRemove() {
|
||||||
|
onTokenStateRemove();
|
||||||
|
setPreventMapInteraction(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
position: "absolute",
|
||||||
|
bottom: "12px",
|
||||||
|
left: "50%",
|
||||||
|
borderRadius: "50%",
|
||||||
|
transform: "translateX(-50%)",
|
||||||
|
transition: "transform 250ms ease",
|
||||||
|
":hover": {
|
||||||
|
transform: "translateX(-50%) scale(1.5)",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
bg="overlay"
|
||||||
|
onMouseUp={handleTokenRemove}
|
||||||
|
onTouchEnd={handleTokenRemove}
|
||||||
|
>
|
||||||
|
<IconButton>
|
||||||
|
<RemoveTokenIcon />
|
||||||
|
</IconButton>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TokenDragOverlay;
|
Loading…
Reference in New Issue
Block a user