"use client"; import { ChevronRight, Folder as Fd, Heart, Search, } from "lucide-react"; import { CircleButton } from "@/design-system/base/button"; import { useEffect, 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 { actionSearchPublicFolders, actionToggleFavorite, actionCheckFavorite, } from "@/modules/folder/folder-aciton"; import { TPublicFolder } from "@/shared/folder-type"; import { authClient } from "@/lib/auth-client"; interface PublicFolderCardProps { folder: TPublicFolder; currentUserId?: string; onFavoriteChange?: () => void; } const PublicFolderCard = ({ folder, currentUserId, onFavoriteChange }: PublicFolderCardProps) => { const router = useRouter(); const t = useTranslations("explore"); const [isFavorited, setIsFavorited] = useState(false); const [favoriteCount, setFavoriteCount] = useState(folder.favoriteCount); useEffect(() => { if (currentUserId) { actionCheckFavorite(folder.id).then((result) => { if (result.success && result.data) { setIsFavorited(result.data.isFavorited); setFavoriteCount(result.data.favoriteCount); } }); } }, [folder.id, currentUserId]); const handleToggleFavorite = async (e: React.MouseEvent) => { e.stopPropagation(); if (!currentUserId) { toast.error(t("pleaseLogin")); return; } const result = await actionToggleFavorite(folder.id); if (result.success && result.data) { setIsFavorited(result.data.isFavorited); setFavoriteCount(result.data.favoriteCount); onFavoriteChange?.(); } else { toast.error(result.message); } }; return (
{ router.push(`/explore/${folder.id}`); }} >

{folder.name}

{t("folderInfo", { userName: folder.userName ?? folder.userUsername ?? t("unknownUser"), totalPairs: folder.totalPairs, })}

{favoriteCount}
); }; interface ExploreClientProps { initialPublicFolders: TPublicFolder[]; } export function ExploreClient({ initialPublicFolders }: ExploreClientProps) { const t = useTranslations("explore"); const router = useRouter(); const [publicFolders, setPublicFolders] = useState(initialPublicFolders); const [loading, setLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const { data: session } = authClient.useSession(); const currentUserId = session?.user?.id; const handleSearch = async () => { if (!searchQuery.trim()) { setPublicFolders(initialPublicFolders); return; } setLoading(true); const result = await actionSearchPublicFolders(searchQuery.trim()); if (result.success && result.data) { setPublicFolders(result.data); } setLoading(false); }; const refreshFolders = async () => { setLoading(true); const result = await actionSearchPublicFolders(searchQuery.trim() || ""); if (result.success && result.data) { setPublicFolders(result.data); } setLoading(false); }; return (
setSearchQuery(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleSearch()} placeholder={t("searchPlaceholder")} className="w-full pl-10 pr-4 py-2 border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" />
{loading ? (

{t("loading")}

) : publicFolders.length === 0 ? (

{t("noFolders")}

) : ( publicFolders.map((folder) => ( )) )}
); }