Files
tripwithbonus/frontend/app/(urls)/search/components/ClientResults.tsx
2025-05-27 14:42:59 +03:00

91 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'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<number[]>([])
const [selectedPackageTypes, setSelectedPackageTypes] = useState<number[]>([])
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 (
<>
<SearchFilters onFiltersChange={handleFiltersChange} />
<div className="space-y-4">
{filteredResults.length > 0 ? (
filteredResults.map((item: SearchCardProps) => <SearchCard key={item.id} {...item} />)
) : (
<div className="rounded-lg bg-orange-50 p-4 text-center text-orange-800">
По выбранным фильтрам ничего не найдено. Попробуйте изменить параметры поиска.
</div>
)}
</div>
</>
)
}