Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

history.ts 1.5KB

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