Content.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <!-- Message d'alerte -->
  2. <!-- eslint-disable vue/valid-v-for -->
  3. <template>
  4. <v-alert
  5. v-model="show"
  6. :type="props.alert.type"
  7. class="position"
  8. border="start"
  9. width="400"
  10. dismissible
  11. transition="fade-transition"
  12. @mouseover="onMouseOver"
  13. @mouseout="onMouseOut"
  14. >
  15. <ul v-if="props.alert.messages.length > 1">
  16. <li v-for="message in props.alert.messages" :key="message">
  17. - {{ $t(message) }}
  18. </li>
  19. </ul>
  20. <span v-else>
  21. {{ $t(props.alert.messages[0]) }}
  22. </span>
  23. </v-alert>
  24. </template>
  25. <script setup lang="ts">
  26. import type { Ref } from 'vue'
  27. import type { Alert } from '~/types/interfaces'
  28. import { usePageStore } from '~/stores/page'
  29. const props = defineProps({
  30. /**
  31. * The alert object to display
  32. */
  33. alert: {
  34. type: Object as () => Alert,
  35. required: true,
  36. },
  37. /**
  38. * The time after which the alert disappears
  39. */
  40. timeout: {
  41. type: Number,
  42. required: false,
  43. default: 3000,
  44. },
  45. })
  46. const show: Ref<boolean> = ref(true)
  47. let timeoutId: ReturnType<typeof setTimeout> | null = null
  48. const pageStore = usePageStore()
  49. /**
  50. * Retire l'alerte après `time` (en ms)
  51. * @param time
  52. */
  53. const clearAlert = (time: number = 4000) => {
  54. timeoutId = setTimeout(() => {
  55. show.value = false
  56. pageStore.removeSlowlyAlert()
  57. }, time)
  58. }
  59. /**
  60. * Réinitialise et suspend le délai avant le retrait de l'alerte au survol du curseur
  61. */
  62. const onMouseOver = () => {
  63. clearTimeout(timeoutId)
  64. }
  65. /**
  66. * Relance le timer avant le retrait de l'alerte lorsque le curseur quitte l'alerte
  67. */
  68. const onMouseOut = () => {
  69. clearAlert(props.timeout)
  70. }
  71. clearAlert()
  72. onUnmounted(() => {
  73. pageStore.clearAlertTimeout()
  74. })
  75. </script>
  76. <style scoped>
  77. .message-alert{
  78. list-style: disc;
  79. }
  80. </style>