Aller au contenu principal

Formulaire de contact Astro sans API route ni serveur

Par Maxime Branger · Publié le

Garder Astro statique

Avec Astro, on peut traiter un formulaire dans une API route, mais cela impose un adaptateur et un mode serveur. Si votre site est en output: 'static' , AirMess évite ce changement.

Étape 1 : le composant

Créez src/components/ContactForm.astro :

---
interface Props {
  formUrl?: string;
}
const { formUrl = import.meta.env.PUBLIC_AIRMESS_URL } = Astro.props;
---

<form id="contact-form" action={formUrl} method="POST">
  <label for="name">Nom</label>
  <input id="name" name="name" type="text" required />
  <label for="email">Email</label>
  <input id="email" name="email" type="email" required />
  <label for="message">Message</label>
  <textarea id="message" name="message" rows="5" required></textarea>
  <button type="submit">Envoyer</button>
  <p id="contact-status" role="status"></p>
</form>

<script>
  const form = document.querySelector<HTMLFormElement>('#contact-form')!;
  const status = document.querySelector('#contact-status')!;

  form.addEventListener('submit', async (e) => {
    e.preventDefault();
    const button = form.querySelector('button')!;
    button.disabled = true;
    status.textContent = 'Envoi en cours…';

    try {
      const res = await fetch(form.action, { method: 'POST', body: new FormData(form) });
      if (!res.ok) throw new Error(String(res.status));
      form.reset();
      status.textContent = 'Merci, votre message a bien été envoyé.';
    } catch {
      status.textContent = "L'envoi a échoué. Réessayez dans un instant.";
    } finally {
      button.disabled = false;
    }
  });
</script>

Étape 2 : la variable d'environnement

Dans .env :

PUBLIC_AIRMESS_URL=https://airmess.fr/api/submit/VOTRE_TOKEN

Le préfixe PUBLIC_ est nécessaire pour qu'Astro l'expose au build. L'URL n'est pas un secret, puisqu'elle apparaît dans le HTML, mais la variable permet d'utiliser une URL différente en préproduction.

Étape 3 : l'utiliser

---
import ContactForm from '../components/ContactForm.astro';
---
<h1>Contact</h1>
<ContactForm />

Astro traite et regroupe automatiquement le <script> du composant : pas de configuration supplémentaire.

Le code complet de ce tutoriel est disponible sur GitHub.