Lou·Ka — tous les logements à louer du Québec, un seul endroit.
HTML 98.9%
Python 0.6%
1// -----------------------------------------------------------------------------2// Lou-Ka — Agrégateur de logements à louer (province de Québec)3// Auteur : Simon-Pierre Boucher — contact@spboucher.ai4// account.tsx : contexte de compte partagé — profil connecté + favoris5// Un seul fetch au montage de l'app ; le cœur des cartes, le menu compte et6// les pages Favoris/Gestion lisent le même état (toggle optimiste).7// -----------------------------------------------------------------------------8import {9 ReactNode, createContext, useCallback, useContext, useEffect, useState,10} from "react";11import { Me, addFavorite, fetchFavorites, fetchMe, removeFavorite } from "./api";1213interface AccountState {14 me: Me | null;15 loaded: boolean; // premier fetch terminé16 favs: Set<string>; // uids favoris17 toggleFav: (uid: string) => void;18 refresh: () => void; // re-fetch profil + favoris (après login/rôle)19}2021const Ctx = createContext<AccountState>({22 me: null, loaded: false, favs: new Set(),23 toggleFav: () => {}, refresh: () => {},24});2526export const useAccount = () => useContext(Ctx);2728export function AccountProvider({ children }: { children: ReactNode }) {29 const [me, setMe] = useState<Me | null>(null);30 const [loaded, setLoaded] = useState(false);31 const [favs, setFavs] = useState<Set<string>>(new Set());3233 const refresh = useCallback(() => {34 fetchMe().then((m) => {35 setMe(m);36 setLoaded(true);37 if (m) {38 fetchFavorites()39 .then((f) => setFavs(new Set(f.uids)))40 .catch(() => setFavs(new Set()));41 } else {42 setFavs(new Set());43 }44 });45 }, []);4647 useEffect(() => { refresh(); }, [refresh]);4849 const toggleFav = useCallback((uid: string) => {50 setFavs((prev) => {51 const next = new Set(prev);52 if (next.has(uid)) {53 next.delete(uid);54 removeFavorite(uid).catch(() => {});55 } else {56 next.add(uid);57 addFavorite(uid).catch(() => {});58 }59 return next;60 });61 }, []);6263 return (64 <Ctx.Provider value={{ me, loaded, favs, toggleFav, refresh }}>65 {children}66 </Ctx.Provider>67 );68}69