import React, { useContext, useEffect, useRef } from 'react'; import Icon from '../icon'; import { useFlightSearch } from '../../../search-results/components/flight/flight-search-context'; import { useDispatch, useSelector } from 'react-redux'; import { resetFilters, setFilters, setFlyInType, setSelectedFlight, setSelectedFlightDetails, setSelectedSearchResult, setSortType } from '../../../search-results/store/search-results-slice'; import FlightsFlyIn from './flights-flyin'; import AccommodationFlyIn from './accommodation-flyin'; import { PortalQsmType } from '@qite/tide-client'; import GroupTourFlyIn from './group-tour-flyin'; import { FlyInType, SearchSeed, SortByType } from '../../../search-results/types'; import HotelAccommodationResults from '../../../search-results/components/hotel/hotel-accommodation-results'; import PackageingFlightsFlyIn from './packaging-flights-flyin'; import SearchResultsConfigurationContext from '../../../search-results/search-results-configuration-context'; import { findSortByType, getSortingName, getTranslations } from '../../utils/localization-util'; import Filters from '../../../search-results/components/filters/filters'; import { SearchResultsRootState } from '../../../search-results/store/search-results-store'; import ItemPicker from '../../../search-results/components/item-picker'; import ExcursionResults from '../../../search-results/components/excursions/excursion-results'; import ExcursionDetails from '../../../search-results/components/excursions/excursion-details'; type FlyInProps = { srpType: PortalQsmType; isOpen: boolean; setIsOpen: (open: boolean) => void; className?: string; onPanelRef?: (el: HTMLDivElement | null) => void; detailsLoading: boolean; handleConfirm?: () => void; flyInType?: FlyInType | null; isPackageEditFlow?: boolean; sortByTypes?: SortByType[]; activeSearchSeed?: SearchSeed | null; toggleFilters?: () => void; filtersOpen: boolean; }; const FlyIn: React.FC = ({ srpType, isOpen, setIsOpen, className = '', onPanelRef, detailsLoading, flyInType, isPackageEditFlow, handleConfirm, sortByTypes, activeSearchSeed, toggleFilters, filtersOpen }) => { const dispatch = useDispatch(); const context = useContext(SearchResultsConfigurationContext); const language = context?.languageCode ?? 'en-GB'; const translations = getTranslations(language); const { isLoading, initialFilters, filters, filteredPackagingAccoResults, selectedSortType } = useSelector( (state: SearchResultsRootState) => state.searchResults ); const { onCancelSearch } = useFlightSearch(); const panelRef = useRef(null); // expose DOM node if needed useEffect(() => { onPanelRef?.(panelRef.current); return () => onPanelRef?.(null); }, [onPanelRef]); useEffect(() => { // click outside detection const handleClickOutside = (event: MouseEvent) => { if (isOpen && panelRef.current && !panelRef.current.contains(event.target as Node)) { handleClose(); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, [isOpen, setIsOpen]); // body scroll lock useEffect(() => { document.body.style.overflow = isOpen ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [isOpen]); const handleClose = () => { if (isOpen && panelRef.current) { if (srpType === PortalQsmType.Flight) { dispatch(setSelectedFlight(null)); dispatch(setSelectedFlightDetails(null)); onCancelSearch(); } else { dispatch(setSelectedSearchResult(null)); } dispatch(setFlyInType('acco-details')); setIsOpen(false); } }; const handleGoBack = () => { if (flyInType === 'acco-details') { dispatch(setFlyInType('acco-results')); } else if (flyInType === 'excursion-details') { dispatch(setFlyInType('excursion-results')); } }; const handleSortChange = (newSortKey: string, direction?: string) => { if (sortByTypes === undefined) return; const newSortByType = findSortByType(sortByTypes, newSortKey, direction ?? 'asc'); if (newSortByType) { dispatch(setSortType(newSortByType)); } }; return (

{srpType === PortalQsmType.Flight && 'Select your fare'} {srpType === PortalQsmType.Accommodation || (srpType === PortalQsmType.AccommodationAndFlight && (flyInType === 'acco-results' || flyInType === 'acco-details') && `${translations.SRP.SELECT} ${translations.SRP.ACCOMMODATION}`)} {srpType === PortalQsmType.AccommodationAndFlight && flyInType === 'flight-outward-results' && `${translations.SRP.SELECT} ${translations.FLIGHTS_FORM.OUTWARD_FLIGHT}`} {srpType === PortalQsmType.AccommodationAndFlight && flyInType === 'flight-return-results' && `${translations.SRP.SELECT} ${translations.FLIGHTS_FORM.RETURN_FLIGHT}`} {srpType === PortalQsmType.AccommodationAndFlight && flyInType === 'flight-details' && 'Select your fare'} {flyInType === 'excursion-results' || (flyInType === 'excursion-details' && 'Select excursion')}

handleClose()}>
{((isPackageEditFlow && flyInType === 'acco-details') || flyInType === 'excursion-details') && (
)}
{srpType === PortalQsmType.Flight && } {(srpType === PortalQsmType.Accommodation || srpType === PortalQsmType.AccommodationAndFlight) && flyInType === 'acco-results' && (
toggleFilters && toggleFilters()} // handleApplyFilters={() => setSearchTrigger((prev) => prev + 1)} isLoading={isLoading} setFilters={(filters) => dispatch(setFilters(filters))} resetFilters={(filters) => dispatch(resetFilters(filters))} />
{!isLoading && ( <> {filteredPackagingAccoResults?.length && filteredPackagingAccoResults.length}  {translations.SRP.TOTAL_RESULTS_LABEL} )}
toggleFilters && toggleFilters()}> {translations.SRP.FILTERS}
{sortByTypes && sortByTypes.length > 0 && (
getSortingName(translations, findSortByType(sortByTypes, value, direction ?? 'asc'))} onPick={(newSortKey, direction) => handleSortChange(newSortKey, direction)} />
)}
)} {(srpType === PortalQsmType.Accommodation || srpType === PortalQsmType.AccommodationAndFlight) && flyInType === 'acco-details' && ( )} {srpType === PortalQsmType.AccommodationAndFlight && (flyInType === 'flight-outward-results' || flyInType === 'flight-return-results') && ( )} {srpType === PortalQsmType.AccommodationAndFlight && flyInType === 'excursion-results' && ( )} {srpType === PortalQsmType.AccommodationAndFlight && flyInType === 'excursion-details' && } {srpType === PortalQsmType.GroupTour && }
); }; export default FlyIn;