From 15f41a7e2a72103c4c03e787eb3a646b855b0be4 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 2 Jun 2026 08:54:39 +0000 Subject: [PATCH] fix(rental): no setState in effect for cart hydration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ESLint react-hooks/set-state-in-effect bloque le CI. On déplace la re-hydratation depuis le cookie dans le lazy initializer de useState (qui ne court qu'une fois côté client). Conserve la cohérence si un autre onglet a modifié le panier entre le render serveur et l'hydration, sans déclencher de re-render en cascade. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/components/RentalCartProvider.tsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/RentalCartProvider.tsx b/src/components/RentalCartProvider.tsx index 9f7c7db..2dd8738 100644 --- a/src/components/RentalCartProvider.tsx +++ b/src/components/RentalCartProvider.tsx @@ -4,7 +4,6 @@ import { createContext, useCallback, useContext, - useEffect, useMemo, useState, type ReactNode, @@ -44,12 +43,14 @@ function writeCookieClient(cart: Cart): void { } export function RentalCartProvider({ children, initial }: { children: ReactNode; initial?: Cart }) { - const [cart, setCart] = useState(initial ?? EMPTY_CART); - - // Hydrate depuis cookie au mount (au cas où le panier a changé dans un autre onglet) - useEffect(() => { - setCart(readCookieClient()); - }, []); + // Initial vient du serveur (cookie lu côté serveur). Sur le client on relit le + // cookie une seule fois via lazy initializer pour rester cohérent si un autre + // onglet a modifié le panier entre le render serveur et l'hydration. + const [cart, setCart] = useState(() => { + if (typeof document === "undefined") return initial ?? EMPTY_CART; + const fromCookie = readCookieClient(); + return fromCookie.items.length > 0 ? fromCookie : initial ?? EMPTY_CART; + }); const persist = useCallback((next: Cart) => { setCart(next);