import React, { useState, useEffect } from 'react'; import { X, UploadCloud, Eye, FileText, File } from 'lucide-react'; import { uploadAsset, scrapeCaseStudy } from '../../../services/assets-api'; import Modal from '../../../components/ui/Modal'; import Button from '../../../components/ui/Button'; import { useToast } from '../../../hooks/use-toast'; interface UploadAssetModalProps { isOpen: boolean; onClose: () => void; onSuccess: () => void; } export const UploadAssetModal: React.FC = ({ isOpen, onClose, onSuccess }) => { const { success, error } = useToast(); const [uploadTab, setUploadTab] = useState<'file' | 'url' | 'case_study'>('file'); const [uploadFile, setUploadFile] = useState(null); const [previewUrl, setPreviewUrl] = useState(null); const [fullImagePreviewUrl, setFullImagePreviewUrl] = useState(null); const [uploadUrl, setUploadUrl] = useState(''); const [caseStudyUrl, setCaseStudyUrl] = useState(''); const [thumbnailUrl, setThumbnailUrl] = useState(''); const [problemStatement, setProblemStatement] = useState(''); const [solution, setSolution] = useState(''); const [isScraping, setIsScraping] = useState(false); const [uploadTitle, setUploadTitle] = useState(''); const [uploadDescription, setUploadDescription] = useState(''); const [uploadCategory, setUploadCategory] = useState('Marketing'); const [uploadSubcategory, setUploadSubcategory] = useState(''); const [uploadTags, setUploadTags] = useState(''); const [uploadGithubUrl, setUploadGithubUrl] = useState(''); const [uploadIsDownloadable, setUploadIsDownloadable] = useState(true); const [isUploading, setIsUploading] = useState(false); useEffect(() => { if (!uploadFile) { setPreviewUrl(null); setFullImagePreviewUrl(null); return; } if (uploadFile.type.startsWith('image/')) { const url = URL.createObjectURL(uploadFile); setPreviewUrl(url); return () => { URL.revokeObjectURL(url); }; } else { setPreviewUrl(null); setFullImagePreviewUrl(null); } }, [uploadFile]); const handleFetchCaseStudy = async () => { if (!caseStudyUrl) { error('URL Required', 'Please enter a case study URL first.'); return; } if (!caseStudyUrl.startsWith('http')) { error('Invalid URL', 'Please enter a valid URL starting with http:// or https://'); return; } setIsScraping(true); try { const data = await scrapeCaseStudy(caseStudyUrl); setUploadTitle(data.title); setThumbnailUrl(data.thumbnailUrl); setProblemStatement(data.problemStatement); setSolution(data.solution); // Auto-set tag as case-study setUploadTags(prev => { const tags = prev.split(',').map(t => t.trim()).filter(Boolean); if (!tags.includes('case-study')) { tags.push('case-study'); } return tags.join(', '); }); // Auto-set category and subcategory setUploadCategory('Resources'); setUploadSubcategory('Case Study'); success('Case Study Details Fetched', 'Title, banner, problem, and solution successfully retrieved.'); } catch (err: any) { console.error('Failed to scrape case study', err); error('Failed to retrieve case study details', err.response?.data?.error || 'Make sure the URL is a valid showcase case study.'); } finally { setIsScraping(false); } }; const handleFetchUrlDetails = async () => { if (!uploadUrl) { error('URL Required', 'Please enter a URL first.'); return; } if (!uploadUrl.startsWith('http')) { error('Invalid URL', 'Please enter a valid URL starting with http:// or https://'); return; } setIsScraping(true); try { const data = await scrapeCaseStudy(uploadUrl); setUploadTitle(data.title); setThumbnailUrl(data.thumbnailUrl || ''); success('Page Details Fetched', 'Title and banner image successfully retrieved.'); } catch (err: any) { console.error('Failed to scrape URL details', err); error('Failed to retrieve page details', err.response?.data?.error || 'Make sure the URL is accessible.'); } finally { setIsScraping(false); } }; const formatBytes = (bytes: number, decimals = 2) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; }; const handleUploadSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (uploadTab === 'file' && !uploadFile) return; if (uploadTab === 'url' && !uploadUrl) return; if (uploadTab === 'case_study' && !caseStudyUrl) return; setIsUploading(true); const formData = new FormData(); if (uploadTab === 'file' && uploadFile) { formData.append('file', uploadFile); } else { formData.append('isUrlAsset', 'true'); formData.append('url', uploadTab === 'case_study' ? caseStudyUrl : uploadUrl); } formData.append('type', uploadTab === 'case_study' ? 'case_study' : (uploadTab === 'url' ? 'url' : '')); formData.append('title', uploadTitle || (uploadFile ? uploadFile.name : (uploadTab === 'case_study' ? caseStudyUrl : uploadUrl))); formData.append('description', uploadDescription); formData.append('categoryId', uploadCategory); formData.append('subcategory', uploadSubcategory); formData.append('tags', JSON.stringify(uploadTags.split(',').map(t => t.trim()).filter(Boolean))); formData.append('githubUrl', uploadGithubUrl); formData.append('isDownloadable', String(uploadIsDownloadable)); if (thumbnailUrl) { formData.append('thumbnailUrl', thumbnailUrl); } if (uploadTab === 'case_study') { formData.append('problemStatement', problemStatement); formData.append('solution', solution); } try { await uploadAsset(formData); setUploadFile(null); setUploadUrl(''); setCaseStudyUrl(''); setThumbnailUrl(''); setProblemStatement(''); setSolution(''); setUploadTitle(''); setUploadDescription(''); setUploadCategory('Marketing'); setUploadSubcategory(''); setUploadTags(''); setUploadGithubUrl(''); setUploadIsDownloadable(true); success('Asset published successfully', 'The asset has been added to the catalog.'); onSuccess(); onClose(); } catch (err: any) { console.error('Failed to upload asset', err); error('Failed to publish asset', err.response?.data?.error || 'Something went wrong.'); } finally { setIsUploading(false); } }; return ( <> } > {/* Toggle upload tabs */}
{uploadTab === 'file' ? (
{!uploadFile && ( { if (e.target.files?.[0]) { setUploadFile(e.target.files[0]); setUploadTitle(e.target.files[0].name); } }} required={uploadTab === 'file'} className="absolute inset-0 opacity-0 cursor-pointer z-10" /> )} {uploadFile && !previewUrl && ( )} {previewUrl && uploadFile ? (
Upload preview
{uploadFile?.name}

{formatBytes(uploadFile?.size || 0)}

) : uploadFile ? (
{uploadFile?.name?.endsWith('.pdf') ? ( ) : ( )}

{uploadFile?.name}

{formatBytes(uploadFile?.size || 0)}

) : (

Drag & drop or click to upload file

PDF, ZIP, PNG, JPG up to 50MB

)}
) : uploadTab === 'url' ? (
setUploadUrl(e.target.value)} placeholder="https://example.com/partner-docs" required={uploadTab === 'url'} className="flex-1 bg-ink-50 border border-ink-200 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ink-900/10 text-ink-900 placeholder-ink-400" />
Fetches title and thumbnail banner image from the target webpage automatically.
) : (
setCaseStudyUrl(e.target.value)} placeholder="https://showcase.tech4bizsolutions.com/ai-forecasting-pricing-for-fmcg-tech4biz-case-study/" required={uploadTab === 'case_study'} className="flex-1 bg-ink-50 border border-ink-200 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ink-900/10 text-ink-900 placeholder-ink-400" />
Fetches title, banner image, problem statement, and solution from the showcase platform.