"use client"; import "./ReviewSection.scss"; import { apiInstance } from "@/shared/config/apiConfig"; import { IReviewList } from "@/shared/types/review-type"; import { signIn, useSession } from "next-auth/react"; import { useEffect, useRef, useState } from "react"; import calendar from "./icons/calendar.svg"; import Image from "next/image"; import { Link, usePathname, useRouter, } from "@/shared/config/navigation"; import Loader from "@/shared/ui/components/Loader/Loader"; interface IReviewsSectionProps { endpoint: string; id: number; } const ReviewSection: React.FC = ({ endpoint, id, }: IReviewsSectionProps) => { const lastElement = useRef(null); const observer = useRef(null); const [reviews, setReviews] = useState({ count: 0, next: null, previous: null, results: [ { id: 0, author: { image: "", id: 0, first_name: "", last_name: "", govern_status: null, }, review: "", created_at: "", }, ], }); const [pageSize, setPageSize] = useState(8); const [reviewCount, setReviewCount] = useState(0); const [loader, setLoader] = useState(false); const pathname = usePathname(); const session = useSession(); const handleSubmit: React.MouseEventHandler< HTMLFormElement > = async (e) => { e.preventDefault(); const Authorization = `Bearer ${session.data?.access_token}`; const formData = new FormData(e.currentTarget); const config = { headers: { Authorization, }, }; if (session.status === "unauthenticated") { signIn(undefined, { callbackUrl: pathname }); } if (!formData.get("review")) { return; } formData.append("news", id.toString()); try { const res = await apiInstance.post( `/${endpoint}/${id}/reviews/`, formData, config ); getReviews(); } catch (error) { console.log(error); } }; const getReviews = async () => { setLoader(true); const response = await apiInstance.get( `/${endpoint}/${id}/reviews/?page_size=${pageSize}` ); setReviewCount(response.data.count); setLoader(false); setReviews({ count: response.data.count, next: response.data.next, previous: response.data.previous, results: [...reviews?.results, ...response.data.results], }); setReviews(response?.data); }; useEffect(() => { if (loader) return; if (observer.current) observer.current.disconnect(); const callback = function (entries: any) { if ( entries[0].isIntersecting && (reviews?.results.length as number) <= reviewCount ) { if (pageSize < reviewCount) { setPageSize((prev) => prev + 8); } else { setPageSize(reviewCount); } } }; observer.current = new IntersectionObserver(callback); observer.current.observe(lastElement.current as HTMLDivElement); }, [loader]); useEffect(() => { getReviews(); }, [pageSize]); const months: Record = { "01": "Январь", "02": "Февраль", "03": "Март", "04": "Апрель", "05": "Май", "06": "Июнь", "07": "Июль", "08": "Август", "09": "Сентябрь", "10": "Октябрь", "11": "Ноябрь", "12": "Декабрь", }; return (

Написать комментарий

{session.status === "authenticated" ? (