import React, { useState, useEffect, useRef } from 'react'; import { useSelector } from 'react-redux'; import { buildClassName } from '../../../shared/utils/class-util'; import Icon from '../../../shared/components/icon'; import MultiRangeFilter from '../../components/multi-range-filter'; import { FlightFilterOptions } from '../../types'; import { selectTranslations } from '../booking/selectors'; import { formatMinutes } from './flight-utils'; interface FlightFilterProps { filterOptions: FlightFilterOptions; resultCount: number; applyFilter: (options: FlightFilterOptions) => void; } const FlightFilter: React.FC = ({ filterOptions, resultCount, applyFilter }) => { const translations = useSelector(selectTranslations); const [filtersVisible, setFiltersVisible] = useState(false); const filterRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (filterRef.current && !filterRef.current.contains(event.target as Node)) { setFiltersVisible(false); } } document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const updateAirportFilter = (code: string) => { const updatedFilterOptions = { ...filterOptions, airports: filterOptions.airports.map((x) => { if (x.value !== code) return x; return { ...x, isSelected: !x.isSelected }; }) }; applyFilter(updatedFilterOptions); }; const updateAirlineFilter = (code: string) => { const updatedFilterOptions = { ...filterOptions, airlines: filterOptions.airlines.map((x) => { if (x.value !== code) return x; return { ...x, isSelected: !x.isSelected }; }) }; applyFilter(updatedFilterOptions); }; const updateStopsFilter = (count: string) => { const updatedFilterOptions = { ...filterOptions, numberOfStops: filterOptions.numberOfStops.map((x) => { if (x.value !== count) return x; return { ...x, isSelected: !x.isSelected }; }) }; applyFilter(updatedFilterOptions); }; const updateOutwardDeparture = (period: string) => { const updatedFilterOptions = { ...filterOptions, outward: { ...filterOptions.outward, departurePeriod: filterOptions.outward.departurePeriod.map((x) => { if (x.value !== period) return x; return { ...x, isSelected: !x.isSelected }; }) } }; applyFilter(updatedFilterOptions); }; const updateOutwardTravelDuration = (min: number, max: number) => { const updatedFilterOptions = { ...filterOptions, outward: { ...filterOptions.outward, travelDuration: { ...filterOptions.outward.travelDuration, selectedMin: min, selectedMax: max } } }; applyFilter(updatedFilterOptions); }; const updateOutwardChangeDuration = (min: number, max: number) => { const updatedFilterOptions = { ...filterOptions, outward: { ...filterOptions.outward, changeDuration: { ...filterOptions.outward.changeDuration, selectedMin: min, selectedMax: max } } }; applyFilter(updatedFilterOptions); }; const updateReturnDeparture = (period: string) => { const updatedFilterOptions = { ...filterOptions, return: { ...filterOptions.return, departurePeriod: filterOptions.return.departurePeriod.map((x) => { if (x.value !== period) return x; return { ...x, isSelected: !x.isSelected }; }) } }; applyFilter(updatedFilterOptions); }; const updateReturnTravelDuration = (min: number, max: number) => { const updatedFilterOptions = { ...filterOptions, return: { ...filterOptions.return, travelDuration: { ...filterOptions.return.travelDuration, selectedMin: min, selectedMax: max } } }; applyFilter(updatedFilterOptions); }; const updateReturnChangeDuration = (min: number, max: number) => { const updatedFilterOptions = { ...filterOptions, return: { ...filterOptions.return, changeDuration: { ...filterOptions.return.changeDuration, selectedMin: min, selectedMax: max } } }; applyFilter(updatedFilterOptions); }; return ( <>

{translations.FLIGHTS_FORM.FILTER_OPTIONS}

{translations.FLIGHTS_FORM.FLIGHTS_FOUND_1}{' '} {resultCount} {translations.FLIGHTS_FORM.FLIGHTS_FOUND_2} {' '} {translations.FLIGHTS_FORM.FLIGHTS_FOUND_3}

{translations.FLIGHTS_FORM.AIRLINES}
{filterOptions.airlines.map((option, k) => (
))}
{translations.FLIGHTS_FORM.AIRPORTS}
{filterOptions.airports.map((option, k) => (
))}
{translations.FLIGHTS_FORM.NUMBER_OF_STOPS}
{filterOptions.numberOfStops.map((option, k) => (
))}
{translations.FLIGHTS_FORM.FLIGHT_OUTWARD}

{translations.FLIGHTS_FORM.DEPARTURE_TIME}

{filterOptions.outward.departurePeriod.map((option, k) => (
))}

{translations.FLIGHTS_FORM.TRAVEL_DURATION}

{translations.FLIGHTS_FORM.CHANGE_TIME}

{translations.FLIGHTS_FORM.FLIGHT_RETURN}

{translations.FLIGHTS_FORM.DEPARTURE_TIME}

{filterOptions.return.departurePeriod.map((option, k) => (
))}

{translations.FLIGHTS_FORM.TRAVEL_DURATION}

{translations.FLIGHTS_FORM.CHANGE_TIME}

); }; export default FlightFilter;