Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

history.ts 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { Data } from 'types'
  2. import * as gtag from 'utils/gtag'
  3. import { BaseCommand } from './commands/command'
  4. import storage from './storage'
  5. // A singleton to manage history changes.
  6. class History<T extends Data> {
  7. private stack: BaseCommand<T>[] = []
  8. private pointer = -1
  9. private maxLength = 100
  10. private _enabled = true
  11. execute = (data: T, command: BaseCommand<T>) => {
  12. gtag.event({
  13. action: command.name,
  14. category: command.category,
  15. label: '',
  16. value: 0,
  17. })
  18. command.redo(data, true)
  19. if (this.disabled) return
  20. this.stack = this.stack.slice(0, this.pointer + 1)
  21. this.stack.push(command)
  22. this.pointer++
  23. if (this.stack.length > this.maxLength) {
  24. this.stack = this.stack.slice(this.stack.length - this.maxLength)
  25. this.pointer = this.maxLength - 1
  26. }
  27. storage.savePage(data)
  28. }
  29. undo = (data: T) => {
  30. if (this.pointer === -1) return
  31. const command = this.stack[this.pointer]
  32. command.undo(data)
  33. if (this.disabled) return
  34. this.pointer--
  35. storage.savePage(data)
  36. }
  37. redo = (data: T) => {
  38. if (this.pointer === this.stack.length - 1) return
  39. const command = this.stack[this.pointer + 1]
  40. command.redo(data, false)
  41. if (this.disabled) return
  42. this.pointer++
  43. storage.savePage(data)
  44. }
  45. disable = () => {
  46. this._enabled = false
  47. }
  48. enable = () => {
  49. this._enabled = true
  50. }
  51. pop() {
  52. if (this.stack.length > 0) {
  53. this.stack.pop()
  54. this.pointer--
  55. }
  56. }
  57. reset() {
  58. this.stack = []
  59. this.pointer = -1
  60. this.maxLength = 100
  61. this._enabled = true
  62. }
  63. get disabled() {
  64. return !this._enabled
  65. }
  66. }
  67. export default new History()