usePasteTextClipboardData.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { computed, Ref } from 'vue'
  2. import { useStore } from 'vuex'
  3. import { MutationTypes, State } from '@/store'
  4. import { decrypt } from '@/utils/crypto'
  5. import { PPTElement, Slide } from '@/types/slides'
  6. import { createRandomCode } from '@/utils/common'
  7. import useHistorySnapshot from '@/hooks/useHistorySnapshot'
  8. interface PasteTextClipboardDataOptions {
  9. onlySlide?: boolean;
  10. onlyElements?: boolean;
  11. }
  12. export default () => {
  13. const store = useStore<State>()
  14. const currentSlide: Ref<Slide> = computed(() => store.getters.currentSlide)
  15. const { addHistorySnapshot } = useHistorySnapshot()
  16. const pasteElement = (elements: PPTElement[]) => {
  17. const groupIdMap = {}
  18. const elIdMap = {}
  19. for(const element of elements) {
  20. const groupId = element.groupId
  21. if(groupId && !groupIdMap[groupId]) {
  22. groupIdMap[groupId] = createRandomCode()
  23. }
  24. elIdMap[element.id] = createRandomCode()
  25. }
  26. const currentSlideElementIdList = currentSlide.value.elements.map(el => el.id)
  27. for(const element of elements) {
  28. const inCurrentSlide = currentSlideElementIdList.includes(element.id)
  29. element.id = elIdMap[element.id]
  30. if(inCurrentSlide) {
  31. element.left = element.left + 10
  32. element.top = element.top + 10
  33. }
  34. if(element.groupId) element.groupId = groupIdMap[element.groupId]
  35. }
  36. store.commit(MutationTypes.ADD_ELEMENT, elements)
  37. store.commit(MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST, Object.values(elIdMap))
  38. addHistorySnapshot()
  39. }
  40. const pasteSlide = (slide: Slide) => {
  41. store.commit(MutationTypes.ADD_SLIDE, slide)
  42. addHistorySnapshot()
  43. }
  44. const pasteText = (text: string) => {
  45. console.log(text)
  46. }
  47. const pasteTextClipboardData = (text: string, options?: PasteTextClipboardDataOptions) => {
  48. const onlySlide = options?.onlySlide || false
  49. const onlyElements = options?.onlyElements || false
  50. let clipboardData
  51. try {
  52. clipboardData = JSON.parse(decrypt(text))
  53. }
  54. catch {
  55. clipboardData = text
  56. }
  57. // 粘贴自定义元素或页面
  58. if(typeof clipboardData === 'object') {
  59. const { type, data } = clipboardData
  60. if(type === 'elements' && !onlySlide) pasteElement(data)
  61. else if(type === 'slide' && !onlyElements) pasteSlide(data)
  62. }
  63. // 粘贴普通文本
  64. else if(!onlyElements && !onlySlide) pasteText(clipboardData)
  65. }
  66. return {
  67. pasteTextClipboardData,
  68. }
  69. }