'use client' import { useState } from 'react' export interface UploadFormData { title: string audioFile: File | null coverFile: File | null albumId?: string genreIds: string[] releaseDate: string } export interface UploadFormProps { onSubmit: (data: UploadFormData) => void | Promise albums?: Array<{ id: string; title: string }> genres?: Array<{ id: string; name: string }> isLoading?: boolean } export function UploadForm({ onSubmit, albums = [], genres = [], isLoading = false }: UploadFormProps) { const [formData, setFormData] = useState({ title: '', audioFile: null, coverFile: null, albumId: '', genreIds: [], releaseDate: new Date().toISOString().split('T')[0] }) const [audioPreview, setAudioPreview] = useState(null) const [coverPreview, setCoverPreview] = useState(null) const handleAudioChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (file) { setFormData({ ...formData, audioFile: file }) setAudioPreview(URL.createObjectURL(file)) } } const handleCoverChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (file) { setFormData({ ...formData, coverFile: file }) setCoverPreview(URL.createObjectURL(file)) } } const handleGenreToggle = (genreId: string) => { setFormData(prev => ({ ...prev, genreIds: prev.genreIds.includes(genreId) ? prev.genreIds.filter(id => id !== genreId) : [...prev.genreIds, genreId] })) } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (!formData.audioFile || !formData.title) return onSubmit(formData) } return (
{/* Audio File Upload */}
{audioPreview && (
{/* Cover Image Upload */}
{coverPreview && (
Cover preview
)}
{/* Title */}
setFormData({ ...formData, title: e.target.value })} className="w-full px-4 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-purple-500" placeholder="Enter song title" required />
{/* Album Selection */} {albums.length > 0 && (
)} {/* Genre Selection */} {genres.length > 0 && (
{genres.map(genre => ( ))}
)} {/* Release Date */}
setFormData({ ...formData, releaseDate: e.target.value })} className="w-full px-4 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-purple-500" />
{/* Submit Button */}
) }