diff --git a/frontend/app/(urls)/search/[category]/[route]/page.tsx b/frontend/app/(urls)/search/[category]/[route]/page.tsx index ee14c5a..f797257 100644 --- a/frontend/app/(urls)/search/[category]/[route]/page.tsx +++ b/frontend/app/(urls)/search/[category]/[route]/page.tsx @@ -1,8 +1,9 @@ -import React, { Suspense } from 'react' +import React from 'react' import type { Metadata } from 'next' import SearchCard from '../../components/SearchCard' import { SearchCardProps, RouteSearchPageProps } from '@/app/types' import SearchFilters from '../../components/SearchFilters' +import ClientResults from '../../components/ClientResults' async function fetchSearch(category: string, from: string, to: string) { const response = await fetch( @@ -76,17 +77,7 @@ export default async function SearchPage(props: RouteSearchPageProps) { : 'Результаты не найдены'} - - - Загрузка результатов...}> - - {results.length > 0 ? ( - results.map((item: SearchCardProps) => ) - ) : ( - По данному маршруту ничего не найдено - )} - - + ) } diff --git a/frontend/app/(urls)/search/components/ClientResults.tsx b/frontend/app/(urls)/search/components/ClientResults.tsx new file mode 100644 index 0000000..c554b92 --- /dev/null +++ b/frontend/app/(urls)/search/components/ClientResults.tsx @@ -0,0 +1,90 @@ +'use client' + +import React, { useState, useMemo } from 'react' +import SearchCard from './SearchCard' +import { SearchCardProps } from '@/app/types' +import SearchFilters from './SearchFilters' + +interface ClientResultsProps { + initialResults: SearchCardProps[] +} + +export default function ClientResults({ initialResults }: ClientResultsProps) { + const [selectedTransport, setSelectedTransport] = useState([]) + const [selectedPackageTypes, setSelectedPackageTypes] = useState([]) + + const filteredResults = useMemo(() => { + let results = [...initialResults] + + if (selectedTransport.length > 0) { + results = results.filter(item => + selectedTransport.some(id => { + switch (id) { + case 1: + return item.type_transport === 'road' + case 2: + return item.type_transport === 'avia' + case 3: + return true // 'both' отдает все + default: + return false + } + }) + ) + } + + if (selectedPackageTypes.length > 0) { + results = results.filter(item => { + return selectedPackageTypes.some(id => { + const match = (() => { + switch (id) { + case 1: + return item.formatted_cargo_type === 'Письмо или Документы' + case 2: + return item.formatted_cargo_type === 'Посылка (до 30кг)' + case 3: + return item.formatted_cargo_type === 'Попутчик' + case 4: + return item.formatted_cargo_type === 'Бандероль (до 5кг)' + case 5: + return item.formatted_cargo_type === 'Груз (свыше 30 кг)' + default: + return false + } + })() + + return match + }) + }) + } + + return results + }, [initialResults, selectedTransport, selectedPackageTypes]) + + const handleFiltersChange = ({ + transport, + packageTypes, + }: { + transport: number[] + packageTypes: number[] + }) => { + setSelectedTransport(transport) + setSelectedPackageTypes(packageTypes) + } + + return ( + <> + + + + {filteredResults.length > 0 ? ( + filteredResults.map((item: SearchCardProps) => ) + ) : ( + + По выбранным фильтрам ничего не найдено. Попробуйте изменить параметры поиска. + + )} + + > + ) +}