Fix history - the 2nd installment (#1014)

* don't regenerate versionNonce on pushEntry

* fix history handling around multi-point arrows

* remove filtering from getElementMap helper
This commit is contained in:
David Luzar 2020-03-19 19:41:32 +01:00 committed by GitHub
parent 1d393a4ea0
commit fda06e4fc3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 13 deletions

View File

@ -332,7 +332,7 @@ export class App extends React.Component<any, AppState> {
}
return elements;
}, [] as any)
}, [] as Mutable<typeof restoredState.elements>)
// add local elements that weren't deleted or on remote
.concat(...Object.values(localElementMap)),
);

View File

@ -41,7 +41,7 @@ export function getSyncableElements(elements: readonly ExcalidrawElement[]) {
}
export function getElementMap(elements: readonly ExcalidrawElement[]) {
return getSyncableElements(elements).reduce(
return elements.reduce(
(acc: { [key: string]: ExcalidrawElement }, element: ExcalidrawElement) => {
acc[element.id] = element;
return acc;

View File

@ -53,8 +53,8 @@ export function newElementWith<TElement extends ExcalidrawElement>(
): TElement {
return {
...element,
...updates,
version: element.version + 1,
versionNonce: randomSeed(),
...updates,
};
}

View File

@ -25,17 +25,41 @@ export class SceneHistory {
) {
return JSON.stringify({
appState: clearAppStatePropertiesForHistory(appState),
elements: elements.map(element => {
if (isLinearElement(element)) {
return newElementWith(element, {
points:
appState.multiElement && appState.multiElement.id === element.id
? element.points.slice(0, -1)
: element.points,
});
elements: elements.reduce((elements, element) => {
if (
isLinearElement(element) &&
appState.multiElement &&
appState.multiElement.id === element.id
) {
// don't store multi-point arrow if still has only one point
if (
appState.multiElement &&
appState.multiElement.id === element.id &&
element.points.length < 2
) {
return elements;
}
elements.push(
newElementWith(element, {
// don't store last point if not committed
points:
element.lastCommittedPoint !==
element.points[element.points.length - 1]
? element.points.slice(0, -1)
: element.points,
// don't regenerate versionNonce else this will short-circuit our
// bail-on-no-change logic in pushEntry()
versionNonce: element.versionNonce,
}),
);
} else {
elements.push(
newElementWith(element, { versionNonce: element.versionNonce }),
);
}
return newElementWith(element, {});
}),
return elements;
}, [] as Mutable<typeof elements>),
});
}