import React, { useState, KeyboardEvent } from 'react'; import { FaSearch, FaSpinner, FaTimes } from 'react-icons/fa'; import { API, SearchResult } from '../api/player'; interface InvidiousSearchModalProps { isOpen: boolean; onClose: () => void; onSelectVideo: (url: string) => void; } const ResultCell: React.FC<{ result: SearchResult, onClick: () => void }> = ({ result, onClick, ...props }) => { return (
{result.title}

{result.title}

{result.author}

); }; const InvidiousSearchModal: React.FC = ({ isOpen, onClose, onSelectVideo }) => { const [searchQuery, setSearchQuery] = useState(''); const [results, setResults] = useState([]); const [isLoading, setIsLoading] = useState(false); const handleSearch = async () => { if (!searchQuery.trim()) return; setIsLoading(true); try { const response = await API.search(searchQuery); if (response.success) { setResults(response.results); } else { console.error('Search failed:', response); } } catch (error) { console.error('Failed to search:', error); } finally { setIsLoading(false); } }; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Enter') { handleSearch(); } }; const _onSelectVideo = (url: string) => { setSearchQuery(''); setResults([]); onSelectVideo(url); }; if (!isOpen) return null; return (

Search YouTube (Invidious)

setSearchQuery(e.target.value)} onKeyDown={handleKeyDown} placeholder="Search videos..." className="p-2 rounded-lg border-2 border-violet-500 flex-grow bg-black/20 text-white" />
{isLoading ? (
Searching...
) : (
{results.map((result) => ( _onSelectVideo(result.mediaUrl)} /> ))}
)}
); }; export default InvidiousSearchModal;