feat: Add function to update all consent cookies

This commit is contained in:
Gauthier Daniels 2025-04-18 15:18:07 +02:00
parent 53c708d0ca
commit 03b6a9a0a7
4 changed files with 40 additions and 14 deletions

View File

@ -7,10 +7,19 @@ type ConsentCookies = keyof PageContext["cookies"]["consent"];
export async function onUpdateConsentCookie(cookieName: ConsentCookies, cookieValue: boolean) { export async function onUpdateConsentCookie(cookieName: ConsentCookies, cookieValue: boolean) {
const context = getTelefuncContext(); const context = getTelefuncContext();
console.log(`Updating cookie ${cookieName} to ${cookieValue}`);
const { reply } = context; const { reply } = context;
CookieParser.set(reply, cookieName, cookieValue.toString(), 365); CookieParser.set(reply, cookieName, cookieValue.toString(), 365);
return { ok: true, message: "Updated consent cookie" }; 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" };
} }

View File

@ -1,4 +1,4 @@
import { onUpdateConsentCookie } from "./LayoutDefault.telefunc"; import { onUpdateConsentCookie, onAcceptAllConsentCookie } from "./LayoutDefault.telefunc";
import { MobileNavigation } from "@syntax/MobileNavigation"; import { MobileNavigation } from "@syntax/MobileNavigation";
import { usePageContext } from "vike-react/usePageContext"; import { usePageContext } from "vike-react/usePageContext";
import { ThemeProvider } from "@/providers/ThemeProvider"; import { ThemeProvider } from "@/providers/ThemeProvider";
@ -133,7 +133,10 @@ function CookieModal() {
success: "Cookies mis à jour !", success: "Cookies mis à jour !",
error: "Erreur lors de la mise à jour des cookies.", error: "Erreur lors de la mise à jour des cookies.",
}) })
.finally(reload); .then((data) => {
setConsentCookies({ ...consentCookies, [data.cookieName]: data.cookieValue });
reload();
});
}} }}
/> />
</div> </div>
@ -142,6 +145,8 @@ function CookieModal() {
); );
} }
if (!isOpen) return null;
return ( return (
<div className="flex flex-col fixed bottom-4 left-4 bg-slate-50 dark:bg-slate-800 z-50 rounded-md shadow-xl w-full max-w-sm overflow-hidden"> <div className="flex flex-col fixed bottom-4 left-4 bg-slate-50 dark:bg-slate-800 z-50 rounded-md shadow-xl w-full max-w-sm overflow-hidden">
<Button variant="ghost" size="sm" className="absolute top-0 right-0" onClick={() => setIsOpen(false)}> <Button variant="ghost" size="sm" className="absolute top-0 right-0" onClick={() => setIsOpen(false)}>
@ -185,8 +190,20 @@ function CookieModal() {
<button <button
className="cursor-pointer px-2 py-1 font-bold text-white dark:text-black bg-violet-600 dark:bg-violet-300" className="cursor-pointer px-2 py-1 font-bold text-white dark:text-black bg-violet-600 dark:bg-violet-300"
onClick={async () => { onClick={() => {
// TODO setConsentCookies({ analytics: true, customization: true });
toast
.promise(onAcceptAllConsentCookie(), {
pending: "Mise à jour des cookies...",
success: "Cookies mis à jour !",
error: "Erreur lors de la mise à jour des cookies.",
})
.then(() => {
setIsOpen(false);
setIsOpen(false);
reload();
});
}} }}
> >
Oui, j'ai faim ! Oui, j'ai faim !

View File

@ -16,8 +16,8 @@ export const vikeHandler: Get<[], UniversalHandler> = () => async (request, cont
headersOriginal: request.headers, headersOriginal: request.headers,
cookies: { cookies: {
consent: { consent: {
analytics: cookies.get("analytics", Boolean) || false, analytics: cookies.get<boolean>("analytics", (value) => value === "true") || false,
customization: cookies.get("customization", Boolean) || false, customization: cookies.get<boolean>("customization", (value) => value === "true") || false,
}, },
settings: { settings: {
theme: cookies.get("theme") || "light", theme: cookies.get("theme") || "light",

View File

@ -17,8 +17,8 @@ export class CookieParser {
this.parse(); this.parse();
} }
parse(): Record<string, string> { parse() {
return this.rawCookies.split("; ").reduce( this.cookies = this.rawCookies.split("; ").reduce(
(acc, cookie) => { (acc, cookie) => {
const [key, value] = cookie.split("="); const [key, value] = cookie.split("=");
acc[key] = decodeURIComponent(value); acc[key] = decodeURIComponent(value);
@ -28,11 +28,11 @@ export class CookieParser {
); );
} }
get(key: CookieKeys, formatter?: Function): string | undefined { get(key: CookieKeys): string | undefined;
get<T = unknown>(key: CookieKeys, formatter: (value: string) => T): T | undefined;
get<T = unknown>(key: CookieKeys, formatter?: (value: string) => T): T | string | undefined {
const value = this.cookies[key]; const value = this.cookies[key];
console.log({ key, value });
if (formatter) return formatter(value); if (formatter) return formatter(value);
return value; return value;
} }