tagging.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { ref } from 'vue'
  2. import { togetherCallback } from '@/utils'
  3. import { autoSetModeCallback, createTemploraryID } from './sys'
  4. import { defaultStyle, getTaggingStyle, initialTaggingStyles, lastUseStyle } from './tagging-style'
  5. import {
  6. initTaggingPositionsByTagging,
  7. saveTaggingPositions,
  8. recoverTaggingPositions,
  9. backupTaggingPositions,
  10. taggingPositions,
  11. getTaggingPositions,
  12. getTaggingPositionIsShow
  13. } from './tagging-positions'
  14. import {
  15. saveTaggingStyles,
  16. recoverTaggingStyles,
  17. backupTaggingStyles,
  18. taggingStyles
  19. } from './tagging-style'
  20. import {
  21. fetchTaggings,
  22. postAddTagging,
  23. postDeleteTagging,
  24. postUpdateTagging,
  25. TaggingPositionType,
  26. uploadFile
  27. } from '@/api'
  28. import {
  29. deleteStoreItem,
  30. addStoreItem,
  31. updateStoreItem,
  32. fetchStoreItems,
  33. saveStoreItems,
  34. recoverStoreItems
  35. } from '@/utils'
  36. import type { Tagging as STagging } from '@/api'
  37. import type { TaggingStyle } from './tagging-style'
  38. export type Tagging = LocalMode<LocalMode<STagging, 'images'>, 'audio'>
  39. export type Taggings = Tagging[]
  40. export const taggings = ref<Taggings>([])
  41. export const getTagging = (id: Tagging['id']) => taggings.value.find(tagging => tagging.id === id)
  42. export const getTaggingIsShow = (tagging: Tagging) =>
  43. getTaggingPositions(tagging).some(getTaggingPositionIsShow)
  44. export const createTagging = (tagging: Partial<Tagging> = {}): Tagging => {
  45. return {
  46. id: createTemploraryID(),
  47. title: ``,
  48. styleId: '',
  49. desc: '',
  50. part: '',
  51. method: '',
  52. show3dTitle: false,
  53. audioName: '',
  54. principal: '',
  55. audio: '',
  56. images: [],
  57. ...tagging
  58. }
  59. }
  60. let bcTaggings: Taggings = []
  61. export const getBackupTaggings = () => bcTaggings
  62. export const backupTaggings = () => {
  63. bcTaggings = taggings.value.map(tagging => ({
  64. ...tagging,
  65. images: [...tagging.images],
  66. }))
  67. }
  68. export const transformTagging = async (tagging: Tagging): Promise<STagging> => {
  69. const images: string[] = []
  70. const uploadImages = tagging.images.map((file, index) =>
  71. uploadFile(file).then(url => images[index] = url)
  72. )
  73. let audio: string
  74. const uploadAudio = tagging.audio && uploadFile(tagging.audio).then((url) => {
  75. audio = url
  76. })
  77. await Promise.all([...uploadImages, uploadAudio])
  78. return { ...tagging, images, audio: audio! }
  79. }
  80. export const recoverTaggings = recoverStoreItems(taggings, () => bcTaggings)
  81. export const addTagging = addStoreItem(taggings, async (localTagging) => {
  82. const positions = getTaggingPositions(localTagging)
  83. const serviceTagging = await postAddTagging(localTagging)
  84. for (const position of positions) {
  85. position.taggingId = serviceTagging.id
  86. }
  87. return serviceTagging
  88. }, transformTagging)
  89. export const deleteTagging = deleteStoreItem(taggings, async tagging => {
  90. const positions = getTaggingPositions(tagging)
  91. await postDeleteTagging(tagging.id)
  92. taggingPositions.value.filter(position => !positions.includes(position))
  93. })
  94. export const updateTagging = updateStoreItem(taggings, postUpdateTagging, transformTagging)
  95. export const initialTaggings = fetchStoreItems(taggings, async () => {
  96. const taggings = await fetchTaggings()
  97. await Promise.all(taggings.map(initTaggingPositionsByTagging))
  98. return taggings
  99. }, backupTaggings)
  100. export const saveTaggings = saveStoreItems(
  101. taggings,
  102. getBackupTaggings,
  103. {
  104. add: addTagging,
  105. update: updateTagging,
  106. delete: deleteTagging,
  107. }
  108. )
  109. export const autoSaveTaggings = autoSetModeCallback([taggings, taggingPositions, taggingStyles], {
  110. backup: togetherCallback([backupTaggings, backupTaggingPositions, backupTaggingStyles]),
  111. recovery: togetherCallback([recoverTaggings, recoverTaggingPositions, recoverTaggingStyles]),
  112. save: async () => {
  113. const styles = taggings.value.map(tagging => getTaggingStyle(tagging.styleId))
  114. await saveTaggingStyles()
  115. for (let i = 0; i < styles.length; i++) {
  116. if (styles[i]) {
  117. taggings.value[i].styleId = (styles[i] as TaggingStyle).id
  118. }
  119. }
  120. await saveTaggings()
  121. await saveTaggingPositions()
  122. await initialTaggingStyles()
  123. },
  124. })