diff --git a/app/components/common/Cookies.telefunc.ts b/app/components/common/Cookies.telefunc.ts new file mode 100644 index 0000000..e58234e --- /dev/null +++ b/app/components/common/Cookies.telefunc.ts @@ -0,0 +1,25 @@ +import type { PageContext } from "vike/types"; + +import { getTelefuncContext } from "@/lib/getTelefuncContext"; +import { CookieParser } from "@/services/CookieParser"; + +export type ConsentCookies = keyof PageContext["cookies"]["consent"]; + +export async function onUpdateConsentCookie(cookieName: ConsentCookies, cookieValue: boolean) { + const context = getTelefuncContext(); + const { reply } = context; + + CookieParser.set(reply, cookieName, cookieValue.toString(), 365); + + return { ok: true, message: "Updated consent cookie", cookieName, cookieValue }; +} + +export async function onAcceptAllConsentCookie() { + const context = getTelefuncContext(); + const { reply } = context; + + CookieParser.set(reply, "analytics", "true", 365); + CookieParser.set(reply, "customization", "true", 365); + + return { ok: true, message: "Updated consents cookies" }; +} diff --git a/app/components/common/Cookies.tsx b/app/components/common/Cookies.tsx new file mode 100644 index 0000000..a9d3f20 --- /dev/null +++ b/app/components/common/Cookies.tsx @@ -0,0 +1,195 @@ +import { onUpdateConsentCookie, onAcceptAllConsentCookie, type ConsentCookies } from "./Cookies.telefunc"; +import React, { useState, useContext, createContext } from "react"; +import { usePageContext } from "vike-react/usePageContext"; +import { reload } from "vike/client/router"; +import { Button } from "@syntax/Button"; +import { toast } from "react-toastify"; +import { Toggle } from "./Toggle"; +import { Link } from "./Link"; + +export const CookiesContext = createContext<{ + cookies: { + analytics: boolean; + customization: boolean; + }; + setCookie: (cookieName: ConsentCookies, cookieValue: boolean) => void; + acceptAll: () => void; + isOpen: boolean; + setIsOpen: (isOpen: boolean) => void; + isSelectionOpen: boolean; + setIsSelectionOpen: (isSelectionOpen: boolean) => void; +}>({ + cookies: { + analytics: false, + customization: false, + }, + setCookie: (_cookieName: ConsentCookies, _cookieValue: boolean) => {}, + acceptAll: () => {}, + isOpen: false, + setIsOpen: () => {}, + isSelectionOpen: false, + setIsSelectionOpen: () => {}, +}); + +type CookiesContainerProps = { + children?: React.ReactNode; +}; + +export function CookiesContainer(props: CookiesContainerProps) { + const { cookies } = usePageContext(); + + const [consentCookies, setConsentCookies] = useState(cookies.consent); + const [isSelectionOpen, setIsSelectionOpen] = useState(false); + const [isOpen, setIsOpen] = useState(() => { + return !Object.keys(cookies.consent).every((value) => value); + }); + + const handleUpdateCookie = (cookieName: ConsentCookies, cookieValue: boolean) => { + setConsentCookies((prev) => ({ + ...prev, + [cookieName]: cookieValue, + })); + + toast + .promise(onUpdateConsentCookie(cookieName, cookieValue), { + pending: "Mise à jour des cookies...", + success: "Cookies mis à jour !", + error: "Erreur lors de la mise à jour des cookies", + }) + .then(() => { + setIsOpen(false); + reload(); + }); + }; + + const handleAcceptAll = () => { + setConsentCookies({ analytics: true, customization: true }); + + toast + .promise(onAcceptAllConsentCookie(), { + pending: "Acceptation des cookies...", + success: "Cookies acceptés !", + error: "Erreur lors de l'acceptation des cookies", + }) + .then(() => { + setIsOpen(false); + setIsSelectionOpen(false); + reload(); + }); + }; + + return ( + + {props.children} + {isSelectionOpen && } + {isOpen && } + + ); +} + +function CookieChoices() { + const cookiesContext = useContext(CookiesContext); + + return ( +
+
+ + +

Personnalisation des cookies 🍪

+ +
+ cookiesContext.setCookie("analytics", checked)} + /> + + cookiesContext.setCookie("customization", checked)} + /> +
+
+
+ ); +} + +function CookieModal() { + const cookiesContext = useContext(CookiesContext); + + return ( +
+ + +
+

+ Coucou c'est nous... +
+ les cookies ! 🍪 +

+ +

+ On ne t‘embête pas longtemps, on te laisse même le choix (si ça c‘est pas la classe 😎). +

+ +

+ Si tu veux en savoir plus, tu peux consulter la page{" "} + + Politique de confidentialité + + . +

+
+ +
+ + + + + +
+
+ ); +} diff --git a/app/layouts/LayoutDefault.tsx b/app/layouts/LayoutDefault.tsx index f6abc14..8209bf6 100644 --- a/app/layouts/LayoutDefault.tsx +++ b/app/layouts/LayoutDefault.tsx @@ -1,16 +1,13 @@ -import { onUpdateConsentCookie, onAcceptAllConsentCookie } from "./LayoutDefault.telefunc"; +import { CookiesContainer } from "@/components/common/Cookies"; import { MobileNavigation } from "@syntax/MobileNavigation"; import { usePageContext } from "vike-react/usePageContext"; import { ThemeProvider } from "@/providers/ThemeProvider"; -import { ToastContainer, toast } from "react-toastify"; import { ThemeSelector } from "@syntax/ThemeSelector"; -import { Button } from "@/components/syntax/Button"; -import { Toggle } from "@/components/common/Toggle"; import { clientOnly } from "vike-react/clientOnly"; import React, { useEffect, useState } from "react"; +import { ToastContainer } from "react-toastify"; import { Navigation } from "@syntax/Navigation"; import { Link } from "@/components/common/Link"; -import { reload } from "vike/client/router"; import { Hero } from "@syntax/Hero"; import { Logo } from "@syntax/Logo"; import clsx from "clsx"; @@ -80,141 +77,6 @@ function Header() { ); } -function CookieModal() { - const { cookies } = usePageContext(); - - const [consentCookies, setConsentCookies] = useState(cookies.consent); - const [isSelectionOpen, setIsSelectionOpen] = useState(false); - const [isOpen, setIsOpen] = useState(() => { - return !Object.keys(cookies.consent).every((value) => value); - }); - - if (isSelectionOpen) { - return ( -
-
- - -

Personnalisation des cookies 🍪

- -
- { - setConsentCookies({ ...consentCookies, analytics: checked }); - - toast - .promise(onUpdateConsentCookie("analytics", checked), { - pending: "Mise à jour des cookies...", - success: "Cookies mis à jour !", - error: "Erreur lors de la mise à jour des cookies.", - }) - .finally(reload); - }} - /> - - { - setConsentCookies({ ...consentCookies, analytics: checked }); - - toast - .promise(onUpdateConsentCookie("customization", checked), { - pending: "Mise à jour des cookies...", - success: "Cookies mis à jour !", - error: "Erreur lors de la mise à jour des cookies.", - }) - .then((data) => { - setConsentCookies({ ...consentCookies, [data.cookieName]: data.cookieValue }); - reload(); - }); - }} - /> -
-
-
- ); - } - - if (!isOpen) return null; - - return ( -
- - -
-

- Coucou c'est nous... -
- les cookies ! 🍪 -

- -

- On ne t‘embête pas longtemps, on te laisse même le choix (si ça c‘est pas la classe 😎). -

- -

- Si tu veux en savoir plus, tu peux consulter la page{" "} - - Politique de confidentialité - - . -

-
- -
- - - - - -
-
- ); -} - function Footer() { return (