One-click installable libraries (#2179)
Co-authored-by: dwelle <luzar.david@gmail.com>
This commit is contained in:
parent
6b7516bc3c
commit
8ab9ffbe28
@ -175,6 +175,7 @@ import {
|
|||||||
} from "../element/binding";
|
} from "../element/binding";
|
||||||
import { MaybeTransformHandleType } from "../element/transformHandles";
|
import { MaybeTransformHandleType } from "../element/transformHandles";
|
||||||
import { renderSpreadsheet } from "../charts";
|
import { renderSpreadsheet } from "../charts";
|
||||||
|
import { isValidLibrary } from "../data/json";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param func handler taking at most single parameter (event).
|
* @param func handler taking at most single parameter (event).
|
||||||
@ -492,6 +493,31 @@ class App extends React.Component<ExcalidrawProps, AppState> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private addToLibrary = async (url: string) => {
|
||||||
|
window.history.replaceState({}, "Excalidraw", window.location.origin);
|
||||||
|
try {
|
||||||
|
const request = await fetch(url);
|
||||||
|
const blob = await request.blob();
|
||||||
|
const json = JSON.parse(await blob.text());
|
||||||
|
if (!isValidLibrary(json)) {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
window.confirm(
|
||||||
|
t("alerts.confirmAddLibrary", { numShapes: json.library.length }),
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
await Library.importLibrary(blob);
|
||||||
|
this.setState({
|
||||||
|
isLibraryOpen: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
window.alert(t("alerts.errorLoadingLibrary"));
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private initializeScene = async () => {
|
private initializeScene = async () => {
|
||||||
if ("launchQueue" in window && "LaunchParams" in window) {
|
if ("launchQueue" in window && "LaunchParams" in window) {
|
||||||
(window as any).launchQueue.setConsumer(
|
(window as any).launchQueue.setConsumer(
|
||||||
@ -590,6 +616,12 @@ class App extends React.Component<ExcalidrawProps, AppState> {
|
|||||||
commitToHistory: true,
|
commitToHistory: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const addToLibraryUrl = searchParams.get("addLibrary");
|
||||||
|
|
||||||
|
if (addToLibraryUrl) {
|
||||||
|
await this.addToLibrary(addToLibraryUrl);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public async componentDidMount() {
|
public async componentDidMount() {
|
||||||
|
@ -54,6 +54,15 @@ export const loadFromJSON = async (appState: AppState) => {
|
|||||||
return loadFromBlob(blob, appState);
|
return loadFromBlob(blob, appState);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const isValidLibrary = (json: any) => {
|
||||||
|
return (
|
||||||
|
typeof json === "object" &&
|
||||||
|
json &&
|
||||||
|
json.type === "excalidrawlib" &&
|
||||||
|
json.version === 1
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export const saveLibraryAsJSON = async () => {
|
export const saveLibraryAsJSON = async () => {
|
||||||
const library = await loadLibrary();
|
const library = await loadLibrary();
|
||||||
const serialized = JSON.stringify(
|
const serialized = JSON.stringify(
|
||||||
|
@ -112,7 +112,9 @@
|
|||||||
"couldNotCopyToClipboard": "Couldn't copy to clipboard. Try using Chrome browser.",
|
"couldNotCopyToClipboard": "Couldn't copy to clipboard. Try using Chrome browser.",
|
||||||
"decryptFailed": "Couldn't decrypt data.",
|
"decryptFailed": "Couldn't decrypt data.",
|
||||||
"uploadedSecurly": "The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can't read the content.",
|
"uploadedSecurly": "The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can't read the content.",
|
||||||
"loadSceneOverridePrompt": "Loading external drawing will replace your existing content. Do you wish to continue?"
|
"loadSceneOverridePrompt": "Loading external drawing will replace your existing content. Do you wish to continue?",
|
||||||
|
"errorLoadingLibrary": "There was an error loading the third party library.",
|
||||||
|
"confirmAddLibrary": "This will add {{numShapes}} shape(s) to your library. Are you sure?"
|
||||||
},
|
},
|
||||||
"toolBar": {
|
"toolBar": {
|
||||||
"selection": "Selection",
|
"selection": "Selection",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user