|  | @@ -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({
 |