@tolokoban/ui
Version:
React components with theme
50 lines • 3.44 kB
JavaScript
import React from "react";
export function useUndoableState(defaultValue) {
const [value, setValue] = React.useState(defaultValue);
const refManager = React.useRef(new Manager(value, setValue));
return [
value,
(value) => {
refManager.current.add(value);
},
refManager.current,
];
}
class Manager {
constructor(defaultValue, setValue) {
this.setValue = setValue;
this.list = [];
/**
* Points to the last inserted value.
* Which is the current value.
*/
this.cursor = -1;
this.canUndo = () => {
return this.cursor > 0;
};
this.canRedo = () => {
return this.cursor < this.list.length - 1;
};
this.undo = () => {
if (!this.canUndo())
return;
this.cursor--;
this.setValue(this.list[this.cursor]);
};
this.redo = () => {
if (!this.canRedo())
return;
this.cursor++;
this.setValue(this.list[this.cursor]);
};
this.list.push(defaultValue);
this.cursor = 0;
}
add(value) {
this.cursor++;
this.list.splice(this.cursor);
this.list.push(value);
this.setValue(value);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kb2FibGUtc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdW5kb2FibGUtc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBRXpCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsWUFBa0I7SUFFbEIsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3RELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDN0QsT0FBTztRQUNILEtBQUs7UUFDTCxDQUFDLEtBQVcsRUFBRSxFQUFFO1lBQ1osVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakMsQ0FBQztRQUNELFVBQVUsQ0FBQyxPQUFPO0tBQ3JCLENBQUE7QUFDTCxDQUFDO0FBU0QsTUFBTSxPQUFPO0lBUVQsWUFDSSxZQUFrQixFQUNELFFBQStCO1FBQS9CLGFBQVEsR0FBUixRQUFRLENBQXVCO1FBVG5DLFNBQUksR0FBVyxFQUFFLENBQUE7UUFDbEM7OztXQUdHO1FBQ0ssV0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBVVYsWUFBTyxHQUFHLEdBQUcsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQzFCLENBQUMsQ0FBQTtRQUVRLFlBQU8sR0FBRyxHQUFHLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUM3QyxDQUFDLENBQUE7UUFFUSxTQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUFFLE9BQU07WUFFM0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1lBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3pDLENBQUMsQ0FBQTtRQUVRLFNBQUksR0FBRyxHQUFHLEVBQUU7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQUUsT0FBTTtZQUUzQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDYixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDekMsQ0FBQyxDQUFBO1FBeEJHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO0lBQ25CLENBQUM7SUF3QkQsR0FBRyxDQUFDLEtBQVc7UUFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4QixDQUFDO0NBQ0oifQ==