Dev #1

Merged
jessy-david-dev merged 7 commits from dev into main 2026-01-27 17:08:37 +00:00
jessy-david-dev commented 2026-01-27 17:08:28 +00:00 (Migrated from github.com)
No description provided.
copilot-pull-request-reviewer[bot] (Migrated from github.com) reviewed 2026-01-27 17:12:42 +00:00
copilot-pull-request-reviewer[bot] (Migrated from github.com) left a comment

Pull request overview

Ajout des éléments de conformité (RGPD) autour des cookies et des pages légales, avec intégration Google Tag Manager (Consent Mode) et liens légaux dans le footer.

Changes:

  • Ajout d’une bannière de consentement cookies avec préférences (analytics) + déclenchement Consent Mode.
  • Création des pages “Mentions légales” et “Politique de confidentialité”, et ajout des liens correspondants dans le footer.
  • Ajout d’un checkbox de consentement RGPD au formulaire de contact + mise à jour du lien “Accueil”.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
component/ui/CookieBanner.tsx Nouvelle bannière cookies + gestion des préférences et mise à jour du consentement GA/GTM.
component/sections/Contact.tsx Ajout du consentement RGPD (checkbox requis) au formulaire.
component/layout/NavBar.tsx Changement du lien “Accueil” vers /.
component/layout/Footer.tsx Ajout des liens légaux + bouton “Gérer les cookies”.
app/politique-de-confidentialite/page.tsx Nouvelle page de politique de confidentialité.
app/mentions-legales/page.tsx Nouvelle page de mentions légales.
app/layout.tsx Intégration GTM + Consent Mode par défaut + affichage de la CookieBanner.
README.md Mise à jour des badges versions (Next/TS/Tailwind) + ajustements de mise en forme.
Comments suppressed due to low confidence (1)

component/layout/NavBar.tsx:33

  • navLinks utilise maintenant href: "/" pour l’accueil, mais ces liens sont rendus via SmoothLink, qui fait systématiquement preventDefault() et tente de scroller vers un élément dont l’id est dérivé de href.replace("#", ""). Avec "/", aucun scroll ne se produit et la navigation vers / est bloquée ; en plus, la logique activeSection compare à "/" et l’accueil ne pourra jamais être actif. Solution : revenir à un lien d’ancre (ex: #home) ou adapter l’implémentation utilisée ici pour les liens / (utiliser next/link ou faire en sorte que SmoothLink n’empêche pas la navigation quand href ne commence pas par #).
// Configuration des liens de navigation avec leurs icônes
const navLinks: NavLink[] = [
  { href: "/", label: "Accueil", icon: Home },
  { href: "#about", label: "À propos", icon: User },
  { href: "#skills", label: "Compétences", icon: Code2 },
  { href: "#projects", label: "Projets", icon: FolderKanban },
  { href: "#contact", label: "Contact", icon: Mail },
];

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

## Pull request overview Ajout des éléments de conformité (RGPD) autour des cookies et des pages légales, avec intégration Google Tag Manager (Consent Mode) et liens légaux dans le footer. **Changes:** - Ajout d’une bannière de consentement cookies avec préférences (analytics) + déclenchement Consent Mode. - Création des pages “Mentions légales” et “Politique de confidentialité”, et ajout des liens correspondants dans le footer. - Ajout d’un checkbox de consentement RGPD au formulaire de contact + mise à jour du lien “Accueil”. ### Reviewed changes Copilot reviewed 8 out of 8 changed files in this pull request and generated 5 comments. <details> <summary>Show a summary per file</summary> | File | Description | | ---- | ----------- | | component/ui/CookieBanner.tsx | Nouvelle bannière cookies + gestion des préférences et mise à jour du consentement GA/GTM. | | component/sections/Contact.tsx | Ajout du consentement RGPD (checkbox requis) au formulaire. | | component/layout/NavBar.tsx | Changement du lien “Accueil” vers `/`. | | component/layout/Footer.tsx | Ajout des liens légaux + bouton “Gérer les cookies”. | | app/politique-de-confidentialite/page.tsx | Nouvelle page de politique de confidentialité. | | app/mentions-legales/page.tsx | Nouvelle page de mentions légales. | | app/layout.tsx | Intégration GTM + Consent Mode par défaut + affichage de la CookieBanner. | | README.md | Mise à jour des badges versions (Next/TS/Tailwind) + ajustements de mise en forme. | </details> <details> <summary>Comments suppressed due to low confidence (1)</summary> **component/layout/NavBar.tsx:33** * `navLinks` utilise maintenant `href: "/"` pour l’accueil, mais ces liens sont rendus via `SmoothLink`, qui fait systématiquement `preventDefault()` et tente de scroller vers un élément dont l’id est dérivé de `href.replace("#", "")`. Avec `"/"`, aucun scroll ne se produit et la navigation vers `/` est bloquée ; en plus, la logique `activeSection` compare à `"/"` et l’accueil ne pourra jamais être actif. Solution : revenir à un lien d’ancre (ex: `#home`) ou adapter l’implémentation utilisée ici pour les liens `/` (utiliser `next/link` ou faire en sorte que `SmoothLink` n’empêche pas la navigation quand `href` ne commence pas par `#`). ``` // Configuration des liens de navigation avec leurs icônes const navLinks: NavLink[] = [ { href: "/", label: "Accueil", icon: Home }, { href: "#about", label: "À propos", icon: User }, { href: "#skills", label: "Compétences", icon: Code2 }, { href: "#projects", label: "Projets", icon: FolderKanban }, { href: "#contact", label: "Contact", icon: Mail }, ]; ``` </details> --- 💡 <a href="/jessy-david-dev/jessy-david.dev/new/main/.github/instructions?filename=*.instructions.md" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Add Copilot custom instructions</a> for smarter, more guided reviews. <a href="https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Learn how to get started</a>.
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-01-27 17:12:40 +00:00

L’ID GTM (GTM-TJDQ3XJD) est hardcodé dans le script inline. Ça rend les déploiements multi-environnements (dev/staging/prod) difficiles et impose un changement de code pour changer de conteneur. Solution : passer l’ID via une variable d’environnement publique (ex: NEXT_PUBLIC_GTM_ID) et l’injecter dans le template, et idéalement utiliser next/script pour mieux contrôler le chargement (et éviter les soucis CSP).

L’ID GTM (`GTM-TJDQ3XJD`) est hardcodé dans le script inline. Ça rend les déploiements multi-environnements (dev/staging/prod) difficiles et impose un changement de code pour changer de conteneur. Solution : passer l’ID via une variable d’environnement publique (ex: `NEXT_PUBLIC_GTM_ID`) et l’injecter dans le template, et idéalement utiliser `next/script` pour mieux contrôler le chargement (et éviter les soucis CSP).
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-01-27 17:12:41 +00:00

Le logo utilise aussi SmoothLink avec href="/". Comme SmoothLink empêche la navigation et ne sait scroller que vers un id (via href.replace("#", "")), cliquer sur le logo ne ramènera pas à l’accueil. Même correctif que pour les liens de nav : utiliser une ancre (#home) ou remplacer ce lien par un next/link (ou un SmoothLink qui ne preventDefault() que pour les ancres).

Le logo utilise aussi `SmoothLink` avec `href="/"`. Comme `SmoothLink` empêche la navigation et ne sait scroller que vers un `id` (via `href.replace("#", "")`), cliquer sur le logo ne ramènera pas à l’accueil. Même correctif que pour les liens de nav : utiliser une ancre (`#home`) ou remplacer ce lien par un `next/link` (ou un `SmoothLink` qui ne `preventDefault()` que pour les ancres).
@@ -294,0 +318,4 @@
</a>
. *
</label>
</div>
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-01-27 17:12:41 +00:00

Le checkbox "Consentement RGPD" est bien required côté UI, mais sa valeur n’est jamais lue dans handleSubmit (seuls name/email/message/captchaToken sont envoyés). Du coup, le backend ne peut pas tracer/valider le consentement (et un appel direct à /api/contact peut contourner la contrainte). Solution : inclure explicitement un champ de consentement (ex: booléen dérivé de formData.get(...)) dans le payload, et le valider côté API.

Le checkbox "Consentement RGPD" est bien `required` côté UI, mais sa valeur n’est jamais lue dans `handleSubmit` (seuls `name/email/message/captchaToken` sont envoyés). Du coup, le backend ne peut pas tracer/valider le consentement (et un appel direct à `/api/contact` peut contourner la contrainte). Solution : inclure explicitement un champ de consentement (ex: booléen dérivé de `formData.get(...)`) dans le payload, et le valider côté API.
@@ -0,0 +25,4 @@
return { necessary: true, analytics: false };
}
}
return { necessary: true, analytics: false };
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-01-27 17:12:41 +00:00

getInitialPreferences fait JSON.parse(savedPreferences) et retourne le résultat tel quel, sans validation. Si le localStorage contient une forme inattendue (ou des types non booléens), l’état preferences peut devenir incohérent (ex: necessary manquant/false alors qu’il est supposé toujours true). Solution : valider/coercer la forme (booleans) et forcer necessary: true au chargement avant de l’utiliser.

`getInitialPreferences` fait `JSON.parse(savedPreferences)` et retourne le résultat tel quel, sans validation. Si le localStorage contient une forme inattendue (ou des types non booléens), l’état `preferences` peut devenir incohérent (ex: `necessary` manquant/false alors qu’il est supposé toujours true). Solution : valider/coercer la forme (booleans) et forcer `necessary: true` au chargement avant de l’utiliser.
@@ -0,0 +100,4 @@
// Envoyer un événement pour GTM
// @ts-expect-error - dataLayer n'est pas typé
window.dataLayer?.push({ event: "cookie_consent_analytics" });
}
copilot-pull-request-reviewer[bot] (Migrated from github.com) commented 2026-01-27 17:12:42 +00:00

Le fichier utilise plusieurs @ts-expect-error pour window.gtag / window.dataLayer. Ici ce n’est pas une erreur ponctuelle mais une API globale attendue : il serait préférable de déclarer ces propriétés dans un fichier de types global (ex: global.d.ts avec interface Window { gtag?: ...; dataLayer?: ... }) pour éviter de masquer d’éventuelles vraies erreurs et réduire le bruit TS.

Le fichier utilise plusieurs `@ts-expect-error` pour `window.gtag` / `window.dataLayer`. Ici ce n’est pas une erreur ponctuelle mais une API globale attendue : il serait préférable de déclarer ces propriétés dans un fichier de types global (ex: `global.d.ts` avec `interface Window { gtag?: ...; dataLayer?: ... }`) pour éviter de masquer d’éventuelles vraies erreurs et réduire le bruit TS.
Sign in to join this conversation.