blob: 0e9551b5b89d248d42d8b77edb12406388d00e59 [file] [log] [blame]
Yoshie Muranaka3be801a2020-04-21 11:34:56 -07001<template>
2 <transition name="fade">
Dixsie Wolmers61c65ef2020-10-06 14:43:49 -05003 <b-progress v-if="!isLoadingComplete">
Derick Montaguede87f672020-06-27 11:59:17 -05004 <b-progress-bar
Dixsie Wolmers35593042020-07-17 09:38:12 -05005 striped
6 animated
Derick Montaguede87f672020-06-27 11:59:17 -05007 :value="loadingIndicatorValue"
8 :aria-label="$t('global.ariaLabel.progressBar')"
9 />
10 </b-progress>
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070011 </transition>
12</template>
13
14<script>
15export default {
16 data() {
17 return {
18 loadingIndicatorValue: 0,
19 isLoadingComplete: false,
20 loadingIntervalId: null,
Derick Montague602e98a2020-10-21 16:20:00 -050021 timeoutId: null,
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070022 };
23 },
24 created() {
Sukanya Pandeyedb8a772020-10-29 11:33:42 +053025 this.$root.$on('loader-start', () => {
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070026 this.startLoadingInterval();
27 });
Sukanya Pandeyedb8a772020-10-29 11:33:42 +053028 this.$root.$on('loader-end', () => {
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070029 this.endLoadingInterval();
30 });
Sukanya Pandeyedb8a772020-10-29 11:33:42 +053031 this.$root.$on('loader-hide', () => {
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070032 this.hideLoadingBar();
33 });
34 },
35 methods: {
36 startLoadingInterval() {
37 this.clearLoadingInterval();
38 this.clearTimeout();
39 this.loadingIndicatorValue = 0;
40 this.isLoadingComplete = false;
41 this.loadingIntervalId = setInterval(() => {
42 this.loadingIndicatorValue += 1;
43 if (this.loadingIndicatorValue > 100) this.clearLoadingInterval();
44 }, 100);
45 },
46 endLoadingInterval() {
47 this.clearLoadingInterval();
48 this.clearTimeout();
49 this.loadingIndicatorValue = 100;
50 this.timeoutId = setTimeout(() => {
51 // Let animation complete before hiding
52 // the loading bar
53 this.isLoadingComplete = true;
54 }, 1000);
55 },
56 hideLoadingBar() {
57 this.clearLoadingInterval();
58 this.clearTimeout();
59 this.loadingIndicatorValue = 0;
60 this.isLoadingComplete = true;
61 },
62 clearLoadingInterval() {
63 if (this.loadingIntervalId) clearInterval(this.loadingIntervalId);
64 this.loadingIntervalId = null;
65 },
66 clearTimeout() {
67 if (this.timeoutId) clearTimeout(this.timeoutId);
68 this.timeoutId = null;
Derick Montague602e98a2020-10-21 16:20:00 -050069 },
70 },
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070071};
72</script>
73
74<style lang="scss" scoped>
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070075.progress {
76 position: absolute;
77 left: 0;
78 right: 0;
79 bottom: -0.4rem;
80 opacity: 1;
81 transition: opacity $duration--moderate-01 $standard-easing--productive;
Dixsie Wolmers61c65ef2020-10-06 14:43:49 -050082 height: 0.4rem;
SurenNeware151dd242020-11-10 20:15:05 +053083
84 &.fade-enter, // Remove this vue2 based only class when switching to vue3
85 &.fade-enter-from, // This is vue3 based only class modified from 'fade-enter'
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070086 &.fade-leave-to {
87 opacity: 0;
88 }
89}
Mateusz Gapski21d6de02020-07-29 14:28:23 +020090.progress-bar {
91 background-color: $loading-color;
92}
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070093</style>