|
@@ -96,6 +96,7 @@ languageDetector.init({
|
|
|
|
|
|
const initializeScene = async (opts: {
|
|
|
collabAPI: CollabAPI;
|
|
|
+ excalidrawAPI: ExcalidrawImperativeAPI;
|
|
|
}): Promise<
|
|
|
{ scene: ExcalidrawInitialDataState | null } & (
|
|
|
| { isExternalScene: true; id: string; key: string }
|
|
@@ -180,8 +181,28 @@ const initializeScene = async (opts: {
|
|
|
}
|
|
|
|
|
|
if (roomLinkData) {
|
|
|
+ const { excalidrawAPI } = opts;
|
|
|
+
|
|
|
+ const scene = await opts.collabAPI.startCollaboration(roomLinkData);
|
|
|
+
|
|
|
return {
|
|
|
- scene: await opts.collabAPI.startCollaboration(roomLinkData),
|
|
|
+ // when collaborating, the state may have already been updated at this
|
|
|
+ // point (we may have received updates from other clients), so reconcile
|
|
|
+ // elements and appState with existing state
|
|
|
+ scene: {
|
|
|
+ ...scene,
|
|
|
+ appState: {
|
|
|
+ ...restoreAppState(scene?.appState, excalidrawAPI.getAppState()),
|
|
|
+ // necessary if we're invoking from a hashchange handler which doesn't
|
|
|
+ // go through App.initializeScene() that resets this flag
|
|
|
+ isLoading: false,
|
|
|
+ },
|
|
|
+ elements: reconcileElements(
|
|
|
+ scene?.elements || [],
|
|
|
+ excalidrawAPI.getSceneElementsIncludingDeleted(),
|
|
|
+ excalidrawAPI.getAppState(),
|
|
|
+ ),
|
|
|
+ },
|
|
|
isExternalScene: true,
|
|
|
id: roomLinkData.roomId,
|
|
|
key: roomLinkData.roomKey,
|
|
@@ -335,23 +356,9 @@ const ExcalidrawWrapper = () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- initializeScene({ collabAPI }).then(async (data) => {
|
|
|
+ initializeScene({ collabAPI, excalidrawAPI }).then(async (data) => {
|
|
|
loadImages(data, /* isInitialLoad */ true);
|
|
|
-
|
|
|
- initialStatePromiseRef.current.promise.resolve({
|
|
|
- ...data.scene,
|
|
|
- // at this point the state may have already been updated (e.g. when
|
|
|
- // collaborating, we may have received updates from other clients)
|
|
|
- appState: restoreAppState(
|
|
|
- data.scene?.appState,
|
|
|
- excalidrawAPI.getAppState(),
|
|
|
- ),
|
|
|
- elements: reconcileElements(
|
|
|
- data.scene?.elements || [],
|
|
|
- excalidrawAPI.getSceneElementsIncludingDeleted(),
|
|
|
- excalidrawAPI.getAppState(),
|
|
|
- ),
|
|
|
- });
|
|
|
+ initialStatePromiseRef.current.promise.resolve(data.scene);
|
|
|
});
|
|
|
|
|
|
const onHashChange = async (event: HashChangeEvent) => {
|
|
@@ -366,7 +373,7 @@ const ExcalidrawWrapper = () => {
|
|
|
}
|
|
|
excalidrawAPI.updateScene({ appState: { isLoading: true } });
|
|
|
|
|
|
- initializeScene({ collabAPI }).then((data) => {
|
|
|
+ initializeScene({ collabAPI, excalidrawAPI }).then((data) => {
|
|
|
loadImages(data);
|
|
|
if (data.scene) {
|
|
|
excalidrawAPI.updateScene({
|