Fixed unnecessary updates

This commit is contained in:
Lucas Oliveira 2023-11-28 20:31:27 -03:00
commit 733e6945c6
2 changed files with 19 additions and 45 deletions

View file

@ -418,7 +418,7 @@ export function FlowsProvider({ children }: { children: ReactNode }) {
const insidePosition = position.paneX const insidePosition = position.paneX
? { x: position.paneX + position.x, y: position.paneY! + position.y } ? { x: position.paneX + position.x, y: position.paneY! + position.y }
: reactFlowInstance!.project({ x: position.x, y: position.y }); : reactFlowInstance!.screenToFlowPosition({ x: position.x, y: position.y });
selectionInstance.nodes.forEach((node: NodeType) => { selectionInstance.nodes.forEach((node: NodeType) => {
// Generate a unique node ID // Generate a unique node ID

View file

@ -85,17 +85,11 @@ export default function Page({
const { takeSnapshot } = useContext(undoRedoContext); const { takeSnapshot } = useContext(undoRedoContext);
const [position, setPosition] = useState({ x: 0, y: 0 }); const [position, setPosition] = useState({ x: 0, y: 0 });
const [lastSelection, setLastSelection] = const [lastSelection, setLastSelection] =
useState<OnSelectionChangeParams | null>(null); useState<OnSelectionChangeParams | null>(null);
useEffect(() => { useEffect(() => {
console.log("1")
// this effect is used to attach the global event handlers
const onKeyDown = (event: KeyboardEvent) => { const onKeyDown = (event: KeyboardEvent) => {
if (!isWrappedWithClass(event, "nocopy")) { if (!isWrappedWithClass(event, "nocopy")) {
if ( if (
@ -112,10 +106,9 @@ export default function Page({
lastCopiedSelection lastCopiedSelection
) { ) {
event.preventDefault(); event.preventDefault();
let bounds = reactFlowWrapper.current?.getBoundingClientRect();
paste(lastCopiedSelection, { paste(lastCopiedSelection, {
x: position.x - bounds!.left, x: position.x,
y: position.y - bounds!.top, y: position.y,
}); });
} }
if ( if (
@ -137,18 +130,26 @@ export default function Page({
} }
} }
}; };
document.addEventListener("keydown", onKeyDown);
return () => {
document.removeEventListener("keydown", onKeyDown);
};
}, [lastCopiedSelection, lastSelection]);
useEffect(() => {
const handleMouseMove = (event) => { const handleMouseMove = (event) => {
setPosition({ x: event.clientX, y: event.clientY }); setPosition({ x: event.clientX, y: event.clientY });
}; };
document.addEventListener("keydown", onKeyDown);
document.addEventListener("mousemove", handleMouseMove); document.addEventListener("mousemove", handleMouseMove);
return () => { return () => {
document.removeEventListener("keydown", onKeyDown);
document.removeEventListener("mousemove", handleMouseMove); document.removeEventListener("mousemove", handleMouseMove);
}; };
}, [position, lastCopiedSelection, lastSelection]); }, [position]);
const [selectionMenuVisible, setSelectionMenuVisible] = useState(false); const [selectionMenuVisible, setSelectionMenuVisible] = useState(false);
const { setExtraComponent, setExtraNavigation } = useContext(locationContext); const { setExtraComponent, setExtraNavigation } = useContext(locationContext);
@ -165,33 +166,21 @@ export default function Page({
//update flow when tabs change //update flow when tabs change
useEffect(() => { useEffect(() => {
console.log("2")
setNodes(flow?.data?.nodes ?? []); setNodes(flow?.data?.nodes ?? []);
setEdges(flow?.data?.edges ?? []); setEdges(flow?.data?.edges ?? []);
if (reactFlowInstance) { if (reactFlowInstance) {
setViewport(flow?.data?.viewport ?? { x: 1, y: 0, zoom: 0.5 }); setViewport(flow?.data?.viewport ?? { x: 1, y: 0, zoom: 0.5 });
} }
}, [flow, reactFlowInstance]); }, [flow, reactFlowInstance]);
//set extra sidebar
useEffect(() => {
console.log("3")
setExtraComponent(<ExtraSidebar />);
setExtraNavigation({ title: "Components" });
}, [setExtraComponent, setExtraNavigation]);
const [seconds, setSeconds] = useState(0);
useEffect(() => { useEffect(() => {
console.log("4")
const index = flows.findIndex((flowId) => flowId.id === flow.id); const index = flows.findIndex((flowId) => flowId.id === flow.id);
const interval = setInterval(() => { const interval = setInterval(() => {
saveFlow( saveFlow(
{ {
...flows[index]!, ...flows[index]!,
data: reactFlowInstance data: reactFlowInstance ? reactFlowInstance!.toObject() : flow!.data,
? reactFlowInstance!.toObject()
: flow!.data,
}, },
true true
); );
@ -204,8 +193,7 @@ export default function Page({
const onEdgesChangeMod = useCallback( const onEdgesChangeMod = useCallback(
(change: EdgeChange[]) => { (change: EdgeChange[]) => {
console.log("5") updateFlow({
updateFlow({
...flow!, ...flow!,
data: reactFlowInstance ? reactFlowInstance!.toObject() : flow!.data, data: reactFlowInstance ? reactFlowInstance!.toObject() : flow!.data,
}); });
@ -226,7 +214,6 @@ export default function Page({
const onNodesChangeMod = useCallback( const onNodesChangeMod = useCallback(
(change: NodeChange[]) => { (change: NodeChange[]) => {
console.log("6")
onNodesChange(change); onNodesChange(change);
//@ts-ignore //@ts-ignore
setTabsState((prev: FlowsState) => { setTabsState((prev: FlowsState) => {
@ -244,7 +231,6 @@ export default function Page({
const onConnect = useCallback( const onConnect = useCallback(
(params: Connection) => { (params: Connection) => {
console.log("7")
takeSnapshot(); takeSnapshot();
setEdges((eds) => setEdges((eds) =>
addEdge( addEdge(
@ -276,26 +262,22 @@ export default function Page({
); );
const onNodeDragStart: NodeDragHandler = useCallback(() => { const onNodeDragStart: NodeDragHandler = useCallback(() => {
console.log("8")
// 👇 make dragging a node undoable // 👇 make dragging a node undoable
takeSnapshot(); takeSnapshot();
// 👉 you can place your event handlers here // 👉 you can place your event handlers here
}, [takeSnapshot]); }, [takeSnapshot]);
const onSelectionDragStart: SelectionDragHandler = useCallback(() => { const onSelectionDragStart: SelectionDragHandler = useCallback(() => {
console.log("9")
// 👇 make dragging a selection undoable // 👇 make dragging a selection undoable
takeSnapshot(); takeSnapshot();
}, [takeSnapshot]); }, [takeSnapshot]);
const onEdgesDelete: OnEdgesDelete = useCallback(() => { const onEdgesDelete: OnEdgesDelete = useCallback(() => {
console.log("10")
// 👇 make deleting edges undoable // 👇 make deleting edges undoable
takeSnapshot(); takeSnapshot();
}, [takeSnapshot]); }, [takeSnapshot]);
const onDragOver = useCallback((event: React.DragEvent) => { const onDragOver = useCallback((event: React.DragEvent) => {
console.log("11")
event.preventDefault(); event.preventDefault();
if (event.dataTransfer.types.some((types) => types === "nodedata")) { if (event.dataTransfer.types.some((types) => types === "nodedata")) {
event.dataTransfer.dropEffect = "move"; event.dataTransfer.dropEffect = "move";
@ -306,7 +288,6 @@ export default function Page({
const onDrop = useCallback( const onDrop = useCallback(
(event: React.DragEvent) => { (event: React.DragEvent) => {
console.log("12")
event.preventDefault(); event.preventDefault();
if (event.dataTransfer.types.some((types) => types === "nodedata")) { if (event.dataTransfer.types.some((types) => types === "nodedata")) {
takeSnapshot(); takeSnapshot();
@ -383,7 +364,9 @@ export default function Page({
); );
useEffect(() => { useEffect(() => {
console.log("13") setExtraComponent(<ExtraSidebar />);
setExtraNavigation({ title: "Components" });
return () => { return () => {
if (tabsState && tabsState[flow.id]?.isPending) { if (tabsState && tabsState[flow.id]?.isPending) {
saveFlow({ saveFlow({
@ -396,7 +379,6 @@ export default function Page({
const onDelete = useCallback( const onDelete = useCallback(
(mynodes: Node[]) => { (mynodes: Node[]) => {
console.log("14")
takeSnapshot(); takeSnapshot();
setEdges( setEdges(
edges.filter( edges.filter(
@ -411,13 +393,11 @@ export default function Page({
); );
const onEdgeUpdateStart = useCallback(() => { const onEdgeUpdateStart = useCallback(() => {
console.log("15")
edgeUpdateSuccessful.current = false; edgeUpdateSuccessful.current = false;
}, []); }, []);
const onEdgeUpdate = useCallback( const onEdgeUpdate = useCallback(
(oldEdge: Edge, newConnection: Connection) => { (oldEdge: Edge, newConnection: Connection) => {
console.log("16")
if (isValidConnection(newConnection, reactFlowInstance!)) { if (isValidConnection(newConnection, reactFlowInstance!)) {
edgeUpdateSuccessful.current = true; edgeUpdateSuccessful.current = true;
setEdges((els) => updateEdge(oldEdge, newConnection, els)); setEdges((els) => updateEdge(oldEdge, newConnection, els));
@ -427,7 +407,6 @@ export default function Page({
); );
const onEdgeUpdateEnd = useCallback((_, edge: Edge): void => { const onEdgeUpdateEnd = useCallback((_, edge: Edge): void => {
console.log("17")
if (!edgeUpdateSuccessful.current) { if (!edgeUpdateSuccessful.current) {
setEdges((eds) => eds.filter((edg) => edg.id !== edge.id)); setEdges((eds) => eds.filter((edg) => edg.id !== edge.id));
} }
@ -437,18 +416,15 @@ export default function Page({
const [selectionEnded, setSelectionEnded] = useState(true); const [selectionEnded, setSelectionEnded] = useState(true);
const onSelectionEnd = useCallback(() => { const onSelectionEnd = useCallback(() => {
console.log("18")
setSelectionEnded(true); setSelectionEnded(true);
}, []); }, []);
const onSelectionStart = useCallback((event: MouseEvent) => { const onSelectionStart = useCallback((event: MouseEvent) => {
console.log("19")
event.preventDefault(); event.preventDefault();
setSelectionEnded(false); setSelectionEnded(false);
}, []); }, []);
// Workaround to show the menu only after the selection has ended. // Workaround to show the menu only after the selection has ended.
useEffect(() => { useEffect(() => {
console.log("20")
if (selectionEnded && lastSelection && lastSelection.nodes.length > 1) { if (selectionEnded && lastSelection && lastSelection.nodes.length > 1) {
setSelectionMenuVisible(true); setSelectionMenuVisible(true);
} else { } else {
@ -458,14 +434,12 @@ export default function Page({
const onSelectionChange = useCallback( const onSelectionChange = useCallback(
(flow: OnSelectionChangeParams): void => { (flow: OnSelectionChangeParams): void => {
console.log("21")
setLastSelection(flow); setLastSelection(flow);
}, },
[] []
); );
const onPaneClick = useCallback((flow) => { const onPaneClick = useCallback((flow) => {
console.log("22")
setFilterEdge([]); setFilterEdge([]);
}, []); }, []);