tagging-style.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { ref, computed } from 'vue'
  2. import { autoSetModeCallback, createTemploraryID } from './sys'
  3. import {
  4. fetchTaggingStyles,
  5. postAddTaggingStyle,
  6. postDeleteTaggingStyle
  7. } from '@/api'
  8. import {
  9. addStoreItem,
  10. deleteStoreItem,
  11. fetchStoreItems,
  12. recoverStoreItems,
  13. saveStoreItems
  14. } from '@/utils'
  15. import type { TaggingStyle as STaggingStyle } from '@/api'
  16. export type TaggingStyle = LocalMode<STaggingStyle, 'icon'>
  17. export type TaggingStyles = TaggingStyle[]
  18. export const taggingStyles = ref<TaggingStyles>([])
  19. export const defaultStyle = computed(() => taggingStyles.value.find(style => style.default))
  20. export const lastUseStyle = computed(() => taggingStyles.value.find(style => style.lastUse))
  21. export const createTaggingStyle = (style: Partial<TaggingStyle> = {}): TaggingStyle => ({
  22. id: createTemploraryID(),
  23. icon: '',
  24. lastUse: 0,
  25. default: false,
  26. name: '',
  27. ...style
  28. })
  29. export const getTaggingStyle = (id: TaggingStyle['id']) => {
  30. return taggingStyles.value.find(style => style.id === id)
  31. }
  32. let bcStyles: TaggingStyles = []
  33. export const getBackupTaggingStyles = () => bcStyles
  34. export const backupTaggingStyles = () => {
  35. bcStyles = taggingStyles.value.map(style => ({...style}))
  36. }
  37. export const recoverTaggingStyles = recoverStoreItems(taggingStyles, getBackupTaggingStyles)
  38. export const initialTaggingStyles = fetchStoreItems(taggingStyles, fetchTaggingStyles, backupTaggingStyles)
  39. export const addTaggingStyle = addStoreItem(taggingStyles, async (tagging) => {
  40. if (typeof tagging.icon === 'string') {
  41. return tagging
  42. } else {
  43. return postAddTaggingStyle({ file: tagging.icon.blob, iconTitle: tagging.name })
  44. }
  45. })
  46. export const deleteTaggingStyle = deleteStoreItem(taggingStyles, style => postDeleteTaggingStyle(style.id))
  47. export const saveTaggingStyles = saveStoreItems(
  48. taggingStyles,
  49. getBackupTaggingStyles,
  50. {
  51. add: addTaggingStyle,
  52. delete: deleteTaggingStyle,
  53. }
  54. )
  55. export const autoSaveTaggingStyles = autoSetModeCallback(taggingStyles, {
  56. backup: backupTaggingStyles,
  57. recovery: recoverTaggingStyles,
  58. save: saveTaggingStyles,
  59. })