vp-reload-prompt.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <script setup lang="ts">
  2. import { computed, watch } from 'vue'
  3. import { useStorage } from '@vueuse/core'
  4. import { useRegisterSW } from 'virtual:pwa-register/vue'
  5. import { useLang } from '../composables/lang'
  6. import pwaLocale from '../../i18n/component/pwa.json'
  7. const lang = useLang()
  8. const locale = computed(() => pwaLocale[lang.value])
  9. const { needRefresh, updateServiceWorker } = useRegisterSW()
  10. const alwaysRefresh = useStorage('PWA_Always_Refresh', false)
  11. watch(needRefresh, (value) => {
  12. value && alwaysRefresh.value && updateServiceWorker()
  13. })
  14. </script>
  15. <template>
  16. <transition name="pwa-popup">
  17. <el-card v-if="!alwaysRefresh && needRefresh" class="pwa-card" role="alert">
  18. <p class="pwa-card-text">{{ locale.message }}</p>
  19. <el-button type="primary" plain @click="updateServiceWorker()">
  20. {{ locale.refresh }}
  21. </el-button>
  22. <el-button plain @click="alwaysRefresh = true">
  23. {{ locale['always-refresh'] }}
  24. </el-button>
  25. <el-button plain @click="needRefresh = false">
  26. {{ locale.close }}
  27. </el-button>
  28. </el-card>
  29. </transition>
  30. </template>
  31. <style scoped>
  32. .pwa-card {
  33. position: fixed;
  34. right: 1em;
  35. bottom: 1em;
  36. z-index: 3000;
  37. text-align: center;
  38. }
  39. .pwa-card .pwa-card-text {
  40. margin: 0 0 1em;
  41. }
  42. .pwa-popup-enter-active,
  43. .pwa-popup-leave-active {
  44. transition: var(--el-transition-md-fade);
  45. }
  46. .pwa-popup-enter,
  47. .pwa-popup-leave-to {
  48. opacity: 0;
  49. transform: translate(0, 50%) scale(0.5);
  50. }
  51. </style>