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 (
+
Personnalisation des cookies 🍪
+ +
+ 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é + + . +
+Personnalisation des cookies 🍪
- -
- 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é - - . -
-