guide.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { ref } from 'vue'
  2. import { autoSetModeCallback, createTemploraryID } from './sys'
  3. import {
  4. fetchGuides,
  5. postAddGuide,
  6. postDeleteGuide,
  7. postUpdateGuide,
  8. uploadFile,
  9. } from '@/api'
  10. import {
  11. togetherCallback,
  12. deleteStoreItem,
  13. addStoreItem,
  14. updateStoreItem,
  15. saveStoreItems,
  16. recoverStoreItems
  17. } from '@/utils'
  18. import {
  19. getGuidePaths,
  20. guidePaths,
  21. recoverGuidePaths,
  22. backupGuidePaths,
  23. saveGuidePaths,
  24. initialGuidePathsByGuide
  25. } from './guide-path'
  26. import type { Guide as SGuide } from '@/api'
  27. import { fuseModels } from './fuse-model'
  28. import { custom } from '@/env'
  29. export type Guide = LocalMode<SGuide, 'cover'>
  30. export type Guides = Guide[]
  31. export const guides = ref<Guides>([])
  32. export const createGuide = (guide: Partial<Guide> = {}): Guide => ({
  33. id: createTemploraryID(),
  34. title: `路径${guides.value.length + 1}`,
  35. cover: '',
  36. ...guide
  37. })
  38. let bcGuides: Guides = []
  39. export const getBackupGuides = () => bcGuides
  40. export const backupGuides = () => {
  41. bcGuides = guides.value.map(guide => ({...guide }))
  42. }
  43. export const transformGuide = async (guide: Guide): Promise<SGuide> => {
  44. const guideCover = await uploadFile(guide.cover)
  45. return { ...guide, cover: guideCover }
  46. }
  47. export const addGuide = addStoreItem(guides, async (guide) => {
  48. const paths = getGuidePaths(guide)
  49. const recoveryContent = JSON.stringify(fuseModels.value.map(item => ({
  50. ...item,
  51. viewShow: custom.showModelsMap.get(item)
  52. })))
  53. guide.recoveryContent = recoveryContent
  54. const newGuide = await postAddGuide(guide)
  55. paths.forEach(path => path.guideId = newGuide.id)
  56. return newGuide
  57. }, transformGuide)
  58. export const deleteGuide = deleteStoreItem(guides, async guide => {
  59. const paths = getGuidePaths(guide)
  60. await postDeleteGuide(guide.id)
  61. guidePaths.value = guidePaths.value.filter(path => !paths.includes(path))
  62. })
  63. export const initialGuides = async () => {
  64. guides.value = await fetchGuides()
  65. await Promise.all(guides.value.map(initialGuidePathsByGuide))
  66. backupGuides()
  67. }
  68. export const recoverGuides = recoverStoreItems(guides, getBackupGuides)
  69. export const updateGuide = updateStoreItem(guides, postUpdateGuide, transformGuide)
  70. export const saveGuides = saveStoreItems(
  71. guides,
  72. getBackupGuides,
  73. {
  74. add: addGuide,
  75. update: updateGuide,
  76. delete: deleteGuide,
  77. }
  78. )
  79. export const autoSaveGuides = autoSetModeCallback([guides, guidePaths], {
  80. backup: togetherCallback([backupGuides, backupGuidePaths]),
  81. recovery: togetherCallback([recoverGuides, recoverGuidePaths]),
  82. save: async () => {
  83. await saveGuides()
  84. await saveGuidePaths()
  85. },
  86. })