import { ref } from "vue"; import { autoSetModeCallback, createTemploraryID, unSetModelUpdate } from './sys' import { deleteStoreItem, recoverStoreItems, saveStoreItems } from '@/utils' import { fetchRecordFragments, postDeleteRecordFragment } from '@/api' import type { RecordFragment as SRecordFragment } from '@/api' import type { Record } from './record' export type RecordFragment = Omit & { url: string | Blob } & { recordId: Record['id'] } export type RecordFragments = RecordFragment[] export const recordFragments = ref([]) export const createRecordFragment = (recordFragment: Partial = {}): RecordFragment => ({ id: createTemploraryID(), recordId: '', cover: '', url: '', sort: Math.min(...recordFragments.value.map(item => item.sort)) + 1, ...recordFragment }) export const getRecordFragments = (record: Record) => recordFragments.value.filter(fragment => fragment.recordId === record.id) export const getRecordFragmentBlobs = (record: Record) => getRecordFragments(record) .filter(fragment => typeof fragment.url !== 'string') .map(fragment => fragment.url as Blob) let bcRecordFragments: RecordFragments = [] export const getBackupRecordFragments = () => bcRecordFragments export const backupRecordFragments = () => { bcRecordFragments = recordFragments.value.map(fragment => ({...fragment})) } export const recoverRecordFragments = recoverStoreItems(recordFragments, getBackupRecordFragments) export const initRecordFragmentsByRecord = async (record: Record) => { const fragments = await fetchRecordFragments(record.id) unSetModelUpdate(() => { recordFragments.value = recordFragments.value .filter(fragment => fragment.recordId !== record.id) .concat(fragments.map(fragment => ({...fragment, recordId: record.id}))) }) backupRecordFragments() } export const deleteRecordFragment = deleteStoreItem(recordFragments, fragment => postDeleteRecordFragment(fragment.id)) export const saveRecordFragments = saveStoreItems( recordFragments, getBackupRecordFragments, { // delete: deleteRecordFragment } ) export const autoSaveRecordFragments = autoSetModeCallback(recordFragments, { backup: backupRecordFragments, recovery: recoverRecordFragments, save: saveRecordFragments })