import React, { useState, useRef, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSearch, faPlus } from '@fortawesome/free-solid-svg-icons'; import { ApiMangaRepository } from '../../../infrastructure/api/apiMangaRepository.js'; import { SearchMangas } from '../../../application/useCases/searchMangas.js'; const mangaRepository = new ApiMangaRepository(); const searchMangas = new SearchMangas(mangaRepository); export function SearchBar() { const navigate = useNavigate(); const [query, setQuery] = useState(''); const [results, setResults] = useState([]); const [isOpen, setIsOpen] = useState(false); const [loading, setLoading] = useState(false); const [hasSearched, setHasSearched] = useState(false); const searchRef = useRef(null); useEffect(() => { const handleClickOutside = (event) => { if (searchRef.current && !searchRef.current.contains(event.target)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); useEffect(() => { const searchManga = async () => { if (!query.trim()) { setResults([]); setHasSearched(false); return; } setLoading(true); try { const searchResults = await searchMangas.execute(query); setResults(searchResults); setHasSearched(true); } catch (error) { console.error('Search error:', error); } finally { setLoading(false); } }; const timeoutId = setTimeout(searchManga, 300); return () => clearTimeout(timeoutId); }, [query]); const handleMangaClick = (slug) => { navigate(`/manga/${slug}`); setIsOpen(false); setQuery(''); setHasSearched(false); }; const handleAddMangaClick = () => { navigate(`/add${query ? `?q=${encodeURIComponent(query)}` : ''}`); setIsOpen(false); setQuery(''); setHasSearched(false); }; return (
{ setQuery(e.target.value); setIsOpen(true); }} onFocus={() => setIsOpen(true)} placeholder="Rechercher" className="appearance-none outline-none ml-2 pl-0 bg-transparent border-b border-white w-full placeholder:text-white text-white py-1 px-2 leading-tight transition-all duration-500 ease-in-out focus:placeholder:text-opacity-0 focus:border-opacity-0" />
{isOpen && query.trim() && (
{loading ? (
Chargement...
) : results.length > 0 ? (

Mangas existants

{results.map((manga) => ( ))}
) : hasSearched && (
)}
)}
); }