fix(rental): no setState in effect for cart hydration
All checks were successful
CI / test (pull_request) Successful in 2m21s

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) <noreply@anthropic.com>
This commit is contained in:
Ubuntu 2026-06-02 08:54:39 +00:00
parent 740e9958aa
commit 15f41a7e2a

View file

@ -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<Cart>(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<Cart>(() => {
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);