All files / src/packlets/editor-core/slices history-slice.ts

85% Statements 17/20
50% Branches 3/6
100% Functions 3/3
94.44% Lines 17/18

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,
    });
  }
}