Rovin / frontend /src /components /UploadBox.jsx
Dyen's picture
Deploy Rovin: Dockerized App
0a0a57b
import { useRef, useState } from 'react'
function UploadBox({ onUpload, isUploading }) {
const inputRef = useRef(null)
const [isDragOver, setIsDragOver] = useState(false)
const handleClick = () => {
if (!isUploading) {
inputRef.current?.click()
}
}
const handleChange = (e) => {
const file = e.target.files?.[0]
if (file) {
onUpload(file)
}
}
const handleDragOver = (e) => {
e.preventDefault()
setIsDragOver(true)
}
const handleDragLeave = (e) => {
e.preventDefault()
setIsDragOver(false)
}
const handleDrop = (e) => {
e.preventDefault()
setIsDragOver(false)
const file = e.dataTransfer.files?.[0]
if (file) {
onUpload(file)
}
}
return (
<div
className={`upload-box ${isDragOver ? 'dragover' : ''} ${isUploading ? 'uploading' : ''}`}
onClick={handleClick}
onDragOver={handleDragOver}
onDragLeave={handleDragLeave}
onDrop={handleDrop}
style={{
border: '1px solid var(--border-color)',
borderRadius: 'var(--radius)',
padding: '4rem 2rem',
textAlign: 'center',
cursor: 'pointer',
transition: 'all 0.2s ease',
background: 'var(--bg-card)',
height: '300px',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center'
}}
>
<input
ref={inputRef}
type="file"
accept="video/*"
onChange={handleChange}
style={{ display: 'none' }}
/>
<div className="upload-icon" style={{ marginBottom: '1.5rem', color: 'var(--text-secondary)' }}>
{isUploading ? (
<div className="spinner" />
) : (
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
<polyline points="17 8 12 3 7 8" />
<line x1="12" y1="3" x2="12" y2="15" />
</svg>
)}
</div>
<h2 className="upload-title" style={{
fontSize: '1.25rem',
fontWeight: '500',
marginBottom: '0.5rem',
color: 'var(--text-primary)'
}}>
{isUploading ? 'Processing...' : 'Upload Video'}
</h2>
<p className="upload-subtitle" style={{ color: 'var(--text-secondary)', fontSize: '0.9rem' }}>
{isUploading
? 'Creating shorts...'
: 'Drag & drop or click to browse'
}
</p>
</div>
)
}
export default UploadBox