From 231667c2c6cf1d1e81022c4d4ed494dca6873b62 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 8 Feb 2026 20:49:54 +0000 Subject: [PATCH] feat: fix accents, improve candidature API, add legal pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix all missing French accents across 16 files (é, è, ê, à, ô, ç) - Improve candidature API error handling: check env vars, better messages - Add Mentions légales page (/mentions-legales) - Add CGV page (/cgv) - Add Politique de confidentialité page (/confidentialite) - Business info: Enguerrand Ozano, SIREN 994538932, TVA FR16994538932 https://claude.ai/code/session_01H2aRGDaKgarPvhay2HxN6Y --- app/(protected)/dashboard/page.tsx | 10 +- .../formations/[moduleId]/page.tsx | 6 +- app/(protected)/formations/page.tsx | 6 +- app/api/candidature/route.ts | 36 +++-- app/api/stripe/webhook/route.ts | 10 +- app/candidature/page.tsx | 30 ++-- app/cgv/page.tsx | 126 +++++++++++++++++ app/confidentialite/page.tsx | 129 ++++++++++++++++++ app/login/page.tsx | 4 +- app/mentions-legales/page.tsx | 84 ++++++++++++ app/merci/page.tsx | 18 +-- app/register/page.tsx | 16 +-- components/marketing/FAQ.tsx | 26 ++-- components/marketing/Footer.tsx | 12 +- components/marketing/Hero.tsx | 12 +- components/marketing/Method.tsx | 16 +-- components/marketing/PersonaCards.tsx | 24 ++-- components/marketing/Pricing.tsx | 16 +-- components/marketing/Testimonials.tsx | 18 +-- 19 files changed, 475 insertions(+), 124 deletions(-) create mode 100644 app/cgv/page.tsx create mode 100644 app/confidentialite/page.tsx create mode 100644 app/mentions-legales/page.tsx diff --git a/app/(protected)/dashboard/page.tsx b/app/(protected)/dashboard/page.tsx index 9190b20..d5b3cda 100644 --- a/app/(protected)/dashboard/page.tsx +++ b/app/(protected)/dashboard/page.tsx @@ -55,7 +55,7 @@ export default async function DashboardPage() { Bonjour {profile?.full_name?.split(" ")[0] || "!"} 👋

- Voici un apercu de ta progression dans le programme. + Voici un aperçu de ta progression dans le programme.

@@ -69,7 +69,7 @@ export default async function DashboardPage() { -

Modules completes

+

Modules complétés

{completedModules} @@ -122,11 +122,11 @@ export default async function DashboardPage() {

🚀

- Le programme arrive bientot ! + Le programme arrive bientôt !

- Les modules de formation sont en cours de preparation. Tu seras - notifie des qu'ils seront disponibles. + Les modules de formation sont en cours de préparation. Tu seras + notifié dès qu'ils seront disponibles.

)} diff --git a/app/(protected)/formations/[moduleId]/page.tsx b/app/(protected)/formations/[moduleId]/page.tsx index 95f9d9a..e3c6ad9 100644 --- a/app/(protected)/formations/[moduleId]/page.tsx +++ b/app/(protected)/formations/[moduleId]/page.tsx @@ -86,7 +86,7 @@ export default async function ModulePage({ params }: ModulePageProps) { d="M5 13l4 4L19 7" /> - Complete + Complété )} @@ -133,7 +133,7 @@ export default async function ModulePage({ params }: ModulePageProps) { d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" /> - Telecharger le PDF + Télécharger le PDF )} @@ -144,7 +144,7 @@ export default async function ModulePage({ params }: ModulePageProps) {
🎬

- Le contenu sera bientot disponible + Le contenu sera bientôt disponible

diff --git a/app/(protected)/formations/page.tsx b/app/(protected)/formations/page.tsx index 3794653..9c5a05a 100644 --- a/app/(protected)/formations/page.tsx +++ b/app/(protected)/formations/page.tsx @@ -53,7 +53,7 @@ export default async function FormationsPage() {

@@ -72,7 +72,7 @@ export default async function FormationsPage() { Semaine {week} - {weekCompleted}/{weekTotal} completes + {weekCompleted}/{weekTotal} complétés
@@ -101,7 +101,7 @@ export default async function FormationsPage() { Aucun module disponible

- Les modules de formation seront bientot disponibles. + Les modules de formation seront bientôt disponibles.

)} diff --git a/app/api/candidature/route.ts b/app/api/candidature/route.ts index c827fa1..e57e0c9 100644 --- a/app/api/candidature/route.ts +++ b/app/api/candidature/route.ts @@ -42,14 +42,26 @@ export async function POST(request: Request) { ); } - // Validation age + // Validation âge if (body.age < 18 || body.age > 65) { return NextResponse.json( - { error: "L'age doit etre entre 18 et 65 ans." }, + { error: "L'âge doit être entre 18 et 65 ans." }, { status: 400 } ); } + // Vérifier que les variables d'environnement Supabase sont configurées + if (!process.env.NEXT_PUBLIC_SUPABASE_URL || !process.env.SUPABASE_SERVICE_ROLE_KEY) { + console.error("Variables Supabase manquantes:", { + url: !!process.env.NEXT_PUBLIC_SUPABASE_URL, + serviceRole: !!process.env.SUPABASE_SERVICE_ROLE_KEY, + }); + return NextResponse.json( + { error: "Configuration serveur incomplète. Contactez l'administrateur." }, + { status: 500 } + ); + } + const supabase = createAdminClient(); // Vérifier si une candidature existe déjà avec cet email @@ -61,7 +73,7 @@ export async function POST(request: Request) { if (existing) { return NextResponse.json( - { error: "Une candidature avec cet email existe deja." }, + { error: "Une candidature avec cet email existe déjà." }, { status: 409 } ); } @@ -90,7 +102,7 @@ export async function POST(request: Request) { if (insertError) { console.error("Erreur insertion candidature:", insertError); return NextResponse.json( - { error: "Erreur lors de l'enregistrement de la candidature." }, + { error: "Erreur lors de l'enregistrement. Vérifiez que la base de données est configurée." }, { status: 500 } ); } @@ -104,30 +116,30 @@ export async function POST(request: Request) { await resend.emails.send({ from: "HookLab ", to: body.email, - subject: "Candidature HookLab recue !", + subject: "Candidature HookLab reçue !", html: `
-

Candidature recue !

+

Candidature reçue !

Salut ${body.firstname},

Merci pour ta candidature au programme HookLab !

-

Notre equipe va etudier ton profil et te repondre sous 24 heures.

-

A tres vite,
L'equipe HookLab

+

Notre équipe va étudier ton profil et te répondre sous 24 heures.

+

À très vite,
L'équipe HookLab

`, }); } catch (emailError) { - // Log l'erreur mais ne bloque pas la candidature console.error("Erreur envoi email:", emailError); } } return NextResponse.json( - { message: "Candidature enregistree avec succes." }, + { message: "Candidature enregistrée avec succès." }, { status: 201 } ); - } catch { + } catch (err) { + console.error("Erreur serveur candidature:", err); return NextResponse.json( - { error: "Erreur serveur. Veuillez reessayer." }, + { error: "Erreur serveur. Veuillez réessayer." }, { status: 500 } ); } diff --git a/app/api/stripe/webhook/route.ts b/app/api/stripe/webhook/route.ts index 318953c..12fc081 100644 --- a/app/api/stripe/webhook/route.ts +++ b/app/api/stripe/webhook/route.ts @@ -128,18 +128,18 @@ export async function POST(request: Request) { await resend.emails.send({ from: "HookLab ", to: email, - subject: "Bienvenue dans HookLab ! Tes acces sont prets", + subject: "Bienvenue dans HookLab ! Tes accès sont prêts", html: `

Bienvenue dans HookLab !

-

Ton paiement a ete confirme. Voici tes acces :

+

Ton paiement a été confirmé. Voici tes accès :

Email : ${email}

Mot de passe : ${tempPassword}

Connecte-toi sur hooklab.fr/login pour commencer.

-

Pense a changer ton mot de passe apres ta premiere connexion !

-

A tres vite,
L'equipe HookLab

+

Pense à changer ton mot de passe après ta première connexion !

+

À très vite,
L'équipe HookLab

`, }); @@ -204,7 +204,7 @@ export async function POST(request: Request) { } default: - console.log(`Webhook non gere: ${event.type}`); + console.log(`Webhook non géré: ${event.type}`); } return NextResponse.json({ received: true }); diff --git a/app/candidature/page.tsx b/app/candidature/page.tsx index ecd71bf..aec1c73 100644 --- a/app/candidature/page.tsx +++ b/app/candidature/page.tsx @@ -124,7 +124,7 @@ export default function CandidaturePage() { Candidature HookLab

- Reponds a quelques questions pour qu'on puisse evaluer ton + Réponds à quelques questions pour qu'on puisse évaluer ton profil.

@@ -151,8 +151,8 @@ export default function CandidaturePage() { updateField("firstname", e.target.value)} /> @@ -166,7 +166,7 @@ export default function CandidaturePage() { />
{[ { id: "jeune", - label: "Etudiant / Jeune", + label: "Étudiant / Jeune", emoji: "🎓", }, { @@ -231,13 +231,13 @@ export default function CandidaturePage() {
{[ - "Debutant complet", - "J'ai deja teste des choses", - "Je genere deja des revenus en ligne", + "Débutant complet", + "J'ai déjà testé des choses", + "Je génère déjà des revenus en ligne", ].map((opt) => (