Moved progress bar logic into progress bar

This commit is contained in:
2021-12-31 00:17:06 +03:00
parent e13743ccce
commit 2a348d1d21
2 changed files with 63 additions and 38 deletions

View File

@@ -1,13 +1,12 @@
<template> <template>
<div class="room"> <div class="room">
<h1>{{ room.movie }}</h1> <h1>{{ room.movie }}</h1>
<div v-if="!room.downloaded"> <ProgressBar
<div>{{ progressPerc }}%</div> v-if="!room.downloaded"
<ProgressBar :id="id"
:progress="progress" @downloaded="onDownloaded"
class="progress-bar" class="progress-bar"
/> />
</div>
<video <video
v-if="room.downloaded" v-if="room.downloaded"
@@ -25,7 +24,6 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import getRoom from '@/api/getRoom'; import getRoom from '@/api/getRoom';
import getStatus from '@/api/getStatus';
import setPosition from '@/api/setPosition'; import setPosition from '@/api/setPosition';
import getPosition from '@/api/getPosition'; import getPosition from '@/api/getPosition';
@@ -47,9 +45,7 @@ export default defineComponent({
data() { data() {
return { return {
room: {} as Room, room: {} as Room,
progress: 0,
playing: false, playing: false,
progressInterval: undefined as undefined | number,
positionInterval: undefined as undefined | number, positionInterval: undefined as undefined | number,
}; };
}, },
@@ -57,23 +53,18 @@ export default defineComponent({
movieUrl() { movieUrl() {
return `${process.env.VUE_APP_MOVIES}?filename=${this.room.filename}`; return `${process.env.VUE_APP_MOVIES}?filename=${this.room.filename}`;
}, },
progressPerc() {
return Math.floor(this.progress * 100);
},
}, },
async mounted() { async mounted() {
this.room = await getRoom(this.id); this.room = await getRoom(this.id);
if (this.room.downloaded) {
if (!this.room.downloaded) { this.onDownloaded();
this.progressInterval = setInterval(async () => { }
const result = await getStatus(this.id); },
this.progress = result.progress; beforeUnmount() {
if (result.downloaded || this.progress === 1) { clearInterval(this.positionInterval);
this.room.downloaded = true; },
clearInterval(this.progressInterval); methods: {
} onDownloaded() {
}, 2 * 1000);
} else {
this.room.downloaded = true; this.room.downloaded = true;
this.$nextTick(() => { this.$nextTick(() => {
const element = this.$refs.video as HTMLVideoElement; const element = this.$refs.video as HTMLVideoElement;
@@ -89,13 +80,7 @@ export default defineComponent({
} }
}, 2 * 1000); }, 2 * 1000);
}); });
} },
},
beforeUnmount() {
clearInterval(this.progressInterval);
clearInterval(this.positionInterval);
},
methods: {
seeked() { seeked() {
const element = this.$refs.video as HTMLVideoElement; const element = this.$refs.video as HTMLVideoElement;
const position = element.currentTime; const position = element.currentTime;

View File

@@ -1,30 +1,70 @@
<template> <template>
<div> <div class="bar">
<div <div
class="fill" class="fill"
:style="{ :style="{
width: `${progress * 100}%` width: `${progress * 100}%`
}" }"
/> />
<div class="digits">
{{ progressPerc }}%
</div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import getStatus from '@/api/getStatus';
export default defineComponent({ export default defineComponent({
emits: ['downloaded'],
props: { props: {
progress: { id: {
type: Number, type: String,
default: 0, required: true,
}, },
}, },
data() {
return {
progress: 0,
progressInterval: undefined as undefined | number,
};
},
computed: {
progressPerc() {
return Math.floor(this.progress * 100);
},
},
mounted() {
this.progressInterval = setInterval(async () => {
const result = await getStatus(this.id);
this.progress = result.progress;
if (result.downloaded || this.progress === 1) {
this.$emit('downloaded');
clearInterval(this.progressInterval);
}
}, 2 * 1000);
},
beforeUnmount() {
clearInterval(this.progressInterval);
},
}); });
</script> </script>
<class lang="scss" scoped> <class lang="scss" scoped>
.fill { .bar {
background: lightblue; position: relative;
height: 100%;
.fill {
background: lightblue;
height: 100%;
}
.digits {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
} }
</class> </class>