Skip to content

Commit d416785

Browse files
committed
Feat: added element move capability with arrow keys
1 parent 72ff002 commit d416785

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/hooks/events/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ISTKProps } from "@/types";
22
import { default as useDelete } from "./deletion";
33
import { default as useDeselection } from "./deselection";
44
import { default as useDuplicate } from "./duplication";
5+
import { default as useMove } from "./move";
56
import { default as usePolyline } from "./polyline";
67
import { default as useSeatSelectionChange } from "./seat-selection";
78
import { default as useWorkspaceClick } from "./workspace-click";
@@ -11,6 +12,7 @@ export const useDesignerEvents = (props: ISTKProps) => {
1112
useDelete();
1213
useDeselection();
1314
useDuplicate();
15+
useMove();
1416
usePolyline();
1517
useWorkspaceClick();
1618
useWorkspaceLoad(props);

src/hooks/events/move.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { useEffect } from "react";
2+
import { useSelector } from "react-redux";
3+
import { ElementType } from "@/components/workspace/elements";
4+
import { dataAttributes } from "@/constants";
5+
import { d3Extended } from "@/utils";
6+
7+
const useMove = () => {
8+
const selectedElementIds = useSelector((state: any) => state.editor.selectedElementIds);
9+
10+
useEffect(() => {
11+
const handler = (e) => {
12+
selectedElementIds.forEach((id) => {
13+
const element = d3Extended.selectById(id);
14+
const isSeat = element.attr(dataAttributes.elementType) === ElementType.Seat;
15+
const label = isSeat ? d3Extended.selectById(`${id}-label`) : null;
16+
const x = isSeat ? "cx" : "x";
17+
const y = isSeat ? "cy" : "y";
18+
switch (e.key) {
19+
case "ArrowLeft":
20+
label?.attr("x", +label.attr("x") - 1);
21+
return element.attr(x, +element.attr(x) - 1);
22+
case "ArrowRight":
23+
label?.attr("x", +label.attr("x") + 1);
24+
return element.attr(x, +element.attr(x) + 1);
25+
case "ArrowUp":
26+
label?.attr("y", +label.attr("y") - 1);
27+
return element.attr(y, +element.attr(y) - 1);
28+
case "ArrowDown":
29+
label?.attr("y", +label.attr("y") + 1);
30+
return element.attr(y, +element.attr(y) + 1);
31+
}
32+
});
33+
};
34+
window.addEventListener("keydown", handler);
35+
return () => {
36+
window.removeEventListener("keydown", handler);
37+
};
38+
}, [selectedElementIds]);
39+
};
40+
41+
export default useMove;

0 commit comments

Comments
 (0)