VersionChecker.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <script setup>
  2. import systemService from '@/services/systemService'
  3. import { useAppSettingsStore } from '@/stores/appSettings'
  4. import { UseColorMode } from '@vueuse/components'
  5. const appSettings = useAppSettingsStore()
  6. const isScanning = ref(false)
  7. const isUpToDate = ref()
  8. async function getLatestRelease() {
  9. isScanning.value = true;
  10. isUpToDate.value = undefined
  11. await systemService.getLastRelease({returnError: true})
  12. .then(response => {
  13. appSettings.latestRelease = response.data.newRelease
  14. isUpToDate.value = response.data.newRelease === null ? null : response.data.newRelease === false
  15. })
  16. .catch(() => {
  17. isUpToDate.value = null
  18. })
  19. isScanning.value = false;
  20. }
  21. </script>
  22. <template>
  23. <div class="columns is-mobile is-vcentered">
  24. <div class="column is-narrow">
  25. <button type="button" :class="isScanning ? 'is-loading' : ''" class="button is-link is-rounded is-small" @click="getLatestRelease">{{ $t('admin.check_now') }}</button>
  26. </div>
  27. <div class="column">
  28. <UseColorMode v-slot="{ mode }">
  29. <span v-if="appSettings.latestRelease" class="mt-2" :class="mode == 'dark' ? 'has-text-warning' : 'has-text-warning-dark'">
  30. <span class="release-flag"></span>{{ $t('admin.x_is_available', { version: appSettings.latestRelease }) }}&nbsp;<a class="is-size-7" href="https://github.com/Bubka/2FAuth/releases">{{ $t('admin.view_on_github') }}</a>
  31. </span>
  32. <span v-if="isUpToDate" class="has-text-grey">
  33. <FontAwesomeIcon :icon="['fas', 'check']" class="mr-1 has-text-success" /> {{ $t('commons.you_are_up_to_date') }}
  34. </span>
  35. <span v-else-if="isUpToDate === null" class="has-text-grey">
  36. <FontAwesomeIcon :icon="['fas', 'times']" class="mr-1 has-text-danger" />{{ $t('errors.check_failed_try_later') }}
  37. </span>
  38. </UseColorMode>
  39. </div>
  40. </div>
  41. </template>