@ -13,6 +13,7 @@ import { ExcalidrawImperativeAPI } from "../components/App";
import { ErrorDialog } from "../components/ErrorDialog" ;
import { TopErrorBoundary } from "../components/TopErrorBoundary" ;
import { APP_NAME , EVENT , TITLE_TIMEOUT , VERSION_TIMEOUT } from "../constants" ;
import { loadFromBlob } from "../data/blob" ;
import { DataState , ImportedDataState } from "../data/types" ;
import {
ExcalidrawElement ,
@ -69,9 +70,10 @@ const initializeScene = async (opts: {
} ) : Promise < ImportedDataState | null > = > {
const searchParams = new URLSearchParams ( window . location . search ) ;
const id = searchParams . get ( "id" ) ;
const json Match = window . location . hash . match (
const json Backend Match = window . location . hash . match (
/^#json=([0-9]+),([a-zA-Z0-9_-]+)$/ ,
) ;
const externalUrlMatch = window . location . hash . match ( /^#url=(.*)$/ ) ;
const initialData = importFromLocalStorage ( ) ;
@ -82,7 +84,7 @@ const initializeScene = async (opts: {
) ;
let roomLinkData = getCollaborationLinkData ( window . location . href ) ;
const isExternalScene = ! ! ( id || json Match || roomLinkData ) ;
const isExternalScene = ! ! ( id || json Backend Match || roomLinkData ) ;
if ( isExternalScene ) {
if (
// don't prompt if scene is empty
@ -95,8 +97,12 @@ const initializeScene = async (opts: {
// Backwards compatibility with legacy url format
if ( id ) {
scene = await loadScene ( id , null , initialData ) ;
} else if ( jsonMatch ) {
scene = await loadScene ( jsonMatch [ 1 ] , jsonMatch [ 2 ] , initialData ) ;
} else if ( jsonBackendMatch ) {
scene = await loadScene (
jsonBackendMatch [ 1 ] ,
jsonBackendMatch [ 2 ] ,
initialData ,
) ;
}
scene . scrollToCenter = true ;
if ( ! roomLinkData ) {
@ -119,7 +125,28 @@ const initializeScene = async (opts: {
roomLinkData = null ;
window . history . replaceState ( { } , APP_NAME , window . location . origin ) ;
}
} else if ( externalUrlMatch ) {
window . history . replaceState ( { } , APP_NAME , window . location . origin ) ;
const url = externalUrlMatch [ 1 ] ;
try {
const request = await fetch ( window . decodeURIComponent ( url ) ) ;
const data = await loadFromBlob ( await request . blob ( ) , null ) ;
if (
! scene . elements . length ||
window . confirm ( t ( "alerts.loadSceneOverridePrompt" ) )
) {
return data ;
}
} catch ( error ) {
return {
appState : {
errorMessage : t ( "alerts.invalidSceneUrl" ) ,
} ,
} ;
}
}
if ( roomLinkData ) {
return opts . collabAPI . initializeSocketClient ( roomLinkData ) ;
} else if ( scene ) {