"use client"; import { useEffect, useState, useCallback } from "react"; import { AssetCard } from "@/components/asset-card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; interface Asset { id: string; type: string; platform?: string | null; format?: string | null; fileName: string; filePath: string; dimensions?: string | null; metadata?: string | null; status: string; createdAt: string; campaign?: { name: string }; parentAsset?: { id: string; fileName: string } | null; } interface AssetGalleryProps { campaignId?: string; onPushToPostiz?: (assetIds: string[]) => void; } export function AssetGallery({ campaignId, onPushToPostiz }: AssetGalleryProps) { const [assets, setAssets] = useState([]); const [selectedIds, setSelectedIds] = useState>(new Set()); const [filters, setFilters] = useState({ platform: "all", type: "media", }); const [search, setSearch] = useState(""); const [sort, setSort] = useState("newest"); const fetchAssets = useCallback(() => { const params = new URLSearchParams(); if (campaignId) params.set("campaignId", campaignId); if (filters.platform !== "all") params.set("platform", filters.platform); if (filters.type !== "all") params.set("type", filters.type); if (search) params.set("search", search); fetch(`/api/assets?${params}`) .then((r) => r.json()) .then(setAssets) .catch(() => {}); }, [campaignId, filters, search]); useEffect(() => { fetchAssets(); }, [fetchAssets]); function toggleSelect(id: string) { setSelectedIds((prev) => { const next = new Set(prev); if (next.has(id)) next.delete(id); else next.add(id); return next; }); } const sortedAssets = [...assets].sort((a, b) => { switch (sort) { case "oldest": return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(); case "name-asc": return a.fileName.localeCompare(b.fileName); case "name-desc": return b.fileName.localeCompare(a.fileName); case "platform": return (a.platform || "").localeCompare(b.platform || ""); case "type": return a.type.localeCompare(b.type); case "newest": default: return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(); } }); return (
{/* Filters */}
setSearch(e.target.value)} className="h-9 w-48" /> {selectedIds.size > 0 && onPushToPostiz && (
)}
{/* Grid */} {sortedAssets.length === 0 ? (

No assets yet. Launch a pipeline to generate content.

) : (
{sortedAssets.map((asset) => ( ))}
)}
); }