Skip to content

Commit 03e8aed

Browse files
authored
Merge pull request #25 from openpatch/copilot/update-node-positioning
Fix node positioning: keyboard shortcuts use mouse cursor, toolbar uses viewport center
2 parents 54cb21f + 1d9d36b commit 03e8aed

File tree

3 files changed

+2209
-2659
lines changed

3 files changed

+2209
-2659
lines changed

packages/learningmap/src/EditorCanvas.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, memo, useEffect } from "react";
1+
import { useCallback, memo, useEffect, useRef } from "react";
22
import { ReactFlow, Controls, Background, ControlButton, OnSelectionChangeFunc, Node, Edge, useReactFlow } from "@xyflow/react";
33
import { Info, Redo, Undo } from "lucide-react";
44
import { useEditorStore, useTemporalStore } from "./editorStore";
@@ -44,8 +44,10 @@ export const EditorCanvas = memo(({ defaultLanguage = "en" }: EditorCanvasProps)
4444
const setDrawerOpen = useEditorStore(state => state.setDrawerOpen);
4545
const setEdgeDrawerOpen = useEditorStore(state => state.setEdgeDrawerOpen);
4646
const setHelpOpen = useEditorStore(state => state.setHelpOpen);
47+
const setLastMousePosition = useEditorStore(state => state.setLastMousePosition);
4748

48-
const { setViewport } = useReactFlow();
49+
const { setViewport, screenToFlowPosition } = useReactFlow();
50+
const canvasRef = useRef<HTMLDivElement>(null);
4951

5052
const language = settings?.language || defaultLanguage;
5153
const t = getTranslations(language);
@@ -90,6 +92,12 @@ export const EditorCanvas = memo(({ defaultLanguage = "en" }: EditorCanvasProps)
9092
[setSelectedNodeIds]
9193
);
9294

95+
// Track mouse position for keyboard shortcuts
96+
const handleMouseMove = useCallback((event: React.MouseEvent) => {
97+
const position = screenToFlowPosition({ x: event.clientX, y: event.clientY });
98+
setLastMousePosition(position);
99+
}, [screenToFlowPosition, setLastMousePosition]);
100+
93101
const defaultEdgeOptions = {
94102
animated: false,
95103
style: {
@@ -101,10 +109,12 @@ export const EditorCanvas = memo(({ defaultLanguage = "en" }: EditorCanvasProps)
101109

102110
return (
103111
<div
112+
ref={canvasRef}
104113
className="editor-canvas"
105114
style={{
106115
backgroundColor: settings?.background?.color || "#ffffff",
107116
}}
117+
onMouseMove={handleMouseMove}
108118
>
109119
<ReactFlow
110120
nodes={nodes}

packages/learningmap/src/EditorToolbar.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import '@szhsin/react-menu/dist/transitions/zoom.css';
55
import { Plus, Bug, Settings, Eye, Menu as MenuI, FolderOpen, Download, ImageDown, ExternalLink, Share2, RotateCcw } from "lucide-react";
66
import { getTranslations } from "./translations";
77
import { useEditorStore } from "./editorStore";
8-
import { Node } from "@xyflow/react";
8+
import { Node, useReactFlow } from "@xyflow/react";
99
import { NodeData } from "./types";
1010
import { useJsonStore } from "./useJsonStore";
1111
import { useFileOperations } from "./useFileOperations";
@@ -17,6 +17,8 @@ interface EditorToolbarProps {
1717
export const EditorToolbar: React.FC<EditorToolbarProps> = ({
1818
defaultLanguage = "en",
1919
}) => {
20+
const { screenToFlowPosition } = useReactFlow();
21+
2022
// Get state directly from store
2123
const settings = useEditorStore(state => state.settings);
2224
const debugMode = useEditorStore(state => state.debugMode);
@@ -48,7 +50,8 @@ export const EditorToolbar: React.FC<EditorToolbarProps> = ({
4850
const onSetShowUnlockAfter = (checked: boolean) => setShowUnlockAfter(checked);
4951

5052
const onAddNewNode = (type: "task" | "topic" | "image" | "text") => {
51-
const position = { x: Math.random() * 500, y: Math.random() * 500 };
53+
// Position new nodes at the center of the current viewport
54+
const position = screenToFlowPosition({ x: window.innerWidth / 2, y: window.innerHeight / 2 });
5255
const newNode: Node<NodeData> = {
5356
id: `node-${Date.now()}`,
5457
type,

0 commit comments

Comments
 (0)