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 (
{/* Header */}
Back

Bulk Upload Stickers from ZIP

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

{/* Upload Form */}
{/* Pack Selection */}

{packId ? 'Pack is pre-selected from URL' : 'Choose which pack to add stickers to'}

{!packId && ( + Create new sticker pack first )}
{/* File Input */}
{zipFile && ( {zipFile.name} ({(zipFile.size / 1024 / 1024).toFixed(2)} MB) )}

ZIP file should contain .tgs, .webp, .png or .webm files

{/* Info Box */}

ℹ️ How it works

  • Upload a ZIP file containing TGS, WEBP, PNG or WEBM sticker files
  • Each file will be extracted and processed
  • Random emoji will be assigned as fallback (alt) for each sticker
  • All stickers will be added to the selected pack
  • You can edit emoji assignments later
  • Supported formats: TGS (animated), WEBP (recommended), PNG
  • ✨ Premium: Use XXX_main.tgs + XXX_effect.tgs naming
{/* Upload Button */} {/* Progress */} {uploadProgress.length > 0 && (

Upload Results:

{uploadProgress.map((item, index) => (
{item.success ? ( ) : ( )}
{item.filename}
{item.emoji && (
Emoji: {item.emoji} | Document ID: {item.documentId} {item.premium && ✨ PREMIUM}
)} {item.error && (
{item.error}
)}
))}
)} {/* Success Message */} {completed && uploadStats && (

Upload Complete!

✅ 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...

}
)}
); }