Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CI / CI OK (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
48 lines
988 B
TypeScript
48 lines
988 B
TypeScript
import { ref } from 'vue';
|
|
|
|
import type { SpreadsheetCommand } from '../types';
|
|
|
|
const MAX_STACK = 100;
|
|
|
|
export function useUndoRedo() {
|
|
const undoStack = ref<SpreadsheetCommand[]>([]);
|
|
const redoStack = ref<SpreadsheetCommand[]>([]);
|
|
|
|
function push(cmd: SpreadsheetCommand) {
|
|
undoStack.value.push(cmd);
|
|
if (undoStack.value.length > MAX_STACK) {
|
|
undoStack.value.shift();
|
|
}
|
|
redoStack.value = [];
|
|
}
|
|
|
|
async function undo() {
|
|
const cmd = undoStack.value.pop();
|
|
if (!cmd) return;
|
|
await cmd.undo();
|
|
redoStack.value.push(cmd);
|
|
}
|
|
|
|
async function redo() {
|
|
const cmd = redoStack.value.pop();
|
|
if (!cmd) return;
|
|
await cmd.redo();
|
|
undoStack.value.push(cmd);
|
|
}
|
|
|
|
function canUndo() {
|
|
return undoStack.value.length > 0;
|
|
}
|
|
|
|
function canRedo() {
|
|
return redoStack.value.length > 0;
|
|
}
|
|
|
|
function clear() {
|
|
undoStack.value = [];
|
|
redoStack.value = [];
|
|
}
|
|
|
|
return { push, undo, redo, canUndo, canRedo, clear };
|
|
}
|