guide.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { ref } from 'vue'
  2. import { createTemploraryID } from './sys'
  3. import { autoSetModeCallback } from './sys'
  4. import {
  5. fetchGuides,
  6. postAddGuide,
  7. postDeleteGuide,
  8. postUpdateGuide,
  9. uploadFile,
  10. } from '@/api'
  11. import {
  12. deleteStoreItem,
  13. addStoreItem,
  14. updateStoreItem,
  15. fetchStoreItems,
  16. saveStoreItems,
  17. recoverStoreItems
  18. } from '@/utils'
  19. import type { Guide as SGuide } from '@/api'
  20. export type Guide = LocalMode<SGuide, 'cover'>
  21. export type Guides = Guide[]
  22. export const guides = ref<Guides>([])
  23. export const createGuide = (guide: Partial<Guide> = {}): Guide => ({
  24. id: createTemploraryID(),
  25. title: `路径${guides.value.length + 1}`,
  26. cover: '',
  27. ...guide
  28. })
  29. let bcGuides: Guides = []
  30. export const getBackupGuides = () => bcGuides
  31. export const backupGuides = () => {
  32. bcGuides = guides.value.map(guide => ({...guide }))
  33. }
  34. export const transformGuide = async (guide: Guide): Promise<SGuide> => {
  35. const guideCover = await uploadFile(guide.cover)
  36. return { ...guide, cover: guideCover }
  37. }
  38. export const recoverGuides = recoverStoreItems(guides, getBackupGuides)
  39. export const addGuide = addStoreItem(guides, postAddGuide, transformGuide)
  40. export const updateGuide = updateStoreItem(guides, postUpdateGuide, transformGuide)
  41. export const deleteGuide = deleteStoreItem(guides, guide => postDeleteGuide(guide.id))
  42. export const initialGuides = fetchStoreItems(guides, fetchGuides, backupGuides)
  43. export const saveGuides = saveStoreItems(
  44. guides,
  45. getBackupGuides,
  46. {
  47. add: addGuide,
  48. update: updateGuide,
  49. delete: deleteGuide,
  50. }
  51. )
  52. export const autoSaveGuides = autoSetModeCallback(guides, {
  53. backup: backupGuides,
  54. recovery: recoverGuides,
  55. save: saveGuides,
  56. })