import { useMemo } from 'react' import { Link } from 'react-router-dom' import usePageMeta from '../hooks/usePageMeta' import useGameDates from '../hooks/useGameDates' import { formatDay, formatRange } from '../utils/gameDates' import bannerImg from '../assets/img/banner-accueil.webp' const gains = [ { label: 'Infuseur à thé', top: '26%', right: '26%', delay: 700, variant: 'a' }, { label: 'Boîte 100 g détox ou infusion', top: '22%', right: '1%', delay: 850, variant: 'b' }, { label: 'Boîte 100 g thé signature', top: '48%', right: '30%', delay: 1000, variant: 'a' }, { label: 'Coffret découverte 39 €', top: '78%', right: '2%', delay: 1150, variant: 'b' }, { label: 'Coffret découverte 69 €', top: '84%', right: '24%', delay: 1300, variant: 'a' }, ] function handleCardTilt(e) { const el = e.currentTarget const rect = el.getBoundingClientRect() const px = (e.clientX - rect.left) / rect.width - 0.5 const py = (e.clientY - rect.top) / rect.height - 0.5 el.style.transform = `perspective(700px) rotateX(${(-py * 12).toFixed(2)}deg) rotateY(${(px * 12).toFixed(2)}deg) scale(1.04)` } function resetCardTilt(e) { e.currentTarget.style.transform = '' } const TEA_EMOJI = ['🍃', '🍵', '🫖', '☕', '🥄', '✨'] function createTeaParticles(count) { return Array.from({ length: count }, (_, i) => ({ id: i, emoji: TEA_EMOJI[i % TEA_EMOJI.length], left: Math.round(Math.random() * 100), top: Math.round(Math.random() * 100), size: Math.round(20 + Math.random() * 26), duration: +(4 + Math.random() * 4).toFixed(1), delay: +(Math.random() * 4).toFixed(1), opacity: +(0.18 + Math.random() * 0.22).toFixed(2), drift: Math.round(12 + Math.random() * 20), })) } // Les dates viennent du tableau de bord admin (voir useGameDates). const buildFaqs = ({ start, lastPlayDay, lastClaimDay }) => [ { question: 'Comment obtenir un code ?', answer: `Achetez pour plus de 49 € dans notre boutique Thé Tip Top de Nice, du ${formatRange(start, lastPlayDay)} : un code unique à 10 caractères figure sur votre ticket de caisse ou votre facture.`, }, { question: 'Quels sont les lots à gagner ?', answer: ( <> Tous les tickets sont gagnants ! Selon votre ticket, vous pouvez remporter : Un tirage au sort désigne en plus un grand gagnant qui remporte une année de thé d'une valeur de 360 €. ), plainAnswer: "Tous les tickets sont gagnants ! Selon votre ticket, vous pouvez remporter : un infuseur à thé, une boîte de 100 g de thé détox ou d'infusion, une boîte de 100 g de thé signature, un coffret découverte d'une valeur de 39 €, ou un coffret découverte d'une valeur de 69 €. Un tirage au sort désigne en plus un grand gagnant qui remporte une année de thé d'une valeur de 360 €.", }, { question: 'Jusqu\'à quand puis-je jouer ?', answer: `La saisie des codes est ouverte du ${formatRange(start, lastPlayDay)} inclus. Les lots sont ensuite à retirer jusqu'au ${formatDay(lastClaimDay)}.`, }, { question: 'Que faire si mon code n\'est pas reconnu ?', answer: "Vérifiez que le code a été saisi sans espace ni erreur. Si le problème persiste, contactez-nous depuis la page Contact.", }, { question: 'Où retirer mon lot ?', answer: `Dans notre boutique de Nice, sur présentation de votre compte utilisateur validé et de la confirmation de gain affichée dans votre espace « Mes gains », jusqu'au ${formatDay(lastClaimDay)}.`, }, ] const buildFaqJsonLd = (faqs) => ({ '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faqs.map((faq) => ({ '@type': 'Question', name: faq.question, acceptedAnswer: { '@type': 'Answer', text: faq.plainAnswer || faq.answer, }, })), }) export default function Accueil() { const gameDates = useGameDates() const period = formatRange(gameDates.start, gameDates.lastPlayDay) const faqs = useMemo(() => buildFaqs(gameDates), [gameDates]) const faqJsonLd = useMemo(() => buildFaqJsonLd(faqs), [faqs]) const bannerAlt = `Jeu-concours 100 % Gagnant Thé Tip Top, du ${period} : tentez de gagner un an de thé d'une valeur de 360 € pour l'ouverture de notre 10e boutique à Nice.` usePageMeta({ title: `Jeu-concours 100 % Gagnant du ${formatRange(gameDates.start, gameDates.lastPlayDay, { withYear: false })} | Thé Tip Top`, description: `Du ${formatRange(gameDates.start, gameDates.lastPlayDay, { withYear: false })}, tout ticket de plus de 49 € de notre boutique de Nice porte un code 100 % gagnant. Saisissez le vôtre et repartez avec votre lot.`, }) const teaParticles = useMemo(() => createTeaParticles(30), []) return (