blob: 7490baa05fe31f664cf6d2a5838e73bb90911bdb [file] [log] [blame]
Yoshie Muranaka3be801a2020-04-21 11:34:56 -07001<template>
2 <transition name="fade">
Derick Montaguede87f672020-06-27 11:59:17 -05003 <b-progress v-if="!isLoadingComplete" height="0.4rem">
4 <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,
21 timeoutId: null
22 };
23 },
24 created() {
25 this.$root.$on('loader::start', () => {
26 this.startLoadingInterval();
27 });
28 this.$root.$on('loader::end', () => {
29 this.endLoadingInterval();
30 });
31 this.$root.$on('loader::hide', () => {
32 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;
69 }
70 }
71};
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;
82
83 &.fade-enter,
84 &.fade-leave-to {
85 opacity: 0;
86 }
87}
Mateusz Gapski21d6de02020-07-29 14:28:23 +020088.progress-bar {
89 background-color: $loading-color;
90}
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070091</style>