HEX
Server: LiteSpeed
System: Linux CentOS-79-64-minimal 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: vishn3436 (5293)
PHP: 8.0.15
Disabled: NONE
Upload Files
File: //scripts/script-server/web-src/src/main-app/components/scripts/ScriptLoadingText.vue
<template>
  <p class="script-loading-text">
    Loading {{ loadingDots }}
  </p>
</template>

<script>
import {randomInt} from '@/common/utils/common';

export default {
  name: 'ScriptLoadingText',

  data() {
    return {
      loadingDots: '',
      loaderTimer: null,
      counter: 0
    }
  },

  props: {
    loading: {
      type: Boolean,
      default: false
    },
    script: {
      type: String,
      default: null
    },
    delay: {
      type: Number,
      default: 1000
    }
  },

  methods: {
    updateLoadingIndicator() {
      if (!this.loading) {
        this.loadingDots = '';
        return;
      }

      if (this.loaderTimer) {
        clearInterval(this.loaderTimer);
      }

      this.loadingDots = '..';
      this.counter = 0;
      this.loaderTimer = setInterval(() => {
        this.counter++;

        if (this.counter > 30) {
          return;
        }

        if (this.counter === 30) {
          this.loadingDots += ' loading time is unknown';
          return;
        }

        if ((this.counter === 6) || (this.counter === 13) || (this.counter === 21)) {
          let attempts = 0;
          while (attempts++ < 10) {
            const phrase = phrases[randomInt(0, phrases.length)];
            if (this.loadingDots.includes(phrase)) {
              continue;
            }

            this.loadingDots += ' ' + phrase + ' ..';
            return;
          }
        }

        this.loadingDots += '.'
      }, this.delay)
    }
  },

  watch: {
    script: {
      immediate: true,
      handler() {
        this.updateLoadingIndicator();
      }
    },

    loading: {
      immediate: true,
      handler() {
        this.updateLoadingIndicator();
      }
    }
  },

  destroyed: function () {
    if (this.loaderTimer) {
      clearInterval(this.loaderTimer);
      this.loaderTimer = null;
    }
  }
}

const phrases = [
  'wait a bit more',
  'doing my best',
  'don\'t leave me',
  'thanks for waiting',
  'Zzzzz',
  '42',
  'I\'m still alive',
  'what a lovely weather today',
  'some bits got stuck',
  'patience is power',
  'almost done'];
</script>

<style scoped>
.script-loading-text {
  color: var(--font-color-medium);
}

</style>