Content.vue 1.6 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="start"
  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" :key="message">
  16. {{ $t(message) }}
  17. </li>
  18. </ul>
  19. <span v-else>
  20. {{ $t(props.alert.messages[0]) }}
  21. </span>
  22. </v-alert>
  23. </template>
  24. <script setup lang="ts">
  25. import type { Ref } from 'vue'
  26. import type { Alert } from '~/types/interfaces'
  27. import { usePageStore } from '~/stores/page'
  28. const props = defineProps({
  29. /**
  30. * The alert object to display
  31. */
  32. alert: {
  33. type: Object as () => Alert,
  34. required: true,
  35. },
  36. /**
  37. * The time after which the alert disappears
  38. */
  39. timeout: {
  40. type: Number,
  41. required: false,
  42. default: 3000,
  43. },
  44. })
  45. const show: Ref<boolean> = ref(true)
  46. let timeout: any = null
  47. const pageStore = usePageStore()
  48. /**
  49. * Retire l'alerte après `time` (en ms)
  50. * @param time
  51. */
  52. const clearAlert = (time: number = 4000) => {
  53. timeout = setTimeout(() => {
  54. show.value = false
  55. pageStore.removeSlowlyAlert()
  56. }, time)
  57. }
  58. /**
  59. * Réinitialise et suspend le délai avant le retrait de l'alerte au survol du curseur
  60. */
  61. const onMouseOver = () => {
  62. clearTimeout(timeout)
  63. }
  64. /**
  65. * Relance le timer avant le retrait de l'alerte lorsque le curseur quitte l'alerte
  66. */
  67. const onMouseOut = () => {
  68. clearAlert(props.timeout)
  69. }
  70. clearAlert()
  71. </script>
  72. <style scoped></style>