'use client' import { useState, useRef, useEffect } from 'react' import { Plus, Search, Loader2 } from 'lucide-react' import Image from 'next/image' interface HeaderProps { onAddSong: (url: string) => void isLoading?: boolean } interface SearchResult { id: string title: string channel: string thumbnail: string duration: number } export default function Header({ onAddSong, isLoading }: HeaderProps) { const [input, setInput] = useState('') const [showResults, setShowResults] = useState(false) const [searchResults, setSearchResults] = useState([]) const [isSearching, setIsSearching] = useState(false) const [searchError, setSearchError] = useState('') const resultsRef = useRef(null) const inputRef = useRef(null) // Close results when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (resultsRef.current && !resultsRef.current.contains(event.target as Node) && inputRef.current && !inputRef.current.contains(event.target as Node)) { setShowResults(false) } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, []) const isYoutubeUrl = (str: string) => { return str.includes('youtube.com/') || str.includes('youtu.be/') } const handleSearch = async (query: string) => { if (!query.trim() || isYoutubeUrl(query)) { setShowResults(false) return } setIsSearching(true) setSearchError('') try { const response = await fetch(`/api/search?q=${encodeURIComponent(query)}`) if (response.ok) { const results = await response.json() setSearchResults(results) setShowResults(true) } else { setSearchError('Search failed') setShowResults(false) } } catch (error) { console.error('Search error:', error) setSearchError('Search error') setShowResults(false) } finally { setIsSearching(false) } } const handleInputChange = (e: React.ChangeEvent) => { const value = e.target.value setInput(value) // Auto-search if not a URL if (value.trim() && !isYoutubeUrl(value)) { // Debounce search const timeoutId = setTimeout(() => { handleSearch(value) }, 500) return () => clearTimeout(timeoutId) } else { setShowResults(false) } } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (input.trim()) { if (isYoutubeUrl(input)) { onAddSong(input) setInput('') setShowResults(false) } else { handleSearch(input) } } } const handleSelectResult = (result: SearchResult) => { const youtubeUrl = `https://www.youtube.com/watch?v=${result.id}` onAddSong(youtubeUrl) setInput('') setShowResults(false) setSearchResults([]) } const formatDuration = (seconds: number): string => { const mins = Math.floor(seconds / 60) const secs = Math.floor(seconds % 60) return `${mins}:${secs.toString().padStart(2, '0')}` } return (
{isSearching && (
)}
{/* Search Results Dropdown */} {showResults && searchResults.length > 0 && (
{searchResults.map((result) => ( ))}
)} {showResults && searchResults.length === 0 && !isSearching && (

No results found

)} {searchError && (

{searchError}

)}
) }