mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-16 19:33:11 +02:00
Ground work for page editor
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
import { useState, useCallback } from 'react';
|
||||
|
||||
export interface Command {
|
||||
execute(): void;
|
||||
undo(): void;
|
||||
description: string;
|
||||
}
|
||||
|
||||
export interface CommandSequence {
|
||||
commands: Command[];
|
||||
execute(): void;
|
||||
undo(): void;
|
||||
description: string;
|
||||
}
|
||||
|
||||
export function useUndoRedo() {
|
||||
const [undoStack, setUndoStack] = useState<(Command | CommandSequence)[]>([]);
|
||||
const [redoStack, setRedoStack] = useState<(Command | CommandSequence)[]>([]);
|
||||
|
||||
const executeCommand = useCallback((command: Command | CommandSequence) => {
|
||||
command.execute();
|
||||
setUndoStack(prev => [command, ...prev]);
|
||||
setRedoStack([]); // Clear redo stack when new command is executed
|
||||
}, []);
|
||||
|
||||
const undo = useCallback(() => {
|
||||
if (undoStack.length === 0) return false;
|
||||
|
||||
const command = undoStack[0];
|
||||
command.undo();
|
||||
|
||||
setUndoStack(prev => prev.slice(1));
|
||||
setRedoStack(prev => [command, ...prev]);
|
||||
|
||||
return true;
|
||||
}, [undoStack]);
|
||||
|
||||
const redo = useCallback(() => {
|
||||
if (redoStack.length === 0) return false;
|
||||
|
||||
const command = redoStack[0];
|
||||
command.execute();
|
||||
|
||||
setRedoStack(prev => prev.slice(1));
|
||||
setUndoStack(prev => [command, ...prev]);
|
||||
|
||||
return true;
|
||||
}, [redoStack]);
|
||||
|
||||
const clear = useCallback(() => {
|
||||
setUndoStack([]);
|
||||
setRedoStack([]);
|
||||
}, []);
|
||||
|
||||
const canUndo = undoStack.length > 0;
|
||||
const canRedo = redoStack.length > 0;
|
||||
|
||||
return {
|
||||
executeCommand,
|
||||
undo,
|
||||
redo,
|
||||
clear,
|
||||
canUndo,
|
||||
canRedo,
|
||||
undoStack,
|
||||
redoStack
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user