Job.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <div class="box box-tx is-waiting" :class="{ 'is-danger': isFailed }">
  3. <div class="columns is-vcentered">
  4. <div class="column is-time" :data-label="$t('timePassed')">{{ time }}</div>
  5. <div class="column is-amount" :data-label="$t('amount')">
  6. {{ job.amount }}
  7. {{ currency }}
  8. </div>
  9. <div class="column is-deposit" :data-label="$t('subsequentDeposits')">
  10. <b-skeleton v-if="!isFailed" width="80" />
  11. <template v-else>-</template>
  12. </div>
  13. <div class="column is-hash" :data-label="$t('txHash')">
  14. <b-skeleton v-if="!job.txHash && job.status !== 'FAILED'" />
  15. <div v-else class="details">
  16. <p class="detail">
  17. <a
  18. data-test="txhash_text"
  19. class="detail-description"
  20. :href="txExplorerUrl(job.txHash)"
  21. target="_blank"
  22. rel="noopener noreferrer"
  23. >
  24. {{ job.txHash }}
  25. </a>
  26. </p>
  27. </div>
  28. </div>
  29. <div class="column is-status" :data-label="$t('status')">
  30. <b-skeleton v-if="!job.status" width="60" />
  31. <template v-else>
  32. <div class="status-with-loading">
  33. {{ status }}
  34. <b-icon v-show="!isFailed" icon="loading" size="is-small" />
  35. </div>
  36. </template>
  37. </div>
  38. <div class="column column-buttons">
  39. <b-button type="is-primary" size="is-small" icon-left="copy" disabled>
  40. {{ $t('note') }}
  41. </b-button>
  42. <b-button
  43. type="is-dark"
  44. size="is-small"
  45. icon-right="remove"
  46. :disabled="!isFailed"
  47. @click="onDelete"
  48. />
  49. </div>
  50. </div>
  51. </div>
  52. </template>
  53. <script>
  54. import { mapGetters } from 'vuex'
  55. export default {
  56. props: {
  57. job: {
  58. type: Object,
  59. required: true,
  60. timer: null
  61. }
  62. },
  63. data() {
  64. return {
  65. time: ''
  66. }
  67. },
  68. computed: {
  69. ...mapGetters('txHashKeeper', ['txExplorerUrl']),
  70. ...mapGetters('metamask', ['netId']),
  71. ...mapGetters('token', ['getSymbol']),
  72. isFailed() {
  73. return this.job.status === 'FAILED'
  74. },
  75. status() {
  76. switch (this.job.status) {
  77. case 'ACCEPTED':
  78. return this.$t('accepted')
  79. case 'SENT':
  80. return this.$t('sent')
  81. case 'MINED':
  82. return this.$t('mined')
  83. case 'CONFIRMED':
  84. return this.$t('confirmed')
  85. case 'FAILED':
  86. return this.$t('failed')
  87. case 'QUEUED':
  88. return this.$t('queued')
  89. default:
  90. return this.job.status
  91. }
  92. },
  93. currency() {
  94. return this.getSymbol(this.job.currency)
  95. }
  96. },
  97. mounted() {
  98. this.update()
  99. },
  100. beforeDestroy() {
  101. clearTimeout(this.timer)
  102. },
  103. methods: {
  104. update() {
  105. this.updateTime()
  106. this.timer = setTimeout(() => {
  107. this.update()
  108. }, 10000)
  109. },
  110. onDelete() {
  111. this.$store.commit('relayer/DELETE_JOB', { id: this.job.id, type: 'tornado', netId: this.netId })
  112. },
  113. updateTime(t = this.job.timestamp) {
  114. this.time = this.$moment.unix(t).fromNow()
  115. }
  116. }
  117. }
  118. </script>