index-soutien/assets/js/newsletter-brevo.js
isUnknown 322d9136b6 PHP dynamique + cache JSON, nettoyage CSS/HTML, CI Forgejo
- Renommage classes/IDs (BEM cohérent, anglais, noms sémantiques)
- Correction HTML : h3→h2 FAQ, button>a→a[role=button] CTA mobile
- Conversion index.html → index.php (FR/EN) avec cache JSON depuis API Kirby
- Pages merci/thanks converties en PHP dynamique
- Ajout includes/cache.php + includes/config.php (cache TTL 5min)
- Ajout CI Forgejo (deploy FTP via lftp)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-12 08:00:58 +02:00

89 lines
2.6 KiB
JavaScript

(function () {
'use strict';
const PROXY_URL = '/api/brevo-newsletter-proxy.php';
async function subscribeToNewsletter(email, attributes = {}) {
const response = await fetch(PROXY_URL, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, attributes }),
});
const data = await response.json();
if (!response.ok) {
const error = new Error(
data.user_message || data.message || 'Subscription error'
);
error.code = data.error;
error.data = data;
throw error;
}
return data;
}
function showMessage(form, text, isError = false) {
const oldMessages = form.parentNode.querySelectorAll('.newsletter-message');
oldMessages.forEach((msg) => msg.remove());
const message = document.createElement('p');
message.className = 'newsletter-message';
message.textContent = text;
message.style.marginTop = '0.5rem';
message.style.fontSize = '0.9rem';
message.style.color = isError
? 'var(--color-error, #ef4444)'
: 'var(--color-success, #22c55e)';
form.parentNode.insertBefore(message, form.nextSibling);
if (!isError) {
setTimeout(() => message.remove(), 5000);
}
}
async function handleFormSubmit(event) {
event.preventDefault();
const form = event.target;
const emailInput = form.querySelector('input[type="email"]');
const submitButton = form.querySelector('button[type="submit"]');
if (!emailInput || !emailInput.value) {
const message = location.pathname.includes('/en/')
? 'Please enter a valid email address.'
: 'Veuillez entrer une adresse email valide.';
showMessage(form, messsage, true);
return;
}
const email = emailInput.value.trim();
submitButton.disabled = true;
try {
await subscribeToNewsletter(email);
const message = location.pathname.includes('/en/')
? 'Thank you! Your subscription has been confirmed.'
: 'Merci, votre inscription est confirmée !';
showMessage(form, message, false);
form.reset();
} catch (error) {
const isAlreadySubscribed = error.code === 'email_already_exists';
showMessage(form, error.message, !isAlreadySubscribed);
} finally {
submitButton.disabled = false;
}
}
function initNewsletterForms() {
const forms = document.querySelectorAll('.newsletter-form');
forms.forEach((form) => form.addEventListener('submit', handleFormSubmit));
}
document.addEventListener('DOMContentLoaded', initNewsletterForms);
})();