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); + } } }