Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 1x 51x 10x 10x 10x 10x 10x 4x 4x 4x 4x 4x 1x 1x 1x 1x 1x | import { atom } from "nanostores";
import { Slice } from "../slice";
import { HISTORY_LIMIT } from "../types";
import type { UserAction } from "../types";
export class HistorySlice extends Slice {
static readonly sliceKey = "history";
$history = atom<{ undo: UserAction[]; redo: UserAction[] }>({
undo: [],
redo: [],
});
applyAction(action: UserAction): void {
action.do();
const history = this.$history.get();
const undo = [...history.undo, action];
Iif (undo.length > HISTORY_LIMIT) {
undo.shift();
}
this.$history.set({ undo, redo: [] });
}
undo(): void {
const history = this.$history.get();
const action = history.undo.pop();
Iif (!action) return;
action.undo();
this.$history.set({
undo: history.undo,
redo: [...history.redo, action],
});
}
redo(): void {
const history = this.$history.get();
const action = history.redo.pop();
Iif (!action) return;
action.do();
this.$history.set({
undo: [...history.undo, action],
redo: history.redo,
});
}
}
|