"use client"; import "./RatingSection.scss"; import Image from "next/image"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import SearchForm from "@/features/SearchForm/SearchForm"; import like_icon from "./icons/like.svg"; import message_icon from "./icons/message.svg"; import { useRatingStore } from "./ratingSectionStore"; import { useShallow } from "zustand/react/shallow"; import Link from "next/link"; import { ROAD_TYPES, ROAD_TYPES_COLORS, } from "@/shared/variables/road-types"; import RoadType from "@/entities/RoadType/RoadType"; import Typography from "@/shared/ui/components/Typography/Typography"; import Paragraph from "@/shared/ui/components/Paragraph/Paragraph"; import arrows from "../../shared/icons/arrows.svg"; import Pagination from "@/features/Pagination/Pagination"; import { sliceDate, sliceDescription, sliceLocation, } from "./helpers"; interface IRatingSectionProps { searchParams: { ["тип-дороги"]: string; ["поиск-на-карте"]: string; ["поиск-рейтинг"]: string; ["страница-рейтинга"]: string; }; } const RatingSection: React.FC = ({ searchParams, }: IRatingSectionProps) => { const [ratingSearch, setRatingSearch] = useState( searchParams["поиск-рейтинг"] || "" ); const [activePage, setActivePage] = useState( +searchParams["страница-рейтинга"] || 1 ); const [filter, setFilter] = useState({ option: "date", toggle: false, }); const router = useRouter(); const reports = useRatingStore(useShallow((state) => state.data)); const getReports = useRatingStore( useShallow((state) => state.getReports) ); useEffect(() => { getReports(ratingSearch, activePage, filter); }, []); const handleSubmit: React.FormEventHandler< HTMLFormElement > = async (e) => { e.preventDefault(); const formData = new FormData(e.currentTarget); setRatingSearch(formData.get("rating-search") as string); router.push( `/?тип-дороги=${searchParams["тип-дороги"] || "1,2,3,4,5,6"}${ searchParams["поиск-на-карте"] ? `&поиск-на-карте=${searchParams["поиск-на-карте"] || ""}` : "" }${ ratingSearch ? `&поиск-рейтинг=${ratingSearch || ""}` : "" }&страница-рейтинга=${searchParams["страница-рейтинга"]}`, { scroll: false, } ); getReports(ratingSearch, activePage, filter); if ( reports.results.length < 8 && searchParams["страница-рейтинга"] !== "1" ) { setActivePage(1); } }; useEffect(() => { router.push( `/?тип-дороги=${searchParams["тип-дороги"] || "1,2,3,4,5,6"}${ searchParams["поиск-на-карте"] ? `&поиск-на-карте=${searchParams["поиск-на-карте"] || ""}` : "" }${ratingSearch ? `&поиск-рейтинг=${ratingSearch || ""}` : ""}${ activePage === 1 ? "" : `&страница-рейтинг=${activePage}` }`, { scroll: false, } ); getReports(ratingSearch, activePage, filter); }, [activePage]); const params = [ { id: 1, name: "Дата", handleClick() { if (filter.option !== "date") { return setFilter({ option: "date", toggle: false }); } setFilter((prev) => { return { option: "date", toggle: !prev.toggle }; }); getReports(ratingSearch, activePage, filter); }, }, { id: 2, name: "Адрес" }, { id: 3, name: "Статус" }, { id: 4, name: "Описание" }, { id: 5, name: "Комментарии", handleClick() { if (filter.option !== "reviews") { return setFilter({ option: "reviews", toggle: false }); } setFilter((prev) => { return { option: "reviews", toggle: !prev.toggle }; }); getReports(ratingSearch, activePage, filter); }, }, { id: 6, name: "Рейтинг", handleClick() { if (filter.option !== "rating") { return setFilter({ option: "rating", toggle: false }); } setFilter((prev) => { return { option: "rating", toggle: !prev.toggle }; }); getReports(ratingSearch, activePage, filter); }, }, ]; return (
Рейтинг Обсуждаем дороги: рейтинг, опыт, комфорт в пути!
setRatingSearch(e.target.value)} name="rating-search" placeholder="Введите адрес" value={ratingSearch} handleSubmit={handleSubmit} />
{params.map((p) => ( ))} {reports.results.map((report) => ( ))}
{p.handleClick ? ( ) : ( p.name )}
{sliceDate(report.created_at)} {ROAD_TYPES[report.category]} {sliceDescription(report.description)} Message Icon {report.count_reviews} Like Icon {report.total_likes}
); }; export default RatingSection;