import { useState, useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { Upload, FileArchive, ArrowLeft, CheckCircle, XCircle, Loader } from 'lucide-react'; import { Link } from 'react-router-dom'; import { toast } from 'react-hot-toast'; export default function BulkUploadStickers() { const navigate = useNavigate(); const { packId } = useParams(); const [loading, setLoading] = useState(false); const [zipFile, setZipFile] = useState(null); const [uploadProgress, setUploadProgress] = useState([]); const [completed, setCompleted] = useState(false); const [uploadStats, setUploadStats] = useState(null); const [packs, setPacks] = useState([]); const [selectedPackId, setSelectedPackId] = useState(packId || ''); const [loadingPacks, setLoadingPacks] = useState(false); useEffect(() => { fetchPacks(); }, []); const fetchPacks = async () => { try { setLoadingPacks(true); const response = await fetch('/api/stickerpacks?limit=100'); const data = await response.json(); setPacks(data.packs || []); if (packId) { setSelectedPackId(packId); } } catch (error) { console.error('Error fetching packs:', error); toast.error('Failed to load sticker packs'); } finally { setLoadingPacks(false); } }; const handleFileChange = (e) => { const file = e.target.files[0]; if (file && file.name.endsWith('.zip')) { setZipFile(file); setUploadProgress([]); setCompleted(false); } else { toast.error('Please select a ZIP file'); } }; const handleUpload = async () => { if (!zipFile) { toast.error('Please select a ZIP file first'); return; } if (!selectedPackId) { toast.error('Please select a sticker pack'); return; } setLoading(true); setUploadProgress([]); try { const formData = new FormData(); formData.append('zipFile', zipFile); formData.append('packId', selectedPackId); const response = await fetch('/api/stickerpacks/bulk-upload', { method: 'POST', body: formData }); if (response.ok) { const data = await response.json(); setUploadProgress(data.results || []); setUploadStats({ total: data.successCount || 0, premium: data.premiumCount || 0, regular: data.regularCount || 0 }); setCompleted(true); toast.success('Upload completed successfully'); if (data.packId) { setTimeout(() => { navigate(`/stickerpacks/${data.packId}`); }, 2000); } } else { const error = await response.json(); toast.error(`Error: ${error.error}`); } } catch (error) { console.error('Error uploading:', error); toast.error('Failed to upload ZIP file'); } finally { setLoading(false); } }; return (
Upload a ZIP file containing TGS/WEBP/PNG/WEBM sticker files. Random emojis will be assigned automatically.
✨ Premium Stickers Support:
Name files as 000_main.tgs + 000_effect.tgs for premium stickers with effects
{packId ? 'Pack is pre-selected from URL' : 'Choose which pack to add stickers to'}
{!packId && ( + Create new sticker pack first )}ZIP file should contain .tgs, .webp, .png or .webm files
XXX_main.tgs + XXX_effect.tgs naming✅ Total: {uploadStats.total} stickers uploaded successfully
{uploadStats.premium > 0 && (✨ Premium: {uploadStats.premium} stickers with effects
)} {uploadStats.regular > 0 && (📦 Regular: {uploadStats.regular} stickers
)} {packId &&Redirecting to pack...
}