tagging.ts 3.4 KB

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