2022-08-17 21:59:51 +02:00
|
|
|
<script setup lang="ts">
|
2022-08-30 21:26:35 +02:00
|
|
|
import { defineProps, defineExpose, ref } from 'vue';
|
|
|
|
import { isErrorResponse, FS } from '@/api';
|
|
|
|
import { NProgress } from 'naive-ui';
|
|
|
|
import filesize from 'filesize';
|
2022-08-17 21:59:51 +02:00
|
|
|
|
|
|
|
const props = defineProps<{
|
2022-08-30 21:26:35 +02:00
|
|
|
file: File;
|
2022-08-17 21:59:51 +02:00
|
|
|
}>();
|
|
|
|
|
|
|
|
const progress = ref(0);
|
|
|
|
const percentage = ref(0);
|
2022-08-30 21:26:35 +02:00
|
|
|
const err = ref('');
|
|
|
|
const status = ref('info');
|
2022-08-17 21:59:51 +02:00
|
|
|
|
|
|
|
async function startUpload(parent: number, token: string) {
|
2022-08-30 21:26:35 +02:00
|
|
|
const resp = await FS.upload_file(token, parent, props.file, (e) => {
|
|
|
|
progress.value = e.loaded;
|
|
|
|
percentage.value = (e.loaded / e.total) * 100;
|
|
|
|
});
|
|
|
|
percentage.value = 100;
|
|
|
|
if (isErrorResponse(resp)) {
|
|
|
|
err.value = resp.message ?? 'Error';
|
|
|
|
status.value = 'error';
|
|
|
|
} else status.value = 'success';
|
2022-08-17 21:59:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
defineExpose({
|
2022-08-30 21:26:35 +02:00
|
|
|
startUpload
|
2022-08-17 21:59:51 +02:00
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
2022-08-30 21:26:35 +02:00
|
|
|
<div v-if="percentage < 100">
|
|
|
|
{{ file.name }} - {{ filesize(progress) }} / {{ filesize(file.size) }} -
|
|
|
|
{{ Math.floor(percentage * 1000) / 1000 }}%
|
|
|
|
</div>
|
|
|
|
<div v-else-if="err !== ''">{{ file.name }} - Error: {{ err }}</div>
|
|
|
|
<div v-else>{{ file.name }} - Completed</div>
|
|
|
|
<n-progress
|
|
|
|
type="line"
|
|
|
|
:percentage="percentage"
|
|
|
|
:height="20"
|
|
|
|
:status="status"
|
|
|
|
border-radius="10px 0"
|
|
|
|
fill-border-radius="10px 0"
|
|
|
|
:show-indicator="false"
|
|
|
|
/>
|
2022-08-17 21:59:51 +02:00
|
|
|
</template>
|
|
|
|
|
|
|
|
<style scoped></style>
|