1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-03-14 01:34:47 +08:00

102 lines
2.4 KiB
Vue

<template>
<el-dialog
width="30%"
:title="$t('file.downloadProcess')"
v-model="open"
@open="onOpen"
:before-close="handleClose"
>
<div v-for="(value, index) in res" :key="index">
<span>{{ $t('file.downloading') }} {{ value['name'] }}</span>
<el-progress :text-inside="true" :stroke-width="15" :percentage="value['percent']"></el-progress>
<span>{{ getFileSize(value['written']) }}/{{ getFileSize(value['total']) }}</span>
</div>
</el-dialog>
</template>
<script lang="ts" setup>
import { FileKeys } from '@/api/modules/files';
import { computeSize } from '@/utils/util';
import { onBeforeUnmount, ref, toRefs } from 'vue';
const props = defineProps({
open: {
type: Boolean,
default: false,
},
});
const { open } = toRefs(props);
let processSocket = ref(null) as unknown as WebSocket;
const res = ref([]);
const keys = ref(['']);
const em = defineEmits(['close']);
const handleClose = () => {
closeSocket();
em('close', open);
};
const isWsOpen = () => {
const readyState = processSocket && processSocket.readyState;
return readyState === 1;
};
const closeSocket = () => {
if (isWsOpen()) {
processSocket && processSocket.close();
}
};
const onOpenProcess = () => {};
const onMessage = (message: any) => {
res.value = JSON.parse(message.data);
};
const onerror = () => {};
const onClose = () => {};
const initProcess = () => {
let href = window.location.href;
let ipLocal = href.split('//')[1].split(':')[0];
processSocket = new WebSocket(`ws://${ipLocal}:9999/api/v1/files/ws`);
processSocket.onopen = onOpenProcess;
processSocket.onmessage = onMessage;
processSocket.onerror = onerror;
processSocket.onclose = onClose;
sendMsg();
};
const getKeys = () => {
FileKeys().then((res) => {
if (res.data.keys.length > 0) {
keys.value = res.data.keys;
initProcess();
}
});
};
const sendMsg = () => {
setInterval(() => {
if (isWsOpen()) {
processSocket.send(
JSON.stringify({
type: 'wget',
keys: keys.value,
}),
);
}
}, 1000);
};
const getFileSize = (size: number) => {
return computeSize(size);
};
onBeforeUnmount(() => {
closeSocket();
});
const onOpen = () => {
getKeys();
};
</script>