blob: d1736d6a59bd235fa8b87876f2ca209c455e40e8 [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 Muranakaa9ac43b2020-05-05 08:37:07 -070075@import 'src/assets/styles/helpers';
76
Yoshie Muranaka3be801a2020-04-21 11:34:56 -070077.progress {
78 position: absolute;
79 left: 0;
80 right: 0;
81 bottom: -0.4rem;
82 opacity: 1;
83 transition: opacity $duration--moderate-01 $standard-easing--productive;
84
85 &.fade-enter,
86 &.fade-leave-to {
87 opacity: 0;
88 }
89}
90</style>