-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
49 lines (43 loc) · 1.46 KB
/
index.ts
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
47
48
49
import { useCallback } from "react";
import { useState } from "react";
export default function useUndo<T>(initialCommands: T[]) {
const [commands, setCommands] = useState<T[]>(initialCommands);
const [undoneCommands, setUndoneCommands] = useState<T[]>([]);
const addCommand = (commandOrCallback: T | ((prevCommands: T[]) => T[])) => {
if (commandOrCallback instanceof Function) {
setCommands((prevCommands) => commandOrCallback(prevCommands));
} else {
setCommands((prevCommands) => [...prevCommands, commandOrCallback]);
setUndoneCommands([]);
}
};
const redo = () => {
// Implement redo logic here
setUndoneCommands((prevUndoCommands) => {
const lastUndoneCommand = prevUndoCommands[prevUndoCommands.length - 1];
setCommands((prevCommands) => [...prevCommands, lastUndoneCommand]);
return undoneCommands.slice(0, -1);
});
};
const undo = () => {
console.log("undo");
setCommands((prevCommands) => {
const lastCommand = prevCommands[prevCommands.length - 1];
setUndoneCommands((prevUndoneCommands) => [
...prevUndoneCommands,
lastCommand,
]);
return prevCommands.slice(0, commands.length - 1);
});
};
const reset = () => {
setCommands(initialCommands);
setUndoneCommands([]);
};
const clear = () => {
setCommands([]);
setUndoneCommands([]);
};
console.log(commands);
return { commands, addCommand, redo, undo, reset, clear };
}