tagging.ts 2.8 KB

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