'use client'; import { useLastComplaints } from '@/app/hooks/react-query/useLastComplaints'; import { useLastCases } from '@/app/hooks/react-query/useLastCases'; import { formatDate, formatDateTime } from '@/app/lib/formatDate'; import { useTranslations } from 'next-intl'; import { useEffect, useState, useRef } from 'react'; import { Swiper, SwiperSlide } from 'swiper/react'; import { Navigation, Pagination } from 'swiper/modules'; import { IconEye } from '@/app/ui/icons/icons'; import Link from 'next/link'; type FilterState = { complaints: boolean; claims: boolean; }; export default function ViolationsLastCombinedCases() { const swiperRef = useRef(null); const t = useTranslations('Global'); const [filters, setFilters] = useState({ complaints: true, claims: true, }); const { data: dataComplaint } = useLastComplaints({ page: 1, size: 5, sort_by: 'createdAt', sort_direction: 'desc' }); const { data: dataCases } = useLastCases({ page: 1, size: 5, sort_by: 'createdAt', sort_direction: 'desc' }); const getCombinedItems = () => { const complaints = (dataComplaint?.content || []).map(item => ({ ...item, type: 'complaint' as const, displayId: `COM-${item.id}`, title: item.complaint_text, status: item.status, createdAt: item.created_at, updatedAt: item.updated_at, lawyer: null, })); const claims = (dataCases?.content || []).map(item => ({ ...item, type: 'claim' as const, displayId: item.name, title: item.description, status: item.type, createdAt: item.created_at, updatedAt: item.updated_at, lawyer: item.lawyer, })); let combined = [...complaints, ...claims]; combined.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); return combined; }; const getFilteredItems = () => { const allItems = getCombinedItems(); return allItems.filter(item => { if (item.type === 'complaint') return filters.complaints; if (item.type === 'claim') return filters.claims; return false; }); }; const toggleFilter = (filterType: 'complaints' | 'claims') => { if (filters.claims && !filters.complaints && filterType === 'claims') { return } if (!filters.claims && filters.complaints && filterType === 'complaints') { return } setFilters(prev => ({ ...prev, [filterType]: !prev[filterType] })); }; const filteredItems = getFilteredItems(); const MAX_VISIBLE_ITEMS = 5; const getSlidesPerView = () => { if (!filteredItems || filteredItems.length === 0) return 1; return Math.min(MAX_VISIBLE_ITEMS, filteredItems.length); }; const slidesPerViewCount = getSlidesPerView(); const swiperSettings = { modules: [Navigation, Pagination], breakpoints: { 0: { slidesPerView: Math.min(slidesPerViewCount, 1), spaceBetween: 20, }, 768: { slidesPerView: Math.min(slidesPerViewCount, 2), spaceBetween: 30, }, 1024: { slidesPerView: Math.min(slidesPerViewCount, 3), spaceBetween: 30, }, 1792: { slidesPerView: slidesPerViewCount, spaceBetween: 30, } }, loop: filteredItems.length > 3, pagination: { clickable: true, dynamicBullets: false, }, /* pagination: { el: '.custom-pagination-container', // Кастомный контейнер для пагинации clickable: true, }, */ onSwiper: (swiper: any) => { swiperRef.current = swiper; } }; const isLoading = (!dataComplaint || !dataCases); if (isLoading) { return (

{t('recent-cases')}

); } const isAllSelected = filters.complaints && filters.claims; const isNothingSelected = !filters.complaints && !filters.claims; return (

{t('recent-cases')}

{isNothingSelected ? (
{t('select-at-least-one-filter')}
) : filteredItems.length === 0 ? (
{t('no-claims-complaints-found')}
) : ( {filteredItems.map((item) => (
{item.displayId}
{item.status}
{t('date-of-creation')}: {item.createdAt ? `${formatDate(item.createdAt)} ${formatDateTime(item.createdAt)}` : '---'}
{t('date-of-update')}: {item.updatedAt ? `${formatDate(item.updatedAt)} ${formatDateTime(item.updatedAt)}` : '---'}
{item.type === 'claim' && (
{t('lawyer')}: {item.lawyer ? item.lawyer : t('not-assigned')}
)}
))}
)}
{!isNothingSelected && filteredItems.length > 0 && (
)}
); }