Skip to content

Commit 36c40f5

Browse files
committed
Prevent window drag from menus
1 parent 090ee24 commit 36c40f5

2 files changed

Lines changed: 24 additions & 42 deletions

File tree

src/components/BorderedApp/BorderedApp.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ function BorderedApp({
7878
<div className="bordered-app__corner-ne" ref={resizeHandleNE} />
7979
<div className="bordered-app__edge-e" ref={resizeHandleE} />
8080
<div
81-
className="bordered-app__title-bar"
81+
className="bordered-app__title-bar drag-to-move"
8282
ref={moveHandle}
8383
onDoubleClick={maximize}
8484
>
85-
<div className="bordered-app__window-menus-wrapper">
86-
<div className="bordered-app__window-menus">
85+
<div className="bordered-app__window-menus-wrapper drag-to-move">
86+
<div className="bordered-app__window-menus drag-to-move">
8787
{menus?.map((m) => (
8888
<BorderedAppMenu
8989
title={m.title}
@@ -93,10 +93,10 @@ function BorderedApp({
9393
))}
9494
</div>
9595
</div>
96-
<div className="bordered-app__title-wrapper">
97-
<div className="bordered-app__title">{title}</div>
96+
<div className="bordered-app__title-wrapper drag-to-move">
97+
<div className="bordered-app__title drag-to-move">{title}</div>
9898
</div>
99-
<div className="bordered-app__window-buttons-wrapper">
99+
<div className="bordered-app__window-buttons-wrapper drag-to-move">
100100
<div className="bordered-app__window-buttons">
101101
<div
102102
className="bordered-app__window-button minimize"

src/hooks/useDragToMove.ts

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,6 @@ import { Rect } from "./useDragToResize";
1010

1111
// https://stackoverflow.com/a/39192992/6236042
1212

13-
type StyledElement = {
14-
style: CSSStyleDeclaration;
15-
};
16-
17-
function hasStyle(value: unknown): value is StyledElement {
18-
return !!value && typeof value === "object" && "style" in value;
19-
}
20-
2113
interface UseDraggableProps {
2214
/**
2315
* A reference to the element that can be used to move the draggable element.
@@ -35,29 +27,23 @@ const useDragToMove = ({ moveRef = null, elementRect }: UseDraggableProps) => {
3527
const ref = useRef<HTMLElement | null>(null);
3628

3729
const unsubscribe = useRef<VoidFunction>();
38-
const moveHandle: RefCallback<HTMLElement> = useCallback(
39-
(elem) => {
40-
ref.current = elem;
41-
if (unsubscribe.current) {
42-
unsubscribe.current;
43-
}
44-
if (!elem) {
45-
return;
46-
}
47-
const handleMouseDown = (e: MouseEvent) => {
48-
const elem = moveRef?.current ?? e.target;
49-
if (hasStyle(elem)) {
50-
elem.style.userSelect = "none";
51-
}
52-
setPressed(true);
53-
};
54-
elem.addEventListener("mousedown", handleMouseDown);
55-
unsubscribe.current = () => {
56-
elem.removeEventListener("mousedown", handleMouseDown);
57-
};
58-
},
59-
[moveRef]
60-
);
30+
const moveHandle: RefCallback<HTMLElement> = useCallback((elem) => {
31+
ref.current = elem;
32+
if (unsubscribe.current) {
33+
unsubscribe.current;
34+
}
35+
if (!elem) {
36+
return;
37+
}
38+
const handleMouseDown = (e: MouseEvent) => {
39+
if (!(e.target as HTMLElement).classList.contains("drag-to-move")) return;
40+
setPressed(true);
41+
};
42+
elem.addEventListener("mousedown", handleMouseDown);
43+
unsubscribe.current = () => {
44+
elem.removeEventListener("mousedown", handleMouseDown);
45+
};
46+
}, []);
6147

6248
useEffect(() => {
6349
if (!pressed) {
@@ -82,11 +68,7 @@ const useDragToMove = ({ moveRef = null, elementRect }: UseDraggableProps) => {
8268
elem.style.top = `${elementRect.current.top}px`;
8369
}
8470
);
85-
const handleMouseUp = (e: MouseEvent) => {
86-
const elem = moveRef?.current ?? e.target;
87-
if (hasStyle(elem)) {
88-
elem.style.userSelect = "auto";
89-
}
71+
const handleMouseUp = () => {
9072
setPressed(false);
9173
};
9274
// subscribe to mousemove and mouseup on document, otherwise you

0 commit comments

Comments
 (0)