|
@@ -365,38 +365,56 @@ export const useHandleLibrary = ({
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const importLibraryFromURL = ({
|
|
|
+ const importLibraryFromURL = async ({
|
|
|
libraryUrl,
|
|
|
idToken,
|
|
|
}: {
|
|
|
libraryUrl: string;
|
|
|
idToken: string | null;
|
|
|
}) => {
|
|
|
- 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()}`);
|
|
|
- }
|
|
|
-
|
|
|
- excalidrawAPI.updateLibrary({
|
|
|
- libraryItems: new Promise<Blob>(async (resolve, reject) => {
|
|
|
- try {
|
|
|
- const request = await fetch(decodeURIComponent(libraryUrl));
|
|
|
- const blob = await request.blob();
|
|
|
- resolve(blob);
|
|
|
- } catch (error: any) {
|
|
|
- reject(error);
|
|
|
- }
|
|
|
- }),
|
|
|
- prompt: idToken !== excalidrawAPI.id,
|
|
|
- merge: true,
|
|
|
- defaultStatus: "published",
|
|
|
- openLibraryMenu: true,
|
|
|
+ const libraryPromise = new Promise<Blob>(async (resolve, reject) => {
|
|
|
+ try {
|
|
|
+ const request = await fetch(decodeURIComponent(libraryUrl));
|
|
|
+ const blob = await request.blob();
|
|
|
+ resolve(blob);
|
|
|
+ } catch (error: any) {
|
|
|
+ reject(error);
|
|
|
+ }
|
|
|
});
|
|
|
+
|
|
|
+ const shouldPrompt = idToken !== excalidrawAPI.id;
|
|
|
+
|
|
|
+ // wait for the tab to be focused before continuing in case we'll prompt
|
|
|
+ // for confirmation
|
|
|
+ await (shouldPrompt && document.hidden
|
|
|
+ ? new Promise<void>((resolve) => {
|
|
|
+ window.addEventListener("focus", () => resolve(), {
|
|
|
+ once: true,
|
|
|
+ });
|
|
|
+ })
|
|
|
+ : null);
|
|
|
+
|
|
|
+ try {
|
|
|
+ await excalidrawAPI.updateLibrary({
|
|
|
+ libraryItems: libraryPromise,
|
|
|
+ prompt: shouldPrompt,
|
|
|
+ merge: true,
|
|
|
+ defaultStatus: "published",
|
|
|
+ openLibraryMenu: true,
|
|
|
+ });
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ } finally {
|
|
|
+ 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()}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
};
|
|
|
const onHashChange = (event: HashChangeEvent) => {
|
|
|
event.preventDefault();
|