import { Heart, RotateCcw } from "lucide-react"; import { useEffect, useState } from "react"; import { itemsOrEmpty } from "../../api"; import { isFavoritesAuthError, listFavorites } from "../../favorites/api"; import { useFavorites } from "../../favorites/FavoritesProvider"; import { useI18n } from "../../i18n"; import { Reveal } from "../../motion"; import { MessageBubble } from "../../components/messageStream/MessageBubble"; import { useSetPageTitle } from "../../components/PageTitleContext"; import { Skeleton } from "../../components/Skeleton"; import { useWallet } from "../../wallet/WalletProvider"; const pageSize = 50; export default function Favorites() { const { t } = useI18n(); const wallet = useWallet(); const { markFavorite } = useFavorites(); const [posts, setPosts] = useState< Awaited>["items"] >([]); const [loading, setLoading] = useState(false); const [loaded, setLoaded] = useState(false); const [error, setError] = useState(""); const [reloadKey, setReloadKey] = useState(0); useSetPageTitle(t("favorites")); useEffect(() => { if (!wallet.token || wallet.status !== "loggedIn") { setPosts([]); setLoading(false); setLoaded(false); setError(""); return; } let cancelled = false; setLoading(true); setLoaded(false); setError(""); listFavorites(wallet.token, { limit: pageSize, includeUnavailable: true, }) .then((data) => { if (cancelled) return; const items = itemsOrEmpty(data.items); setPosts(items); items.forEach((post) => markFavorite(post.id, true)); setLoaded(true); }) .catch((err) => { if (cancelled) return; if (isFavoritesAuthError(err)) { wallet.logout(); wallet.openLoginModal(); return; } setError(err instanceof Error ? err.message : t("loadFailed")); setLoaded(true); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [markFavorite, reloadKey, t, wallet]); if (wallet.status === "loading") { return ( {Array.from({ length: 4 }).map((_, index) => ( ))} ); } if (wallet.status !== "loggedIn") { return (

{t("favorites")}

{t("favoritesLoginDesc")}

); } return (
{loading || !loaded ? ( Array.from({ length: 4 }).map((_, index) => ( )) ) : error ? (

{error}

) : posts.length === 0 ? (

{t("favoritesEmptyTitle")}

{t("favoritesEmptyDesc")}

) : ( posts.map((post, index) => ( )) )}
); }