fix: Race conditions when adding many library items (#10013)
* Fix for race condition when adding many library items * Remove unused import * Replace any with LibraryItem type * Fix comments on pr * Fix build errors * Fix hoisted variable * new mime type * duplicate before passing down to be sure * lint * fix tests * Remove unused import --------- Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
This commit is contained in:
@@ -433,6 +433,8 @@ import { findShapeByKey } from "./shapes";
|
||||
|
||||
import UnlockPopup from "./UnlockPopup";
|
||||
|
||||
import type { ExcalidrawLibraryIds } from "../data/types";
|
||||
|
||||
import type {
|
||||
RenderInteractiveSceneCallback,
|
||||
ScrollBars,
|
||||
@@ -10545,16 +10547,44 @@ class App extends React.Component<AppProps, AppState> {
|
||||
if (imageFiles.length > 0 && this.isToolSupported("image")) {
|
||||
return this.insertImages(imageFiles, sceneX, sceneY);
|
||||
}
|
||||
|
||||
const libraryJSON = dataTransferList.getData(MIME_TYPES.excalidrawlib);
|
||||
if (libraryJSON && typeof libraryJSON === "string") {
|
||||
const excalidrawLibrary_ids = dataTransferList.getData(
|
||||
MIME_TYPES.excalidrawlibIds,
|
||||
);
|
||||
const excalidrawLibrary_data = dataTransferList.getData(
|
||||
MIME_TYPES.excalidrawlib,
|
||||
);
|
||||
if (excalidrawLibrary_ids || excalidrawLibrary_data) {
|
||||
try {
|
||||
const libraryItems = parseLibraryJSON(libraryJSON);
|
||||
this.addElementsFromPasteOrLibrary({
|
||||
elements: distributeLibraryItemsOnSquareGrid(libraryItems),
|
||||
position: event,
|
||||
files: null,
|
||||
});
|
||||
let libraryItems: LibraryItems | null = null;
|
||||
if (excalidrawLibrary_ids) {
|
||||
const { itemIds } = JSON.parse(
|
||||
excalidrawLibrary_ids,
|
||||
) as ExcalidrawLibraryIds;
|
||||
const allLibraryItems = await this.library.getLatestLibrary();
|
||||
libraryItems = allLibraryItems.filter((item) =>
|
||||
itemIds.includes(item.id),
|
||||
);
|
||||
// legacy library dataTransfer format
|
||||
} else if (excalidrawLibrary_data) {
|
||||
libraryItems = parseLibraryJSON(excalidrawLibrary_data);
|
||||
}
|
||||
if (libraryItems?.length) {
|
||||
libraryItems = libraryItems.map((item) => ({
|
||||
...item,
|
||||
// #6465
|
||||
elements: duplicateElements({
|
||||
type: "everything",
|
||||
elements: item.elements,
|
||||
randomizeSeed: true,
|
||||
}).duplicatedElements,
|
||||
}));
|
||||
|
||||
this.addElementsFromPasteOrLibrary({
|
||||
elements: distributeLibraryItemsOnSquareGrid(libraryItems),
|
||||
position: event,
|
||||
files: null,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
this.setState({ errorMessage: error.message });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user