Compare commits

..

2 Commits

Author SHA1 Message Date
clawdbot
5ff0c22724 refactor(editor): unify selection key + clean node view 2026-01-28 22:27:09 +08:00
clawdbot
e296fc0979 refactor: centralize selection key helper 2026-01-28 22:10:34 +08:00
4 changed files with 21 additions and 27 deletions

View File

@ -5,6 +5,7 @@ import { Button, Space } from 'antd';
import type { ResizeHandle } from './types';
import { rectFromPoints } from './geometry';
import type { ContextMenuState } from './ContextMenu';
import { selectionKeyOf } from './selection';
export interface CanvasProps {
screen: Screen;
@ -40,12 +41,6 @@ function isPrimaryButton(e: React.PointerEvent | PointerEvent): boolean {
return (e as PointerEvent).buttons === 1 || (e as PointerEvent).button === 0;
}
function selectionKeyOf(ids: string[]): string {
// Keep stable regardless of selection order.
// This avoids false mismatches between context-menu state and reducer state.
return [...ids].sort().join('|');
}
export function Canvas(props: CanvasProps) {
const ref = useRef<HTMLDivElement | null>(null);
const [box, setBox] = useState<{ x1: number; y1: number; x2: number; y2: number } | null>(null);

View File

@ -1,11 +1,7 @@
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
import { Typography } from 'antd';
function selectionKeyOf(ids: string[]): string {
// Keep stable regardless of selection order.
// This avoids false mismatches between context-menu state and reducer state.
return [...ids].sort().join('|');
}
import { selectionKeyOf } from './selection';
export type ContextMenuState =
| {

View File

@ -14,6 +14,7 @@ import { bindEditorHotkeys } from './hotkeys';
import { Canvas } from './Canvas';
import { ContextMenu, type ContextMenuState } from './ContextMenu';
import { Inspector } from './Inspector';
import { selectionKeyOf } from './selection';
import { createInitialState, editorReducer, exportScreenJSON } from './store';
const { Header, Sider, Content } = Layout;
@ -86,10 +87,7 @@ export function EditorApp() {
const closeContextMenu = useCallback(() => setCtxMenu(null), []);
const selectionKeyOf = useCallback((ids: string[]) => {
// Keep stable regardless of ordering.
return [...ids].sort().join('|');
}, []);
// selectionKeyOf imported from ./selection
const ctxMenuSyncedRef = useRef(false);
@ -103,7 +101,7 @@ export function EditorApp() {
}
dispatch(action);
},
[ctxMenu, dispatch, selectionKeyOf, state.selection.ids],
[ctxMenu, dispatch, state.selection.ids],
);
useEffect(() => {

View File

@ -0,0 +1,5 @@
export function selectionKeyOf(ids: string[]): string {
// Keep stable regardless of selection order.
// This avoids false mismatches between context-menu state and reducer state.
return [...ids].sort().join('|');
}