record-fragment.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { ref } from "vue";
  2. import { autoSetModeCallback, createTemploraryID, unSetModelUpdate } from './sys'
  3. import { deleteStoreItem, recoverStoreItems, saveStoreItems } from '@/utils'
  4. import { fetchRecordFragments, postDeleteRecordFragment } from '@/api'
  5. import type { RecordFragment as SRecordFragment } from '@/api'
  6. import type { Record } from './record'
  7. export type RecordFragment = Omit<SRecordFragment, 'url'> & { url: string | Blob } & { recordId: Record['id'] }
  8. export type RecordFragments = RecordFragment[]
  9. export const recordFragments = ref<RecordFragments>([])
  10. export const createRecordFragment = (recordFragment: Partial<RecordFragment> = {}): RecordFragment => ({
  11. id: createTemploraryID(),
  12. recordId: '',
  13. cover: '',
  14. url: '',
  15. sort: Math.min(...recordFragments.value.map(item => item.sort)) + 1,
  16. ...recordFragment
  17. })
  18. export const getRecordFragments = (record: Record) =>
  19. recordFragments.value.filter(fragment => fragment.recordId === record.id)
  20. export const getRecordFragmentBlobs = (record: Record) => getRecordFragments(record)
  21. .filter(fragment => typeof fragment.url !== 'string')
  22. .map(fragment => fragment.url as Blob)
  23. let bcRecordFragments: RecordFragments = []
  24. export const getBackupRecordFragments = () => bcRecordFragments
  25. export const backupRecordFragments = () => {
  26. bcRecordFragments = recordFragments.value.map(fragment => ({...fragment}))
  27. }
  28. export const recoverRecordFragments = recoverStoreItems(recordFragments, getBackupRecordFragments)
  29. export const initRecordFragmentsByRecord = async (record: Record) => {
  30. const fragments = await fetchRecordFragments(record.id)
  31. unSetModelUpdate(() => {
  32. recordFragments.value = recordFragments.value
  33. .filter(fragment => fragment.recordId !== record.id)
  34. .concat(fragments.map(fragment => ({...fragment, recordId: record.id})))
  35. })
  36. backupRecordFragments()
  37. }
  38. export const deleteRecordFragment = deleteStoreItem(recordFragments, fragment => postDeleteRecordFragment(fragment.id))
  39. export const saveRecordFragments = saveStoreItems(
  40. recordFragments,
  41. getBackupRecordFragments,
  42. {
  43. // delete: deleteRecordFragment
  44. }
  45. )
  46. export const autoSaveRecordFragments = autoSetModeCallback(recordFragments, {
  47. backup: backupRecordFragments,
  48. recovery: recoverRecordFragments,
  49. save: saveRecordFragments
  50. })