|
@@ -1,5 +1,5 @@
|
|
|
-import { ref } from "vue";
|
|
|
-import { autoSetModeCallback, createTemploraryID } from './sys'
|
|
|
+import { ref, watchEffect } from "vue";
|
|
|
+import { autoSetModeCallback, createTemploraryID, unSetModelUpdate } from './sys'
|
|
|
import {
|
|
|
addStoreItem,
|
|
|
deleteStoreItem,
|
|
@@ -18,12 +18,12 @@ import {
|
|
|
RecordStatus,
|
|
|
postMegerRecord,
|
|
|
blobToFile,
|
|
|
- uploadFile
|
|
|
+ uploadFile,
|
|
|
+ fetchRecordStatus
|
|
|
} from '@/api'
|
|
|
import {
|
|
|
getRecordFragments,
|
|
|
initRecordFragmentsByRecord,
|
|
|
- deleteRecordFragment,
|
|
|
recordFragments,
|
|
|
backupRecordFragments,
|
|
|
recoverRecordFragments,
|
|
@@ -37,13 +37,14 @@ export type Records = Record[]
|
|
|
|
|
|
export const records = ref<Records>([])
|
|
|
|
|
|
-export const createRecord = (): Record => ({
|
|
|
+export const createRecord = (record: Partial<Record> = {}): Record => ({
|
|
|
id: createTemploraryID(),
|
|
|
title: '讲解视频',
|
|
|
cover: '',
|
|
|
url: '',
|
|
|
- status: RecordStatus.SUCCESS,
|
|
|
- sort: Math.min(...records.value.map(item => item.sort)) - 1
|
|
|
+ status: RecordStatus.UN,
|
|
|
+ sort: Math.min(...records.value.map(item => item.sort)) - 1,
|
|
|
+ ...record
|
|
|
})
|
|
|
|
|
|
|
|
@@ -54,19 +55,34 @@ export const backupRecords = () => {
|
|
|
}
|
|
|
export const recoverRecords = recoverStoreItems(records, getBackupRecords)
|
|
|
|
|
|
+const refreshRecordStatus = async (record: Record) => {
|
|
|
+ const status = await fetchRecordStatus(record.id)
|
|
|
+ if (status === RecordStatus.SUCCESS) {
|
|
|
+ unSetModelUpdate(() => record.status = RecordStatus.SUCCESS)
|
|
|
+ } else {
|
|
|
+ setTimeout(refreshRecordStatus.bind(null, record), 3000)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
const getRecordMergeFiles = (record: Record) => {
|
|
|
const fragments = getRecordFragments(record)
|
|
|
const files = fragments
|
|
|
- .filter(fragment => typeof fragment.cover !== 'string')
|
|
|
- .map(fragment => blobToFile((fragment.url as LocalFile).blob, '.mp4'))
|
|
|
+ .filter(fragment => typeof fragment.url !== 'string')
|
|
|
+ .map(fragment => blobToFile((fragment.url as Blob), '.mp4'))
|
|
|
return files
|
|
|
}
|
|
|
|
|
|
-export const initialRecords = fetchStoreItems(records, async () => {
|
|
|
- const records = await fetchRecords()
|
|
|
- await Promise.all(records.map(initRecordFragmentsByRecord))
|
|
|
- return records
|
|
|
-}, getBackupRecords)
|
|
|
+export const initialRecords = async () => {
|
|
|
+ records.value = await fetchRecords()
|
|
|
+ await Promise.all(records.value.map(initRecordFragmentsByRecord))
|
|
|
+ for (const record of records.value) {
|
|
|
+ if (record.status === RecordStatus.RUN) {
|
|
|
+ refreshRecordStatus(record)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ getBackupRecords()
|
|
|
+}
|
|
|
|
|
|
export const addRecord = addStoreItem(records, async (record) => {
|
|
|
const cover = await uploadFile(record.cover)
|
|
@@ -109,3 +125,5 @@ export const autoSaveRecords = autoSetModeCallback(
|
|
|
}
|
|
|
}
|
|
|
)
|
|
|
+
|
|
|
+export { RecordStatus }
|