UNPKG

@tolokoban/ui

Version:

React components with theme

50 lines 3.44 kB
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==