'use client' import { useState, useRef, useEffect } from 'react' export interface SearchSuggestion { type: 'song' | 'artist' | 'album' | 'playlist' id: string title: string subtitle?: string } export interface SearchBarProps { placeholder?: string onSearch: (query: string) => void onSuggestionClick?: (suggestion: SearchSuggestion) => void suggestions?: SearchSuggestion[] isLoading?: boolean autoFocus?: boolean } export function SearchBar({ placeholder = 'Search for songs, artists, albums...', onSearch, onSuggestionClick, suggestions = [], isLoading = false, autoFocus = false }: SearchBarProps) { const [query, setQuery] = useState('') const [isFocused, setIsFocused] = useState(false) const [showSuggestions, setShowSuggestions] = useState(false) const inputRef = useRef(null) const containerRef = useRef(null) useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { setShowSuggestions(false) } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, []) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (query.trim()) { onSearch(query) setShowSuggestions(false) } } const handleInputChange = (e: React.ChangeEvent) => { const value = e.target.value setQuery(value) setShowSuggestions(value.length > 0) } const handleSuggestionClick = (suggestion: SearchSuggestion) => { setQuery(suggestion.title) setShowSuggestions(false) onSuggestionClick?.(suggestion) } const getTypeIcon = (type: SearchSuggestion['type']) => { const className = 'w-4 h-4 text-zinc-400' switch (type) { case 'song': return ( ) case 'artist': return ( ) case 'album': return ( ) case 'playlist': return ( ) } } return (
{/* Search Icon */}
{/* Input */} { setIsFocused(true) if (query.length > 0) setShowSuggestions(true) }} onBlur={() => setIsFocused(false)} placeholder={placeholder} autoFocus={autoFocus} className={`w-full pl-12 pr-12 py-3 bg-zinc-800 border-2 rounded-full text-white placeholder-zinc-500 focus:outline-none transition ${ isFocused ? 'border-purple-500' : 'border-zinc-700' }`} /> {/* Clear Button */} {query && ( )} {/* Loading Spinner */} {isLoading && (
)} {/* Suggestions Dropdown */} {showSuggestions && suggestions.length > 0 && (
{suggestions.map((suggestion) => ( ))}
)}
) }