Composant modal réutilisable permettant d'afficher les informations de contact du support.
app/components/shared/ContactSupportModal.vue
Ce composant affiche une modal avec :
Le composant utilise le pattern de slot pour intégrer le bouton déclencheur. La modal gère automatiquement son propre état via Nuxt UI.
<template>
<ContactSupportModal>
<UButton
label="Nous contacter"
icon="i-heroicons-phone"
color="neutral"
variant="outline"
/>
</ContactSupportModal>
</template>
Le bouton placé dans le slot par défaut devient automatiquement le déclencheur de la modal. Aucune gestion d'état n'est nécessaire.
Le composant n'a pas de props spécifiques. Il hérite des props de UModal de Nuxt UI si nécessaire.
useParameter()Les informations de contact sont récupérées via le composable useParameter :
contact_emailcontact_phoneValeurs par défaut si l'API échoue :
contact@save-france.fr+33 1 23 45 67 89<template>
<div class="flex gap-4">
<UButton @click="downloadContract" label="Télécharger" />
<ContactSupportModal>
<UButton
color="neutral"
variant="outline"
icon="i-heroicons-phone"
label="Nous contacter"
/>
</ContactSupportModal>
</div>
</template>
<template>
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<UButton
@click="downloadSignedContract"
color="neutral"
variant="outline"
icon="i-heroicons-document-arrow-down"
label="Télécharger le contrat"
/>
<ContactSupportModal>
<UButton
color="neutral"
variant="outline"
icon="i-heroicons-phone"
label="Nous contacter"
/>
</ContactSupportModal>
</div>
</template>
Vous pouvez personnaliser complètement le bouton déclencheur :
<template>
<ContactSupportModal>
<UButton
size="lg"
color="primary"
icon="i-heroicons-chat-bubble-left-right"
label="Besoin d'aide ?"
/>
</ContactSupportModal>
</template>
<template>
<div class="flex flex-col sm:flex-row gap-4">
<!-- Autres actions -->
<UButton @click="handleAction" label="Action principale" />
<!-- Support -->
<ContactSupportModal>
<UButton
class="w-full sm:w-auto"
color="neutral"
variant="outline"
icon="i-heroicons-phone"
label="Nous contacter"
/>
</ContactSupportModal>
</div>
</template>
UModal, UCard, UIcon, UInput, UButtonuseParameter() pour récupérer les données de contactuseToast() pour les notificationsLe composant nécessite que les paramètres suivants soient configurés dans le backend :
contact_email : Email de contact du supportcontact_phone : Numéro de téléphone du supportCes paramètres sont accessibles via l'endpoint :
GET /api/parameters/{code}
Les horaires d'ouverture sont actuellement codés en dur dans le composant :
Lundi - Vendredi : 9h00 - 18h00
Samedi : 9h00 - 12h00
Pour les rendre dynamiques :
opening_hours dans le backenduseParameter() dans le composantLe bouton déclencheur peut être entièrement personnalisé puisqu'il est passé via le slot :
<ContactSupportModal>
<!-- Bouton compact -->
<UButton
size="sm"
icon="i-heroicons-phone"
square
color="neutral"
variant="ghost"
/>
</ContactSupportModal>
<ContactSupportModal>
<!-- Lien texte -->
<button class="text-primary hover:underline">
Nous contacter
</button>
</ContactSupportModal>
<ContactSupportModal>
<!-- Badge cliquable -->
<UBadge color="primary" variant="subtle" class="cursor-pointer">
Support
</UBadge>
</ContactSupportModal>
portal à true par défaut)navigator.clipboardSi vous utilisiez auparavant le pattern avec v-model:open, voici comment migrer :
<template>
<div>
<UButton @click="isOpen = true" label="Contact" />
<ContactSupportModal v-model:open="isOpen" />
</div>
</template>
<script setup>
const isOpen = ref(false);
</script>
<template>
<ContactSupportModal>
<UButton label="Contact" />
</ContactSupportModal>
</template>
Le nouveau pattern est plus simple et laisse Nuxt UI gérer l'état de la modal automatiquement.