|  | @@ -58,6 +58,8 @@ import {
 | 
	
		
			
				|  |  |    TAP_TWICE_TIMEOUT,
 | 
	
		
			
				|  |  |    TEXT_TO_CENTER_SNAP_THRESHOLD,
 | 
	
		
			
				|  |  |    TOUCH_CTX_MENU_TIMEOUT,
 | 
	
		
			
				|  |  | +  URL_HASH_KEYS,
 | 
	
		
			
				|  |  | +  URL_QUERY_KEYS,
 | 
	
		
			
				|  |  |    ZOOM_STEP,
 | 
	
		
			
				|  |  |  } from "../constants";
 | 
	
		
			
				|  |  |  import { loadFromBlob } from "../data";
 | 
	
	
		
			
				|  | @@ -278,6 +280,7 @@ export type ExcalidrawImperativeAPI = {
 | 
	
		
			
				|  |  |    getSceneElements: InstanceType<typeof App>["getSceneElements"];
 | 
	
		
			
				|  |  |    getAppState: () => InstanceType<typeof App>["state"];
 | 
	
		
			
				|  |  |    setCanvasOffsets: InstanceType<typeof App>["setCanvasOffsets"];
 | 
	
		
			
				|  |  | +  importLibrary: InstanceType<typeof App>["importLibraryFromUrl"];
 | 
	
		
			
				|  |  |    readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;
 | 
	
		
			
				|  |  |    ready: true;
 | 
	
		
			
				|  |  |  };
 | 
	
	
		
			
				|  | @@ -338,6 +341,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
 | 
	
		
			
				|  |  |          getSceneElements: this.getSceneElements,
 | 
	
		
			
				|  |  |          getAppState: () => this.state,
 | 
	
		
			
				|  |  |          setCanvasOffsets: this.setCanvasOffsets,
 | 
	
		
			
				|  |  | +        importLibrary: this.importLibraryFromUrl,
 | 
	
		
			
				|  |  |        } as const;
 | 
	
		
			
				|  |  |        if (typeof excalidrawRef === "function") {
 | 
	
		
			
				|  |  |          excalidrawRef(api);
 | 
	
	
		
			
				|  | @@ -606,7 +610,16 @@ class App extends React.Component<ExcalidrawProps, AppState> {
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    private importLibraryFromUrl = async (url: string) => {
 | 
	
		
			
				|  |  | -    window.history.replaceState({}, APP_NAME, window.location.origin);
 | 
	
		
			
				|  |  | +    if (window.location.hash.includes(URL_HASH_KEYS.addLibrary)) {
 | 
	
		
			
				|  |  | +      const hash = new URLSearchParams(window.location.hash.slice(1));
 | 
	
		
			
				|  |  | +      hash.delete(URL_HASH_KEYS.addLibrary);
 | 
	
		
			
				|  |  | +      window.history.replaceState({}, APP_NAME, `#${hash.toString()}`);
 | 
	
		
			
				|  |  | +    } else if (window.location.search.includes(URL_QUERY_KEYS.addLibrary)) {
 | 
	
		
			
				|  |  | +      const query = new URLSearchParams(window.location.search);
 | 
	
		
			
				|  |  | +      query.delete(URL_QUERY_KEYS.addLibrary);
 | 
	
		
			
				|  |  | +      window.history.replaceState({}, APP_NAME, `?${query.toString()}`);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      try {
 | 
	
		
			
				|  |  |        const request = await fetch(decodeURIComponent(url));
 | 
	
		
			
				|  |  |        const blob = await request.blob();
 | 
	
	
		
			
				|  | @@ -620,9 +633,11 @@ class App extends React.Component<ExcalidrawProps, AppState> {
 | 
	
		
			
				|  |  |          )
 | 
	
		
			
				|  |  |        ) {
 | 
	
		
			
				|  |  |          await Library.importLibrary(blob);
 | 
	
		
			
				|  |  | -        this.setState({
 | 
	
		
			
				|  |  | -          isLibraryOpen: true,
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | +        // hack to rerender the library items after import
 | 
	
		
			
				|  |  | +        if (this.state.isLibraryOpen) {
 | 
	
		
			
				|  |  | +          this.setState({ isLibraryOpen: false });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        this.setState({ isLibraryOpen: true });
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      } catch (error) {
 | 
	
		
			
				|  |  |        window.alert(t("alerts.errorLoadingLibrary"));
 | 
	
	
		
			
				|  | @@ -718,12 +733,18 @@ class App extends React.Component<ExcalidrawProps, AppState> {
 | 
	
		
			
				|  |  |        commitToHistory: true,
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    const addToLibraryUrl = new URLSearchParams(window.location.search).get(
 | 
	
		
			
				|  |  | -      "addLibrary",
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | +    const libraryUrl =
 | 
	
		
			
				|  |  | +      // current
 | 
	
		
			
				|  |  | +      new URLSearchParams(window.location.hash.slice(1)).get(
 | 
	
		
			
				|  |  | +        URL_HASH_KEYS.addLibrary,
 | 
	
		
			
				|  |  | +      ) ||
 | 
	
		
			
				|  |  | +      // legacy, kept for compat reasons
 | 
	
		
			
				|  |  | +      new URLSearchParams(window.location.search).get(
 | 
	
		
			
				|  |  | +        URL_QUERY_KEYS.addLibrary,
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (addToLibraryUrl) {
 | 
	
		
			
				|  |  | -      await this.importLibraryFromUrl(addToLibraryUrl);
 | 
	
		
			
				|  |  | +    if (libraryUrl) {
 | 
	
		
			
				|  |  | +      await this.importLibraryFromUrl(libraryUrl);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 |