"use client"; import "./RatingSection.scss"; import Image from "next/image"; import { useEffect, useState } from "react"; 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 { 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 { sliceDescription, sliceLocation } from "./helpers"; import { Link, useRouter } from "@/shared/config/navigation"; import { useTranslations } from "next-intl"; interface IRatingSectionProps { searchParams: { ["тип-дороги"]: string; ["поиск-на-карте"]: string; ["поиск-рейтинг"]: string; ["страница-рейтинга"]: string; }; } const RatingSection: React.FC = ({ searchParams, }: IRatingSectionProps) => { const tHome = useTranslations("home"); const tGeneral = useTranslations("general"); const [ratingSearch, setRatingSearch] = useState( searchParams["поиск-рейтинг"] || "" ); const [activePage, setActivePage] = useState( +searchParams["страница-рейтинга"] || 1 ); const [sort, setSort] = useState(""); const router = useRouter(); const reports = useRatingStore(useShallow((state) => state.data)); const getReports = useRatingStore( useShallow((state) => state.getReports) ); useEffect(() => { getReports(ratingSearch, activePage, sort); }, [sort]); 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, sort); 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, sort); }, [activePage]); const params = [ { id: 1, name: tGeneral("date"), handleClick() { setSort(""); }, }, { id: 2, name: tGeneral("address") }, { id: 3, name: tGeneral("status") }, { id: 4, name: tGeneral("description") }, { id: 5, name: tGeneral("reviews"), handleClick() { setSort("reviews"); }, }, { id: 6, name: tGeneral("rating"), handleClick() { setSort("likes"); }, }, ]; const ROAD_TYPES: Record = { 1: tHome("broken_roads"), 2: tHome("accident_hotspots"), 3: tHome("local_defects"), 4: tHome("repair_plans"), 5: tHome("repaired"), 6: tHome("fixed_local_defects"), }; return (
{tHome("rating")} {tHome("road_discussions")}
setRatingSearch(e.target.value)} name="rating-search" placeholder={tHome("enter_address")} value={ratingSearch} handleSubmit={handleSubmit} />
{params.map((p) => ( ))} {reports.results.map((report) => ( ))}
{p.handleClick ? ( ) : ( p.name )}
{new Date(report.created_at).toLocaleDateString()} {ROAD_TYPES[report.category]} {sliceDescription(report.description)} Message Icon {report.count_reviews} Like Icon {report.total_likes}
); }; export default RatingSection;