| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import { ref } from 'vue'
- import { togetherCallback } from '@/utils'
- import { autoSetModeCallback, createTemploraryID } from './sys'
- import { defaultStyle } from './tagging-style'
- import {
- initTaggingPositionsByTagging,
- saveTaggingPositions,
- recoverTaggingPositions,
- backupTaggingPositions,
- taggingPositions,
- getTaggingPositions
- } from './tagging-positions'
- import {
- fetchTaggings,
- postAddTagging,
- postDeleteTagging,
- postUpdateTagging,
- uploadFile
- } from '@/api'
- import {
- deleteStoreItem,
- addStoreItem,
- updateStoreItem,
- fetchStoreItems,
- saveStoreItems,
- recoverStoreItems
- } from '@/utils'
- import type { Tagging as STagging } from '@/api'
- export type Tagging = LocalMode<STagging, 'images'>
- export type Taggings = Tagging[]
- export const taggings = ref<Taggings>([])
- export const createTagging = (tagging: Partial<Tagging> = {}): Tagging => ({
- id: createTemploraryID(),
- title: ``,
- styleId: defaultStyle.value?.id || '',
- desc: '',
- part: '',
- method: '',
- principal: '',
- images: [],
- ...tagging
- })
- let bcTaggings: Taggings = []
- export const getBackupTaggings = () => bcTaggings
- export const backupTaggings = () => {
- bcTaggings = taggings.value.map(tagging => ({
- ...tagging,
- images: [...tagging.images],
- }))
- }
- export const transformTagging = async (tagging: Tagging): Promise<STagging> => {
- const images: string[] = []
- const uploadImages = tagging.images.map((file, index) =>
- uploadFile(file).then(url => images[index] = url)
- )
- await Promise.all(uploadImages)
- return { ...tagging, images }
- }
- export const recoverTaggings = recoverStoreItems(taggings, () => bcTaggings)
- export const addTagging = addStoreItem(taggings, async (localTagging) => {
- const serviceTagging = await postAddTagging(localTagging)
- const positions = getTaggingPositions(localTagging)
- for (const position of positions) {
- position.taggingId = serviceTagging.id
- }
- return serviceTagging
- }, transformTagging)
- export const updateTagging = updateStoreItem(taggings, postUpdateTagging, transformTagging)
- export const deleteTagging = deleteStoreItem(taggings, tagging => postDeleteTagging(tagging.id))
- export const initialTaggings = fetchStoreItems(taggings, async () => {
- const taggings = await fetchTaggings()
- await Promise.all(taggings.map(initTaggingPositionsByTagging))
- return taggings
- }, backupTaggings)
- export const saveTaggings = saveStoreItems(
- taggings,
- getBackupTaggings,
- {
- add: addTagging,
- update: updateTagging,
- delete: deleteTagging,
- }
- )
- export const autoSaveTaggings = autoSetModeCallback([taggings, taggingPositions], {
- backup: togetherCallback([backupTaggings, backupTaggingPositions]),
- recovery: togetherCallback([recoverTaggings, recoverTaggingPositions]),
- save: async () => {
- await saveTaggings()
- await saveTaggingPositions()
- },
- })
|