From 19139dec820c35b71ef6e1d2ebc65991c1684eb4 Mon Sep 17 00:00:00 2001 From: Mitchell McCaffrey Date: Thu, 22 Jul 2021 16:40:33 +1000 Subject: [PATCH] Remove need to pass node into drag overlay --- src/components/map/DragOverlay.tsx | 22 ++++++++++------------ src/components/token/TokenDragOverlay.tsx | 12 +----------- src/hooks/useMapNotes.tsx | 8 ++------ src/hooks/useMapTokens.tsx | 4 +--- src/types/Note.ts | 1 - src/types/Token.ts | 1 - 6 files changed, 14 insertions(+), 34 deletions(-) diff --git a/src/components/map/DragOverlay.tsx b/src/components/map/DragOverlay.tsx index c685e17..f0767fe 100644 --- a/src/components/map/DragOverlay.tsx +++ b/src/components/map/DragOverlay.tsx @@ -1,23 +1,25 @@ import { useEffect, useRef, useState } from "react"; import { Box, IconButton } from "theme-ui"; -import Konva from "konva"; import RemoveTokenIcon from "../../icons/RemoveTokenIcon"; +import { useMapStage } from "../../contexts/MapStageContext"; type DragOverlayProps = { dragging: boolean; - node: Konva.Node; onRemove: () => void; }; -function DragOverlay({ dragging, node, onRemove }: DragOverlayProps) { +function DragOverlay({ dragging, onRemove }: DragOverlayProps) { const [isRemoveHovered, setIsRemoveHovered] = useState(false); const removeTokenRef = useRef(null); + const mapStageRef = useMapStage(); + // Detect token hover on remove icon manually to support touch devices useEffect(() => { function detectRemoveHover() { - if (!node || !dragging || !removeTokenRef.current) { + const mapStage = mapStageRef.current; + if (!mapStage || !dragging || !removeTokenRef.current) { return; } const map = document.querySelector(".map"); @@ -25,11 +27,7 @@ function DragOverlay({ dragging, node, onRemove }: DragOverlayProps) { return; } const mapRect = map.getBoundingClientRect(); - const stage = node.getStage(); - if (!stage) { - return; - } - const pointerPosition = stage.getPointerPosition(); + const pointerPosition = mapStage.getPointerPosition(); if (!pointerPosition) { return; } @@ -54,7 +52,7 @@ function DragOverlay({ dragging, node, onRemove }: DragOverlayProps) { } let handler: NodeJS.Timeout; - if (node && dragging) { + if (dragging) { handler = setInterval(detectRemoveHover, 100); } @@ -63,11 +61,11 @@ function DragOverlay({ dragging, node, onRemove }: DragOverlayProps) { clearInterval(handler); } }; - }, [isRemoveHovered, dragging, node]); + }, [isRemoveHovered, dragging, mapStageRef]); // Detect drag end of token image and remove it if it is over the remove icon useEffect(() => { - if (!dragging && node && isRemoveHovered) { + if (!dragging && isRemoveHovered) { onRemove(); } }); diff --git a/src/components/token/TokenDragOverlay.tsx b/src/components/token/TokenDragOverlay.tsx index f91e204..73a285d 100644 --- a/src/components/token/TokenDragOverlay.tsx +++ b/src/components/token/TokenDragOverlay.tsx @@ -1,5 +1,3 @@ -import Konva from "konva"; - import DragOverlay from "../map/DragOverlay"; import { TokenStateRemoveHandler } from "../../types/Events"; import { TokenState } from "../../types/TokenState"; @@ -7,27 +5,19 @@ import { TokenState } from "../../types/TokenState"; type TokenDragOverlayProps = { onTokenStateRemove: TokenStateRemoveHandler; tokenState: TokenState; - tokenNode: Konva.Node; dragging: boolean; }; function TokenDragOverlay({ onTokenStateRemove, tokenState, - tokenNode, dragging, }: TokenDragOverlayProps) { function handleTokenRemove() { onTokenStateRemove([tokenState.id]); } - return ( - - ); + return ; } export default TokenDragOverlay; diff --git a/src/hooks/useMapNotes.tsx b/src/hooks/useMapNotes.tsx index 517f9ab..1d93c09 100644 --- a/src/hooks/useMapNotes.tsx +++ b/src/hooks/useMapNotes.tsx @@ -31,11 +31,8 @@ function useMapNotes( setIsNoteMenuOpen(true); } - function handleNoteDragStart( - event: KonvaEventObject, - noteId: string - ) { - setNoteDraggingOptions({ dragging: true, noteId, noteGroup: event.target }); + function handleNoteDragStart(_: KonvaEventObject, noteId: string) { + setNoteDraggingOptions({ dragging: true, noteId }); } function handleNoteDragEnd() { @@ -86,7 +83,6 @@ function useMapNotes( const noteDragOverlay = noteDraggingOptions ? ( diff --git a/src/hooks/useMapTokens.tsx b/src/hooks/useMapTokens.tsx index e500537..da67183 100644 --- a/src/hooks/useMapTokens.tsx +++ b/src/hooks/useMapTokens.tsx @@ -55,13 +55,12 @@ function useMapTokens( } function handleTokenDragStart( - event: KonvaEventObject, + _: KonvaEventObject, tokenStateId: string ) { setTokenDraggingOptions({ dragging: true, tokenStateId, - tokenNode: event.target, }); } @@ -122,7 +121,6 @@ function useMapTokens( ); diff --git a/src/types/Note.ts b/src/types/Note.ts index 923509d..424774b 100644 --- a/src/types/Note.ts +++ b/src/types/Note.ts @@ -23,7 +23,6 @@ export type NoteMenuOptions = { export type NoteDraggingOptions = { dragging: boolean; noteId: string; - noteGroup: Konva.Node; }; export type Notes = Record; diff --git a/src/types/Token.ts b/src/types/Token.ts index 90657e4..7bafd11 100644 --- a/src/types/Token.ts +++ b/src/types/Token.ts @@ -39,5 +39,4 @@ export type TokenMenuOptions = { export type TokenDraggingOptions = { dragging: boolean; tokenStateId: string; - tokenNode: Konva.Node; };