Content.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <!-- Message d'alerte -->
  2. <template>
  3. <v-alert
  4. v-model="show"
  5. :type="props.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="props.alert.messages.length > 1">
  15. <li v-for="message in props.alert.messages">
  16. {{ $t(message) }}
  17. </li>
  18. </ul>
  19. <span v-else>{{ $t(props.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. /**
  28. * The alert object to display
  29. */
  30. alert: {
  31. type: Object as () => Alert,
  32. required: true
  33. },
  34. /**
  35. * The time after which the alert disappears
  36. */
  37. timeout: {
  38. type: Number,
  39. required: false,
  40. default: 3000
  41. }
  42. })
  43. const show: Ref<boolean> = ref(true)
  44. let timeout: any = null
  45. const pageStore = usePageStore()
  46. /**
  47. * Retire l'alerte après `time` (en ms)
  48. * @param time
  49. */
  50. const clearAlert = (time: number = 2000) => {
  51. timeout = setTimeout(() => {
  52. show.value = false
  53. pageStore.removeSlowlyAlert()
  54. }, time)
  55. }
  56. /**
  57. * Réinitialise et suspend le délai avant le retrait de l'alerte au survol du curseur
  58. */
  59. const onMouseOver = () => {
  60. clearTimeout(timeout)
  61. }
  62. /**
  63. * Relance le timer avant le retrait de l'alerte lorsque le curseur quitte l'alerte
  64. */
  65. const onMouseOut = () => {
  66. clearAlert(props.timeout)
  67. }
  68. clearAlert()
  69. </script>
  70. <style scoped>
  71. </style>