"use client"; import { useState, useEffect } from "react"; import { useSearchParams } from "next/navigation"; import { useRouter } from "next/navigation"; import { Button, Dropdown, DropdownItem, Modal, ModalBody, ModalFooter, ModalHeader, } from "flowbite-react"; import { useUserStore } from "#/store/auth"; const whereMapping = [ { id: "releases", label: "Релизах", auth: false, }, { id: "profiles", label: "Профилях", auth: false, }, { id: "list", label: "Списках", auth: true, }, { id: "history", label: "Истории", auth: true, }, { id: "favorites", label: "Избранном", auth: true, }, { id: "collections", label: "Коллекциях", auth: true, }, ]; const searchByMapping = { releases: [ { id: "name", label: "Названию", value: 0, }, { id: "studio", label: "Студии", value: 1, }, { id: "director", label: "Режиссёру", value: 2, }, { id: "author", label: "Автору", value: 3, }, { id: "tag", label: "Тегу", value: 4, }, ], list: [ { id: "watching", label: "Смотрю", value: 1, }, { id: "planned", label: "В планах", value: 2, }, { id: "watched", label: "Просмотрено", value: 3, }, { id: "delayed", label: "Отложено", value: 4, }, { id: "abandoned", label: "Заброшено", value: 5, }, ], none: [{ id: "none", label: "Нет", value: 0 }], }; export function SearchPage() { const router = useRouter(); const searchParams = useSearchParams(); const userStore = useUserStore(); const [query, setQuery] = useState(searchParams.get("query") || ""); const [params, setParams] = useState(null); const [filtersModalOpen, setFiltersModalOpen] = useState(false); useEffect(() => { const queryParams = searchParams.get("params"); if (queryParams) { try { setParams(JSON.parse(queryParams)); } catch (e) { setParams({ where: "releases", searchBy: "name", }); } } else { setParams({ where: "releases", searchBy: "name", }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { if (!params) return; const url = new URL(`/search`, window.location.origin); url.searchParams.set("params", JSON.stringify(params)); router.replace(url.toString()); // eslint-disable-next-line react-hooks/exhaustive-deps }, [params]); if (!params) return <>; return (
setSearchVal(e.target.value)} />

query: {query}

params: {JSON.stringify(params)}

{}} params={params} setParams={setParams} />
); } const FiltersModal = (props: { isOpen: boolean; setIsOpen: any; isAuth: boolean; setContent: any; params: any; setParams: any; }) => { if (!props.params) return <>; return ( props.setIsOpen(false)}> Фильтры

Искать в

item.id == props.params.where).label } color="blue" > {whereMapping.map((item) => { return item.auth && !props.isAuth ? <> : searchByMapping[item.id] ? props.setParams({ where: item.id, searchBy: searchByMapping[item.id][0].id, }) : props.setParams({ where: item.id, searchBy: "none" }) } key={`filter--where--${item.id}`} > {item.label} ; })}
{searchByMapping[props.params.where] ?

Искать по

item.id == props.params.searchBy ).label } color="blue" > {searchByMapping[props.params.where].map((item) => { return ( props.setParams({ where: props.params.where, searchBy: item.id, }) } key={`filter--where--${props.params.where}--searchBy--${item.id}`} > {item.label} ); })}
: <>}
); }; // import useSWRInfinite from "swr/infinite"; // import { ReleaseSection } from "#/components/ReleaseSection/ReleaseSection"; // import { RelatedSection } from "#/components/RelatedSection/RelatedSection"; // import { Spinner } from "#/components/Spinner/Spinner"; // import { useScrollPosition } from "#/hooks/useScrollPosition"; // import { useUserStore } from "../store/auth"; // import { Button, Dropdown, DropdownItem, Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react"; // import { CollectionsSection } from "#/components/CollectionsSection/CollectionsSection"; // import { UserSection } from "#/components/UserSection/UserSection"; // import { useSWRfetcher } from "#/api/utils"; // export function SearchPage() { // const router = useRouter(); // const [searchVal, setSearchVal] = useState(searchParams.get("q") || ""); // const [where, setWhere] = useState(searchParams.get("where") || "releases"); // const [list, setList] = useState(searchParams.get("list") || "watching"); // const [filtersModalOpen, setFiltersModalOpen] = useState(false); // // const getKey = (pageIndex: number, previousPageData: any) => { // if (where == "releases") { // if (previousPageData && !previousPageData.releases.length) return null; // } else { // if (previousPageData && !previousPageData.content.length) return null; // } // const url = new URL("/api/search", window.location.origin); // url.searchParams.set("page", pageIndex.toString()); // if (userStore.token) { // url.searchParams.set("token", userStore.token); // } // if (where) { // url.searchParams.set("where", where); // } // if (where == "list" && list && ListsMapping.hasOwnProperty(list)) { // url.searchParams.set("list", ListsMapping[list].id); // } // url.searchParams.set("searchBy", TagMapping[searchBy].id); // if (query) { // url.searchParams.set("q", query); // return url.toString(); // } // return; // }; // const { data, error, isLoading, size, setSize } = useSWRInfinite( // getKey, // useSWRfetcher, // { initialSize: 2, revalidateFirstPage: false } // ); // const [content, setContent] = useState(null); // useEffect(() => { // if (data) { // let allReleases = []; // if (where == "releases") { // for (let i = 0; i < data.length; i++) { // allReleases.push(...data[i].releases); // } // } else { // for (let i = 0; i < data.length; i++) { // allReleases.push(...data[i].content); // } // } // setContent(allReleases); // } // // eslint-disable-next-line react-hooks/exhaustive-deps // }, [data]); // const scrollPosition = useScrollPosition(); // useEffect(() => { // if (scrollPosition >= 98 && scrollPosition <= 99) { // setSize(size + 1); // } // // eslint-disable-next-line react-hooks/exhaustive-deps // }, [scrollPosition]); // function _executeSearch(value: string) { // const Params = new URLSearchParams(window.location.search); // Params.set("q", value); // const url = new URL(`/search?${Params.toString()}`, window.location.origin); // setContent(null); // setQuery(value); // router.push(url.toString()); // } // useEffect(() => { // if (searchVal && searchVal.length % 4 == 1) { // _executeSearch(searchVal.trim()); // } // // eslint-disable-next-line react-hooks/exhaustive-deps // }, [searchVal]); // if (error) // return ( //
//
//

Ошибка

//

// Произошла ошибка поиска. Попробуйте обновить страницу или зайдите // позже. //

//
//
// ); // return ( // <> //
//
{ // e.preventDefault(); // _executeSearch(searchVal.trim()); // }} // > //
// //
//
// {data && data[0].related && } // {content ? // content.length > 0 ? // <> // {where == "collections" ? // // : where == "profiles" ? // // : // } // // :
// //

Странно, аниме не найдено, попробуйте другой запрос...

//
// : isLoading && ( //
// //
// ) // } // {!content && !isLoading && !query && ( //
// //

Введите ваш запрос что-бы найти любимый тайтл

//
// )} //
// {( // data && // data.length > 1 && // (where == "releases" ? // data[data.length - 1].releases.length == 25 // : data[data.length - 1].content.length == 25) // ) ? // // : ""} // // // ); // } // const FiltersModal = (props: { // isOpen: boolean; // setIsOpen: any; // where: string; // setWhere: any; // list: string; // setList: any; // isAuth: boolean; // searchBy: string; // setSearchBy: any; // setContent: any; // }) => { // const router = useRouter(); // const [where, setWhere] = useState(props.where); // const [list, setList] = useState(props.list); // const [searchBy, setSearchBy] = useState(props.searchBy); // function _cancel() { // setWhere(props.where); // setList(props.list); // setSearchBy(props.searchBy); // props.setIsOpen(false); // } // function _accept() { // const Params = new URLSearchParams(window.location.search); // if (props.where != where) { // Params.set("where", where); // props.setWhere(where); // } // if (where == "list") { // Params.set("list", list); // props.setList(list); // } else { // Params.delete("list"); // } // if (!["profiles", "collections"].includes(where)) { // Params.set("searchBy", searchBy); // props.setSearchBy(searchBy); // } else { // Params.delete("searchBy"); // props.setSearchBy("name"); // } // props.setContent(null); // const url = new URL(`/search?${Params.toString()}`, window.location.origin); // router.push(url.toString()); // } // return ( // _cancel()}> // Фильтры // //
//
//

Искать в

// // {Object.keys(WhereMapping).map((item) => { // if ( // ["list", "history", "collections", "favorites"].includes( // item // ) && // !props.isAuth // ) { // return <>; // } else { // return ( // setWhere(item)} // key={`where--${item}`} // > // {WhereMapping[item]} // // ); // } // })} // //
//
// {props.isAuth && where == "list" && ListsMapping.hasOwnProperty(list) ? //
//
//

Список

// // {Object.keys(ListsMapping).map((item) => { // return ( // setList(item)} // key={`list--${item}`} // > // {ListsMapping[item].name} // // ); // })} // //
//
// : ""} // {!["profiles", "collections"].includes(where) ? //
//
//

Искать по

// // {Object.keys(TagMapping).map((item) => { // return ( // setSearchBy(item)} // key={`tag--${item}`} // > // {TagMapping[item].name} // // ); // })} // //
//
// : ""} //
// //
// // //
//
//
// ); // };