"use client"; import { ChevronRight, Layers as DeckIcon, Heart, } from "lucide-react"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { toast } from "sonner"; import { PageLayout } from "@/components/ui/PageLayout"; import { PageHeader } from "@/components/ui/PageHeader"; import { CardList } from "@/components/ui/CardList"; import { VStack } from "@/design-system/layout/stack"; import { Skeleton } from "@/design-system/feedback/skeleton"; import { actionGetUserFavoriteDecks, actionToggleDeckFavorite } from "@/modules/deck/deck-action"; import type { ActionOutputUserFavoriteDeck } from "@/modules/deck/deck-action-dto"; interface FavoriteCardProps { favorite: ActionOutputUserFavoriteDeck; onRemoveFavorite: (deckId: number) => void; } const FavoriteCard = ({ favorite, onRemoveFavorite }: FavoriteCardProps) => { const router = useRouter(); const t = useTranslations("favorites"); const [isRemoving, setIsRemoving] = useState(false); const handleRemoveFavorite = async (e: React.MouseEvent) => { e.stopPropagation(); if (isRemoving) return; setIsRemoving(true); const result = await actionToggleDeckFavorite({ deckId: favorite.id }); if (result.success) { onRemoveFavorite(favorite.id); } else { toast.error(result.message); } setIsRemoving(false); }; return (
{ router.push(`/explore/${favorite.id}`); }} >

{favorite.name}

{t("folderInfo", { userName: favorite.userName ?? favorite.userUsername ?? t("unknownUser"), totalPairs: favorite.cardCount ?? 0, })}

); }; interface FavoritesClientProps { initialFavorites: ActionOutputUserFavoriteDeck[]; } export function FavoritesClient({ initialFavorites }: FavoritesClientProps) { const t = useTranslations("favorites"); const [favorites, setFavorites] = useState(initialFavorites); const [loading, setLoading] = useState(false); const loadFavorites = async () => { setLoading(true); const result = await actionGetUserFavoriteDecks(); if (result.success && result.data) { setFavorites(result.data); } setLoading(false); }; const handleRemoveFavorite = (deckId: number) => { setFavorites((prev) => prev.filter((f) => f.id !== deckId)); }; return ( {loading ? (

{t("loading")}

) : favorites.length === 0 ? (

{t("noFavorites")}

) : ( favorites.map((favorite) => ( )) )}
); }