앱 수정
This commit is contained in:
@@ -82,6 +82,7 @@ import {
|
||||
spawnPositionNearAnchor,
|
||||
subtreeToFlatOrphans,
|
||||
type EdgeHandleBinding,
|
||||
type StrategyFlowNodeData,
|
||||
} from '../../utils/strategyFlowLayout';
|
||||
import {
|
||||
createStartNodeId,
|
||||
@@ -906,10 +907,16 @@ function StrategyEditorCanvasInner({
|
||||
const syncNodesFromLayout = () => setNodes(layoutNodes.map(n => {
|
||||
const prev = nodesRef.current.find(p => p.id === n.id);
|
||||
const savedPos = layoutSeed.positions[n.id];
|
||||
const dragOver = (prev?.data as StrategyFlowNodeData | undefined)?.dragOver;
|
||||
const activeSourceSide = (prev?.data as StrategyFlowNodeData | undefined)?.activeSourceSide;
|
||||
return {
|
||||
...n,
|
||||
position: savedPos ? { x: savedPos.x, y: savedPos.y } : n.position,
|
||||
selected: prev?.selected ?? false,
|
||||
data: {
|
||||
...n.data,
|
||||
...(dragOver ? { dragOver, activeSourceSide } : {}),
|
||||
},
|
||||
};
|
||||
}));
|
||||
|
||||
@@ -933,10 +940,15 @@ function StrategyEditorCanvasInner({
|
||||
const fresh = layoutNodes.find(ln => ln.id === n.id);
|
||||
if (!fresh) return n;
|
||||
const savedPos = layoutSeed.positions[n.id];
|
||||
const dragOver = (n.data as StrategyFlowNodeData).dragOver;
|
||||
const activeSourceSide = (n.data as StrategyFlowNodeData).activeSourceSide;
|
||||
return {
|
||||
...n,
|
||||
position: savedPos ? { x: savedPos.x, y: savedPos.y } : fresh.position,
|
||||
data: fresh.data,
|
||||
data: {
|
||||
...fresh.data,
|
||||
...(dragOver ? { dragOver, activeSourceSide } : {}),
|
||||
},
|
||||
};
|
||||
}));
|
||||
setEdges(mergedEdges);
|
||||
@@ -1226,7 +1238,10 @@ function StrategyEditorCanvasInner({
|
||||
)
|
||||
), [root, orphans]);
|
||||
|
||||
const isPaletteDrag = (e: React.DragEvent) => isPaletteHtmlDrag(e);
|
||||
const isPaletteDrag = useCallback(
|
||||
(e: React.DragEvent) => isPaletteHtmlDragActive() || isPaletteHtmlDrag(e),
|
||||
[],
|
||||
);
|
||||
|
||||
const applyPaletteDropAt = useCallback((
|
||||
data: { type: string; value: string; label: string; composite?: boolean },
|
||||
@@ -1291,11 +1306,8 @@ function StrategyEditorCanvasInner({
|
||||
e.preventDefault();
|
||||
const { flowPos, anchorId } = resolveDropFromClientRef.current(e.clientX, e.clientY);
|
||||
if (anchorId) {
|
||||
const sideKey = `${anchorId}:${Math.round(flowPos.x / 8)}:${Math.round(flowPos.y / 8)}`;
|
||||
if (sideKey === lastPreviewKeyRef.current) return;
|
||||
lastPreviewKeyRef.current = sideKey;
|
||||
lastPreviewAnchorRef.current = anchorId;
|
||||
updatePreviewRef.current(anchorId, flowPos);
|
||||
lastPreviewAnchorRef.current = anchorId;
|
||||
return;
|
||||
}
|
||||
if (lastPreviewAnchorRef.current != null) {
|
||||
@@ -1311,9 +1323,11 @@ function StrategyEditorCanvasInner({
|
||||
markPaletteHtmlDragEnd();
|
||||
};
|
||||
document.addEventListener('dragover', onDocDragOver, { passive: false });
|
||||
document.addEventListener('drag', onDocDragOver);
|
||||
document.addEventListener('dragend', onDocDragEnd);
|
||||
return () => {
|
||||
document.removeEventListener('dragover', onDocDragOver);
|
||||
document.removeEventListener('drag', onDocDragOver);
|
||||
document.removeEventListener('dragend', onDocDragEnd);
|
||||
};
|
||||
}, []);
|
||||
@@ -1368,14 +1382,13 @@ function StrategyEditorCanvasInner({
|
||||
const { flowPos, anchorId } = resolveDropFromClient(e.clientX, e.clientY);
|
||||
if (anchorId) {
|
||||
updateDropPreview(anchorId, flowPos);
|
||||
} else {
|
||||
clearDropPreview();
|
||||
}
|
||||
}, [resolveDropFromClient, updateDropPreview, clearDropPreview]);
|
||||
}, [resolveDropFromClient, updateDropPreview, isPaletteDrag]);
|
||||
|
||||
const onPaneDragLeave = useCallback((e: React.DragEvent) => {
|
||||
const rel = e.relatedTarget as Element | null;
|
||||
if (rel && e.currentTarget.contains(rel)) return;
|
||||
if (!rel) return;
|
||||
if (e.currentTarget.contains(rel)) return;
|
||||
clearDropPreview();
|
||||
}, [clearDropPreview]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user