import React, { useContext, useState } from 'react'; import Icon from '../../../shared/components/icon'; import { BookingPackageFlight } from '@qite/tide-client'; import { parseISO, format } from 'date-fns'; import { useDispatch } from 'react-redux'; import { selectFlight } from '../../store/search-results-slice'; import { getTranslations } from '../../../shared/utils/localization-util'; import SearchResultsConfigurationContext from '../../search-results-configuration-context'; interface FlightResultsProps { flights?: BookingPackageFlight[]; isDeparture?: boolean; } const ticksToMinutes = (ticks: number) => Math.floor(ticks / 600000000); const formatDuration = (ticks: number) => { const minutes = ticksToMinutes(ticks); const h = Math.floor(minutes / 60); const m = minutes % 60; return `${h}h ${m}m`; }; const FlightResults: React.FC = ({ flights, isDeparture }) => { const context = useContext(SearchResultsConfigurationContext); const translations = getTranslations(context?.languageCode ?? 'en-GB'); const dispatch = useDispatch(); const [activeDetailId, setActiveDetailId] = useState(null); const handleDetailClick = (flightOptionId: string) => { setActiveDetailId((prev) => (prev === flightOptionId ? null : flightOptionId)); }; const firstResult = flights?.[0]; const firstResultDate = firstResult?.startDateTime ? parseISO(firstResult.startDateTime) : null; return ( <> {/* Header */}
{firstResultDate && ( <>

{format(firstResultDate, 'd')}

{format(firstResultDate, 'MMM')}

)}

{translations.SRP.SELECT} {isDeparture ? translations.SRP.DEPARTURE : translations.SRP.RETURN}

{flights && flights.length > 0 && (
{flights.map((flight, index) => { const lines = flight.flightMetaData.flightLines; const firstLine = lines[0]; const lastLine = lines[lines.length - 1]; const stops = lines.length - 1; return (
{/* HEADER */}
€ {flight.price.toFixed(2)}
{/* SUMMARY */}
{flight.airlineDescription} {flight.airlineDescription}
{firstLine.departureTime} {firstLine.departureAirport}

{format(parseISO(firstLine.departureDate), 'EEE dd MMM yyyy')}

{formatDuration(flight.flightMetaData.durationInTicks)}

{stops > 0 &&
}
{stops === 0 ? translations.SRP.DIRECT : `${stops} ${translations.SRP.STOP}${stops > 1 ? 's' : ''}`}
{lastLine.arrivalTime} {lastLine.arrivalAirport}

{format(parseISO(lastLine.arrivalDate), 'EEE dd MMM yyyy')}

handleDetailClick(flight.flightOptionId)}>
{/* DETAILS */}
{lines.map((line, index) => { const nextLine = lines[index + 1]; return ( {/* Flight line */}

{line.departureTime}

{line.departureAirport}

{format(parseISO(line.departureDate), 'EEE dd MMM yyyy')}

{formatDuration(line.durationInTicks)}

{line.airline} {line.number}

{line.arrivalTime}

{line.arrivalAirport}

{format(parseISO(line.arrivalDate), 'EEE dd MMM yyyy')}

{nextLine && (
{translations.SRP.STOP_TIME} {formatDuration(parseISO(nextLine.departureDate).getTime() - parseISO(line.arrivalDate).getTime())}
)}
); })}
); })}
)} {/*

There are more transports at your disposal

More options
*/} ); }; export default FlightResults;