'use client' import { useState, useEffect } from 'react' export interface InviteArtistModalProps { isOpen: boolean labelId: string onClose: () => void onInviteSent?: () => void } interface Artist { id: string name: string user?: { avatarUrl?: string } verified?: boolean } export function InviteArtistModal({ isOpen, labelId, onClose, onInviteSent }: InviteArtistModalProps) { const [searchQuery, setSearchQuery] = useState('') const [searchResults, setSearchResults] = useState([]) const [selectedArtist, setSelectedArtist] = useState(null) const [message, setMessage] = useState('') const [isSearching, setIsSearching] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState(null) useEffect(() => { if (searchQuery.trim().length > 0) { const timer = setTimeout(() => { searchArtists(searchQuery) }, 300) return () => clearTimeout(timer) } else { setSearchResults([]) } }, [searchQuery]) const searchArtists = async (query: string) => { setIsSearching(true) setError(null) try { const res = await fetch(`/api/artists/search?q=${encodeURIComponent(query)}`) if (res.ok) { const data = await res.json() setSearchResults(data.artists || []) } else { setError('Failed to search artists') } } catch (err) { setError('Network error') } finally { setIsSearching(false) } } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!selectedArtist) return setIsSubmitting(true) setError(null) try { const res = await fetch(`/api/labels/${labelId}/invitations`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ artistId: selectedArtist.id, message: message.trim() || undefined }) }) if (res.ok) { handleClose() onInviteSent?.() } else { const data = await res.json() setError(data.error || 'Failed to send invitation') } } catch (err) { setError('Network error') } finally { setIsSubmitting(false) } } const handleClose = () => { if (!isSubmitting) { setSearchQuery('') setSearchResults([]) setSelectedArtist(null) setMessage('') setError(null) onClose() } } if (!isOpen) return null return (
{/* Backdrop */}
{/* Modal */}
{/* Header */}

Invite Artist

{/* Form */}
{/* Error Message */} {error && (

{error}

)} {/* Search */}
setSearchQuery(e.target.value)} placeholder="Search by artist name..." className="w-full px-4 py-3 bg-zinc-800 border border-zinc-700 rounded-lg text-white placeholder-zinc-500 focus:outline-none focus:ring-2 focus:ring-purple-500" autoFocus /> {/* Search Results */} {searchQuery.trim().length > 0 && (
{isSearching ? (
Searching...
) : searchResults.length > 0 ? (
{searchResults.map((artist) => ( ))}
) : (
No artists found
)}
)}
{/* Selected Artist */} {selectedArtist && (
{selectedArtist.user?.avatarUrl ? ( {selectedArtist.name} ) : (
)}

{selectedArtist.name}

Selected

)} {/* Message */}