ref: use data structure for copy and paste data

This commit is contained in:
Nicholas Tindle
2025-01-28 16:36:07 +00:00
parent 4e7b56b814
commit 06fa001a37

View File

@@ -1,6 +1,11 @@
import { useCallback } from "react";
import { Node, Edge, useReactFlow, useViewport } from "@xyflow/react";
interface CopyableData {
nodes: Node[];
edges: Edge[];
}
export function useCopyPaste(getNextNodeId: () => string) {
const { setNodes, addEdges, getNodes, getEdges } = useReactFlow();
const { x, y, zoom } = useViewport();
@@ -12,7 +17,7 @@ export function useCopyPaste(getNextNodeId: () => string) {
const selectedNodes = getNodes().filter((node) => node.selected);
const selectedEdges = getEdges().filter((edge) => edge.selected);
const copiedData = {
const copiedData: CopyableData = {
nodes: selectedNodes.map((node) => ({
...node,
data: {
@@ -28,7 +33,7 @@ export function useCopyPaste(getNextNodeId: () => string) {
if (event.key === "v" || event.key === "V") {
const copiedDataString = localStorage.getItem("copiedFlowData");
if (copiedDataString) {
const copiedData = JSON.parse(copiedDataString);
const copiedData = JSON.parse(copiedDataString) as CopyableData;
const oldToNewIdMap: Record<string, string> = {};
const viewportCenter = {
@@ -68,7 +73,7 @@ export function useCopyPaste(getNextNodeId: () => string) {
};
});
const pastedEdges = copiedData.edges.map((edge: Edge) => {
const pastedEdges = copiedData.edges.map((edge) => {
const newSourceId = oldToNewIdMap[edge.source] ?? edge.source;
const newTargetId = oldToNewIdMap[edge.target] ?? edge.target;
return {