the-tip-top-frontend/components/AboutContest.tsx
soufiane 7febb137e9 feat: add SonarQube integration, cookie consent, and authentication improvements
- Add SonarQube configuration for code quality analysis
  - sonar-project.properties with TypeScript/Next.js settings
  - .sonarignore to exclude build artifacts and dependencies
  - npm run sonar script
  - Jenkins pipeline stages for SonarQube analysis and quality gate

- Implement cookie consent banner
  - New CookieConsent component with matching site colors
  - localStorage persistence for user choice
  - Accept/Reject buttons with proper styling
  - Link to cookies policy page

- Add strict authentication protection for game page
  - Redirect unauthenticated users to login from /jeux
  - Clean up redundant auth checks and UI elements
  - Preserve redirect parameter for post-login navigation

- Implement smart navigation with auth-aware redirects
  - "Jouer maintenant" button redirects based on auth status
  - "Participer au jeu" footer link with conditional routing
  - Authenticated users go to /jeux, others to /register

- UI improvements and cleanup
  - Remove "Voir les lots" button from homepage
  - Remove "Gestion des cookies" from footer
  - Remove "À propos" from footer navigation
  - Consistent design across components

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 01:23:50 +01:00

112 lines
5.5 KiB
TypeScript

'use client';
import Image from 'next/image';
import Link from 'next/link';
import Button from './Button';
interface AboutContestProps {
title?: string;
description?: string;
imageUrl?: string;
}
export default function AboutContest({
title = "Jeu Concours Thé Tip Top - Boutique de Thé Premium à Nice",
description,
imageUrl = "/images/tea-collection.jpg",
}: AboutContestProps) {
const defaultDescription = `
Bienvenue dans notre grand jeu-concours Thé Tip Top organisé à l'occasion de l'ouverture de notre 10ème boutique de thé premium à Nice.
Nous vous offrons la chance de gagner des produits exceptionnels : thés bio, accessoires exclusifs et bien plus encore.
Participez facilement en quelques clics et tentez votre chance parmi nos lots prestigieux.
Avec 100% de tickets gagnants, chaque participation vous offre la garantie de repartir avec un cadeau !
`;
return (
<section className="py-20 bg-white/50 backdrop-blur-sm">
<div className="container mx-auto px-4">
<div className="max-w-7xl mx-auto">
<div className="grid md:grid-cols-2 gap-16 items-center">
{/* Texte */}
<div className="order-2 md:order-1 space-y-6">
<h2 className="text-4xl md:text-5xl font-bold text-[#5a5a4e] leading-tight">
Jeu Concours Thé Tip Top
<span className="block text-3xl md:text-4xl text-[#d4a574] mt-2">
Boutique Premium à Nice
</span>
</h2>
<div className="space-y-4 text-lg text-gray-700">
<p className="leading-relaxed">
Bienvenue dans notre grand jeu-concours <span className="font-semibold text-[#5a5a4e]">Thé Tip Top</span> organisé à l'occasion de l'ouverture de notre <span className="font-semibold text-[#d4a574]">10ème boutique</span> de thé premium à Nice.
</p>
<p className="leading-relaxed">
Nous vous offrons la chance de gagner des produits exceptionnels : thés bio, accessoires exclusifs et bien plus encore.
</p>
<p className="leading-relaxed">
Participez facilement en quelques clics et tentez votre chance parmi nos lots prestigieux.
</p>
<div className="bg-gradient-to-r from-[#d4a574]/10 to-[#c4956a]/10 border-l-4 border-[#d4a574] p-4 rounded-r-lg">
<p className="font-semibold text-[#5a5a4e] text-xl">
100% de tickets gagnants ! Chaque participation vous offre la garantie de repartir avec un cadeau.
</p>
</div>
</div>
<div className="flex flex-col sm:flex-row gap-4 pt-4">
<Link href="/register">
<button className="bg-gradient-to-r from-[#d4a574] to-[#c4956a] hover:from-[#e5b685] hover:to-[#d4a574] text-white font-bold text-lg px-8 py-4 rounded-lg transition-all duration-300 hover:shadow-[0_0_25px_rgba(212,165,116,0.7)] hover:scale-105 shadow-lg flex items-center justify-center gap-2">
En savoir plus
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 7l5 5m0 0l-5 5m5-5H6" />
</svg>
</button>
</Link>
</div>
</div>
{/* Image */}
<div className="order-1 md:order-2">
<div className="relative rounded-2xl overflow-hidden shadow-2xl">
{/* Fallback avec illustration CSS si l'image n'existe pas */}
<div className="aspect-[4/3] bg-gradient-to-br from-[#1a4d2e] via-[#2d5a3d] to-[#1a4d2e] relative">
{/* Motif décoratif */}
<div className="absolute inset-0 opacity-20">
<div className="absolute inset-0" style={{
backgroundImage: 'url("data:image/svg+xml,%3Csvg width=\'60\' height=\'60\' viewBox=\'0 0 60 60\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cg fill=\'none\' fill-rule=\'evenodd\'%3E%3Cg fill=\'%23ffffff\' fill-opacity=\'0.3\'%3E%3Cpath d=\'M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z\'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E")',
}}></div>
</div>
{/* Icône de thé */}
<div className="absolute inset-0 flex items-center justify-center">
<div className="text-9xl opacity-40">🍵</div>
</div>
{/* Badges décoratifs */}
<div className="absolute top-4 right-4 bg-[#f59e0b] text-white px-4 py-2 rounded-full font-bold shadow-lg">
10 ans
</div>
<div className="absolute bottom-4 left-4 bg-white/90 backdrop-blur-sm text-[#1a4d2e] px-4 py-2 rounded-full font-bold shadow-lg">
Premium Bio
</div>
</div>
{/* Note: Vous pouvez remplacer le div ci-dessus par une vraie image :
<Image
src={imageUrl}
alt="Collection de thés Thé Tip Top"
width={600}
height={450}
className="w-full h-full object-cover"
/>
*/}
</div>
</div>
</div>
</div>
</div>
</section>
);
}