"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { useFavorites, useSavedSearches, useCompare } from "@/lib/favorites"; import type { ListingCard } from "@/lib/types"; import { ListingCardView } from "@/components/listing-card"; import { Empty, Notice } from "@/components/ui"; export function useCards(uids: string[]) { const [cards, setCards] = useState([]); useEffect(() => { if (!uids.length) { setCards([]); return; } fetch(`/api/listings?uids=${encodeURIComponent(uids.join(","))}`).then((r) => r.json()).then((d) => setCards(d.items ?? [])).catch(() => setCards([])); }, [uids.join(",")]); // eslint-disable-line react-hooks/exhaustive-deps return cards; } export function FavoritesView({ member = false }: { member?: boolean } = {}) { const fav = useFavorites(); const saved = useSavedSearches(); const cmp = useCompare(); const cards = useCards(fav.items); const gone = fav.items.filter((u) => cards.length && !cards.some((c) => c.uid === u)); return (

Mes favoris

{cmp.items.length >= 2 && Comparateur ({cmp.items.length})}

{member ? "Favoris synchronisés avec votre compte Toveli, disponibles sur tous vos appareils." : <>Sans compte, vos favoris restent sur cet appareil. Connectez-vous pour les retrouver partout et créer des alertes.}

{fav.items.length === 0 ?
: (
{cards.map((c) => )}
)} {gone.length > 0 &&
{gone.length} favori{gone.length > 1 ? "s ne sont" : " n'est"} plus en ligne (annonce retirée par la source).
}

Recherches sauvegardées

{saved.items.length === 0 ?

Sauvegardez une recherche depuis la page des résultats pour la relancer en un clic.

:
    {saved.items.map((s) =>
  • {s.label}
  • )}
} Les alertes par courriel nécessiteront un compte ; cette première version garde tout en local.
); }