// ----------------------------------------------------------------------------- // Auto-Ka — Agrégateur de voitures usagées à vendre (province de Québec) // Auteur : Simon-Pierre Boucher — contact@spboucher.ai // account.tsx : contexte de compte partagé — profil connecté + favoris. // Les favoris vivent au HUB Groupe KA (magasin central « Mon univers Ka », // groupe-ka.com) : aucun stockage local, chaque ♥ est poussé au hub via // l'API d'Auto·Ka et la liste est relue du hub. Un seul fetch au montage ; // le cœur des cartes, la fiche et le menu compte lisent le même état // (toggle optimiste, re-synchronisé sur erreur). Non connecté : le clic // sur un ♥ envoie vers la connexion KA ID en gardant la page courante. // ----------------------------------------------------------------------------- import { ReactNode, createContext, useCallback, useContext, useEffect, useState, } from "react"; import { Me, Vehicle, fetchFavorites, fetchMe, toggleFavorite, vehicleFavItem, } from "./api"; interface AccountState { me: Me | null; enabled: boolean; // SSO KA ID configuré côté serveur loaded: boolean; // premier fetch terminé favs: Set; // uids des véhicules favoris (au hub) toggleFav: (v: Vehicle) => void; refresh: () => void; // re-fetch profil + favoris } const Ctx = createContext({ me: null, enabled: false, loaded: false, favs: new Set(), toggleFav: () => {}, refresh: () => {}, }); export const useAccount = () => useContext(Ctx); export function AccountProvider({ children }: { children: ReactNode }) { const [me, setMe] = useState(null); const [enabled, setEnabled] = useState(false); const [loaded, setLoaded] = useState(false); const [favs, setFavs] = useState>(new Set()); const loadFavs = useCallback(() => { fetchFavorites() .then((f) => setFavs(new Set(f.ids))) .catch(() => setFavs(new Set())); }, []); const refresh = useCallback(() => { fetchMe().then((r) => { setMe(r.user); setEnabled(r.enabled); setLoaded(true); if (r.user) loadFavs(); else setFavs(new Set()); }); }, [loadFavs]); useEffect(() => { refresh(); }, [refresh]); const toggleFav = useCallback((v: Vehicle) => { if (!me) { // pas de session : connexion KA ID puis retour sur la page courante const next = encodeURIComponent( window.location.pathname + window.location.search); window.location.href = `/api/auth/ka/login?next=${next}`; return; } setFavs((prev) => { const next = new Set(prev); const on = !next.has(v.uid); if (on) next.add(v.uid); else next.delete(v.uid); // pousse au hub (magasin central) ; en cas d'échec on se re-synchronise toggleFavorite(on, vehicleFavItem(v)).catch(loadFavs); return next; }); }, [me, loadFavs]); return ( {children} ); }