Content.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <!-- Message d'alerte -->
  2. <template>
  3. <v-alert
  4. v-model="show"
  5. :type="alert.type"
  6. class="position"
  7. border="left"
  8. width="400"
  9. dismissible
  10. transition="fade-transition"
  11. @mouseover="onMouseOver"
  12. @mouseout="onMouseOut"
  13. >
  14. <ul v-if="alert.messages.length > 1">
  15. <li v-for="message in alert.messages">
  16. {{ $t(message) }}
  17. </li>
  18. </ul>
  19. <span v-else>{{ $t(alert.messages[0]) }}</span>
  20. </v-alert>
  21. </template>
  22. <script setup lang="ts">
  23. import {Alert} from '~/types/interfaces'
  24. import {Ref} from "@vue/reactivity";
  25. import {usePageStore} from "~/stores/page";
  26. const props = defineProps({
  27. alert: {
  28. type: Object as () => Alert,
  29. required: true
  30. }
  31. })
  32. const show: Ref<boolean> = ref(true)
  33. let timeout: any = null
  34. const pageStore = usePageStore()
  35. /**
  36. * Retire l'alerte après `time` (en ms)
  37. * @param time
  38. */
  39. const clearAlert = (time: number = 2000) => {
  40. timeout = setTimeout(() => {
  41. show.value = false
  42. pageStore.removeSlowlyAlert()
  43. }, time)
  44. }
  45. /**
  46. * Réinitialise et suspend le délai avant le retrait de l'alerte au survol du curseur
  47. */
  48. const onMouseOver = () => {
  49. clearTimeout(timeout)
  50. }
  51. /**
  52. * Relance le timer avant le retrait de l'alerte lorsque le curseur quitte l'alerte
  53. */
  54. const onMouseOut = () => {
  55. clearAlert(2000)
  56. }
  57. clearAlert()
  58. </script>
  59. <style scoped>
  60. </style>