import { useState } from 'react'; import { Upload, UploadCloud, X, FileText, Image as ImageIcon, FileVideo } from 'lucide-react'; import { toast } from 'sonner'; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; interface Asset { id: string; file: File; previewUrl?: string; type: string; } interface AssetUploaderProps { onAssetsChange?: (assets: Asset[]) => void; maxAssets?: number; allowedTypes?: string[]; label?: string; description?: string; } export default function AssetUploader({ onAssetsChange, maxAssets = 10, allowedTypes = ['image/*', 'application/pdf', 'video/*'], label = 'Upload Assets', description = 'Upload creative assets for testing' }: AssetUploaderProps) { const [assets, setAssets] = useState([]); const handleFileUpload = (files: FileList | null) => { if (!files || files.length === 0) return; // Check if adding these files would exceed the limit if (assets.length + files.length > maxAssets) { toast.error(`You can only upload up to ${maxAssets} assets`); return; } // Convert FileList to array and create asset objects const newAssets: Asset[] = Array.from(files).map(file => { // Generate a preview URL for images const previewUrl = file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined; return { id: `asset-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, file, previewUrl, type: file.type, }; }); const updatedAssets = [...assets, ...newAssets]; setAssets(updatedAssets); // Notify parent component about the change if (onAssetsChange) { onAssetsChange(updatedAssets); } toast.success(`${newAssets.length} asset(s) uploaded`, { description: "Assets added to your project", }); }; const handleRemoveAsset = (assetId: string) => { const assetToRemove = assets.find(asset => asset.id === assetId); if (assetToRemove?.previewUrl) { URL.revokeObjectURL(assetToRemove.previewUrl); } const updatedAssets = assets.filter(asset => asset.id !== assetId); setAssets(updatedAssets); // Notify parent component about the change if (onAssetsChange) { onAssetsChange(updatedAssets); } toast.info('Asset removed'); }; // Determine the icon to use based on file type const getAssetIcon = (type: string) => { if (type.startsWith('image/')) { return ; } else if (type.startsWith('video/')) { return ; } else if (type === 'application/pdf') { return ; } else { return ; } }; return (
{/* Upload area */}

{label}

{description}

handleFileUpload(e.target.files)} className="hidden" id="asset-uploader-input" />

{maxAssets - assets.length} of {maxAssets} uploads remaining

{/* Assets preview */} {assets.length > 0 && (

Uploaded Assets ({assets.length})

{assets.map((asset) => (
{asset.previewUrl ? ( {asset.file.name} ) : ( getAssetIcon(asset.type) )}

{asset.file.name}

{(asset.file.size / 1024).toFixed(1)} KB

))}
)}
); }