You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
6.1 KiB
138 lines
6.1 KiB
import Navbar from "../components/Navbar.jsx";
|
|
import {useEffect, useState} from "react";
|
|
import {search} from "../services/search.service.js"
|
|
import VideoCard from "../components/VideoCard.jsx";
|
|
import CreatorCard from "../components/CreatorCard.jsx";
|
|
import {useSearchParams} from "react-router-dom";
|
|
|
|
export default function Search() {
|
|
|
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
const queryFromUrl = searchParams.get('q') || '';
|
|
const typeFromUrl = searchParams.get('type') || 'videos';
|
|
|
|
const [filter, setFilter] = useState(typeFromUrl);
|
|
const [searchQuery, setSearchQuery] = useState(queryFromUrl);
|
|
|
|
const [results, setResults] = useState({});
|
|
const [alerts, setAlerts] = useState([]);
|
|
|
|
useEffect(() => {
|
|
async function fetchData() {
|
|
if (searchParams) {
|
|
setResults(await search(queryFromUrl, typeFromUrl, 0, 20, addAlert));
|
|
}
|
|
}
|
|
fetchData();
|
|
}, [searchParams]);
|
|
useEffect(() => {
|
|
async function fetchData() {
|
|
if (searchQuery) {
|
|
setResults(await search(searchQuery, filter, 0, 20, addAlert));
|
|
}
|
|
}
|
|
fetchData();
|
|
}, [filter]);
|
|
|
|
const handleKeyPress = async (e) => {
|
|
if (e.key === 'Enter') {
|
|
setResults(await search(e.target.value, filter, 0, 20));
|
|
}
|
|
}
|
|
|
|
const addAlert = (type, message) => {
|
|
const newAlert = { type, message, id: Date.now() };
|
|
setAlerts([...alerts, newAlert]);
|
|
};
|
|
|
|
const onCloseAlert = (alertToRemove) => {
|
|
setAlerts(alerts.filter(alert => alert !== alertToRemove));
|
|
};
|
|
|
|
return (
|
|
<div className="min-w-screen min-h-screen bg-linear-to-br from-left-gradient to-right-gradient">
|
|
<Navbar isSearchPage={true} alerts={alerts} onCloseAlert={onCloseAlert}/>
|
|
|
|
<main className="px-5 lg:px-36 pt-[48px] lg:pt-[118px]">
|
|
|
|
{/* MEGA SEARCH BAR */}
|
|
<div className="flex items-center w-full gap-8" >
|
|
<div className="glassmorphism text-white font-montserrat text-2xl font-black cursor-pointer flex-1 h-[50px] px-3 flex items-center justify-center">
|
|
<input
|
|
type="text"
|
|
name="search"
|
|
id="searchbar"
|
|
placeholder="Rechercher"
|
|
className="font-inter text-2xl font-normal focus:outline-none bg-transparent w-full"
|
|
value={searchQuery}
|
|
onChange={(e) => setSearchQuery(e.target.value)}
|
|
onKeyPress={(e) => handleKeyPress(e) }
|
|
/>
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="32" viewBox="0 0 32 32" fill="none" className="h-6 w-6">
|
|
<circle cx="18.381" cy="13.619" r="12.119" stroke="white" strokeWidth="3"/>
|
|
<line x1="9.63207" y1="22.2035" x2="1.06064" y2="30.7749" stroke="white" strokeWidth="3"/>
|
|
</svg>
|
|
</div>
|
|
|
|
{/* FILTERS */}
|
|
<form action="" className="flex w-max gap-4 items-center h-full">
|
|
<label
|
|
htmlFor="videos"
|
|
className={"p-3 " + (filter === "videos" ? "bg-white rounded-full fill-black border-2 border-white" : "glassmorphism-rounded-full") + " cursor-pointer"}
|
|
>
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" className={(filter === "videos") ? "fill-black" : "fill-white"} ><path d="M7 6v12l10-6z"></path></svg>
|
|
</label>
|
|
<input
|
|
type="radio"
|
|
name="filter"
|
|
id="videos"
|
|
className="hidden"
|
|
onClick={() => setFilter("videos")}
|
|
/>
|
|
|
|
<label
|
|
htmlFor="channel"
|
|
className={"p-3 " + (filter === "channel" ? "bg-white rounded-full fill-black border-2 border-white" : "glassmorphism-rounded-full") + " cursor-pointer"}
|
|
>
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" className={(filter === "channel") ? "fill-black" : "fill-white"} ><path d="M12 2a5 5 0 1 0 5 5 5 5 0 0 0-5-5zm0 8a3 3 0 1 1 3-3 3 3 0 0 1-3 3zm9 11v-1a7 7 0 0 0-7-7h-4a7 7 0 0 0-7 7v1h2v-1a5 5 0 0 1 5-5h4a5 5 0 0 1 5 5v1z"></path></svg>
|
|
</label>
|
|
<input
|
|
type="radio"
|
|
name="filter"
|
|
id="channel"
|
|
className="hidden"
|
|
onClick={() => setFilter("channel")}
|
|
/>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
{/* RESULTS */}
|
|
<div className="grid grid-cols-1 lg:grid-cols-4 gap-8 mt-8">
|
|
{results && results.length > 0 ? (
|
|
results.map((result, index) => {
|
|
if (result.type === "video") {
|
|
return (
|
|
<VideoCard key={index} video={result} />
|
|
);
|
|
} else if (result.type === "channel") {
|
|
return (
|
|
<CreatorCard key={index} creator={result} />
|
|
);
|
|
}
|
|
})
|
|
) : (
|
|
|
|
<div className="text-white text-center mt-10 col-span-4">
|
|
<h2 className="text-3xl font-bold">Aucun résultat trouvé</h2>
|
|
<p className="mt-4">Essayez de modifier votre recherche ou d'utiliser un autre filtre.</p>
|
|
</div>
|
|
|
|
)}
|
|
</div>
|
|
|
|
</main>
|
|
</div>
|
|
)
|
|
}
|