SPB Git forge

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

232commits 1branches 0releases
172.9 MBsize
maindefault branch
2 days agolast push
HTML 98.9% Python 0.6%
2.2 KB · 69 lines tsx
Raw Blame History
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