mutations.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import { MutationTree } from 'vuex'
  2. import omit from 'lodash/omit'
  3. import { MutationTypes } from './constants'
  4. import { State } from './state'
  5. import { Slide, PPTElement, SlideTheme } from '@/types/slides'
  6. import { CreatingElement } from '@/types/edit'
  7. import { SYS_FONTS } from '@/configs/font'
  8. import { isSupportFontFamily } from '@/utils/fontFamily'
  9. interface RemoveElementPropData {
  10. id: string;
  11. propName: string | string[];
  12. }
  13. interface UpdateElementData {
  14. id: string | string[];
  15. props: Partial<PPTElement>;
  16. }
  17. export const mutations: MutationTree<State> = {
  18. // editor
  19. [MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST](state, activeElementIdList: string[]) {
  20. if (activeElementIdList.length === 1) state.handleElementId = activeElementIdList[0]
  21. else state.handleElementId = ''
  22. state.activeElementIdList = activeElementIdList
  23. },
  24. [MutationTypes.SET_HANDLE_ELEMENT_ID](state, handleElementId: string) {
  25. state.handleElementId = handleElementId
  26. },
  27. [MutationTypes.SET_CANVAS_PERCENTAGE](state, percentage: number) {
  28. state.canvasPercentage = percentage
  29. },
  30. [MutationTypes.SET_CANVAS_SCALE](state, scale: number) {
  31. state.canvasScale = scale
  32. },
  33. [MutationTypes.SET_THUMBNAILS_FOCUS](state, isFocus: boolean) {
  34. state.thumbnailsFocus = isFocus
  35. },
  36. [MutationTypes.SET_EDITORAREA_FOCUS](state, isFocus: boolean) {
  37. state.editorAreaFocus = isFocus
  38. },
  39. [MutationTypes.SET_DISABLE_HOTKEYS_STATE](state, disable: boolean) {
  40. state.disableHotkeys = disable
  41. },
  42. [MutationTypes.SET_GRID_LINES_STATE](state, show: boolean) {
  43. state.showGridLines = show
  44. },
  45. [MutationTypes.SET_CREATING_ELEMENT](state, element: CreatingElement | null) {
  46. state.creatingElement = element
  47. },
  48. [MutationTypes.SET_AVAILABLE_FONTS](state) {
  49. state.availableFonts = SYS_FONTS.filter(font => isSupportFontFamily(font.en))
  50. },
  51. [MutationTypes.SET_TOOLBAR_STATE](state, type) {
  52. state.toolbarState = type
  53. },
  54. [MutationTypes.SET_CLIPING_IMAGE_ELEMENT_ID](state, elId) {
  55. state.clipingImageElementId = elId
  56. },
  57. // slides
  58. [MutationTypes.SET_THEME](state, themeProps: Partial<SlideTheme>) {
  59. state.theme = { ...state.theme, ...themeProps }
  60. },
  61. [MutationTypes.SET_SLIDES](state, slides: Slide[]) {
  62. state.slides = slides
  63. },
  64. [MutationTypes.ADD_SLIDE](state, slide: Slide) {
  65. const addIndex = state.slideIndex + 1
  66. state.slides.splice(addIndex, 0, slide)
  67. state.slideIndex = addIndex
  68. },
  69. [MutationTypes.UPDATE_SLIDE](state, props: Partial<Slide>) {
  70. const slideIndex = state.slideIndex
  71. state.slides[slideIndex] = { ...state.slides[slideIndex], ...props }
  72. },
  73. [MutationTypes.DELETE_SLIDE](state, slideId: string) {
  74. const deleteIndex = state.slides.findIndex(item => item.id === slideId)
  75. if (deleteIndex === state.slides.length - 1) {
  76. state.slideIndex = deleteIndex - 1
  77. }
  78. state.slides.splice(deleteIndex, 1)
  79. },
  80. [MutationTypes.UPDATE_SLIDE_INDEX](state, index: number) {
  81. state.slideIndex = index
  82. },
  83. [MutationTypes.ADD_ELEMENT](state, element: PPTElement | PPTElement[]) {
  84. const elements = Array.isArray(element) ? element : [element]
  85. const currentSlideEls = state.slides[state.slideIndex].elements
  86. const newEls = [...currentSlideEls, ...elements]
  87. state.slides[state.slideIndex].elements = newEls
  88. },
  89. [MutationTypes.UPDATE_ELEMENT](state, data: UpdateElementData) {
  90. const { id, props } = data
  91. const elIdList = typeof id === 'string' ? [id] : id
  92. const slideIndex = state.slideIndex
  93. const slide = state.slides[slideIndex]
  94. const elements = slide.elements.map(el => {
  95. return elIdList.includes(el.id) ? { ...el, ...props } : el
  96. })
  97. state.slides[slideIndex].elements = (elements as PPTElement[])
  98. },
  99. [MutationTypes.REMOVE_ELEMENT_PROPS](state, data: RemoveElementPropData) {
  100. const { id, propName } = data
  101. const propsNames = typeof propName === 'string' ? [propName] : propName
  102. const slideIndex = state.slideIndex
  103. const slide = state.slides[slideIndex]
  104. const elements = slide.elements.map(el => {
  105. return el.id === id ? omit(el, propsNames) : el
  106. })
  107. state.slides[slideIndex].elements = (elements as PPTElement[])
  108. },
  109. // snapshot
  110. [MutationTypes.SET_SNAPSHOT_CURSOR](state, cursor: number) {
  111. state.snapshotCursor = cursor
  112. },
  113. [MutationTypes.SET_SNAPSHOT_LENGTH](state, length: number) {
  114. state.snapshotLength = length
  115. },
  116. // keyboard
  117. [MutationTypes.SET_CTRL_KEY_STATE](state, isActive: boolean) {
  118. state.ctrlKeyState = isActive
  119. },
  120. [MutationTypes.SET_SHIFT_KEY_STATE](state, isActive: boolean) {
  121. state.shiftKeyState = isActive
  122. },
  123. // screen
  124. [MutationTypes.SET_SCREENING](state, screening) {
  125. state.screening = screening
  126. },
  127. }