From 1053a51f64eb5e192d71a71cbcb11e8375bf2449 Mon Sep 17 00:00:00 2001 From: Shivansh Kumar <104713531+ShivanshKumar760@users.noreply.github.com> Date: Mon, 10 Feb 2025 11:13:59 +0530 Subject: [PATCH] Race condiition fixed for fix:9104 --- excalidraw-app/share/ShareDialog.tsx | 4 +--- packages/excalidraw/components/App.tsx | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/excalidraw-app/share/ShareDialog.tsx b/excalidraw-app/share/ShareDialog.tsx index d3c8f1577..8ae211d12 100644 --- a/excalidraw-app/share/ShareDialog.tsx +++ b/excalidraw-app/share/ShareDialog.tsx @@ -165,9 +165,7 @@ const ActiveRoomDialog = ({ onClick={() => { trackEvent("share", "room closed"); collabAPI.stopCollaboration().then(() => { - if (!collabAPI.isCollaborating()) { - handleClose(); - } + handleClose(); }); }} /> diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 9699c8a8a..e8fbebcb3 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -2250,7 +2250,7 @@ class App extends React.Component { this.setState((state) => ({ ...getDefaultAppState(), isLoading: opts?.resetLoadingState ? false : state.isLoading, - theme: this.state.theme, + theme: state.theme, })); this.resetStore(); this.resetHistory(); @@ -2874,8 +2874,21 @@ class App extends React.Component { // init, which would trigger onChange with empty elements, which would then // override whatever is in localStorage currently. if (!this.state.isLoading) { - this.props.onChange?.(elements, this.state, this.files); - this.onChangeEmitter.trigger(elements, this.state, this.files); + // Only trigger onChange when there are actual changes to elements or important app state + const prevElements = this.scene.getElementsIncludingDeleted(); + const hasElementChanges = elements.length !== prevElements.length || + elements.some((element, index) => element !== prevElements[index]); + + const hasImportantStateChanges = + this.state.selectedElementIds !== prevState.selectedElementIds || + this.state.width !== prevState.width || + this.state.height !== prevState.height || + this.state.editingTextElement !== prevState.editingTextElement; + + if (hasElementChanges || hasImportantStateChanges) { + this.props.onChange?.(elements, this.state, this.files); + this.onChangeEmitter.trigger(elements, this.state, this.files); + } } }