import React, { useState } from 'react'; import { formatPrice } from '../utils/localization-util'; import { BookingPackageRoom, PackagingEntryLine, ServiceType } from '@qite/tide-client'; import { buildClassName } from '../utils/class-util'; import ProductCard from './product-card'; import { compact, isEmpty } from 'lodash'; import SidebarFlight from '../../booking-wizard/features/sidebar/sidebar-flight'; import { getDatePeriodText, getPaxTypeTranslation } from '../../booking-wizard/features/sidebar/sidebar-util'; import { PricePerPaxType } from '../../booking-wizard/types'; interface SharedSidebarProps { productName: string; thumbnailUrl?: string; isLoading?: boolean; travelerRooms?: string[]; startDateText?: string; endDateText?: string; departureFlightMetaData?: any; returnFlightMetaData?: any; basePrice?: number; commission?: number; totalPrice?: number; remainingAmountText?: string; includedCosts?: any[]; extraCosts?: any[]; deposit?: number; accommodations?: BookingPackageRoom[]; packagingAccommodations?: PackagingEntryLine[]; includedServiceTypes?: number[]; isOnRequest?: boolean; headerComponent?: React.ReactNode; footerComponent?: React.ReactNode; loaderComponent?: React.ReactNode; isUnavailable?: boolean; basePricePerPaxType?: PricePerPaxType[]; seperateExtraPricePerPaxType?: PricePerPaxType[]; translations: any; agent?: number; } const SharedSidebar: React.FC = ({ productName, thumbnailUrl, isLoading, translations, headerComponent, travelerRooms, startDateText, endDateText, loaderComponent, departureFlightMetaData, returnFlightMetaData, accommodations, packagingAccommodations, isOnRequest, includedServiceTypes, basePrice, commission, totalPrice, includedCosts, extraCosts, deposit, basePricePerPaxType, seperateExtraPricePerPaxType, isUnavailable, agent, footerComponent }) => { if (!translations) return null; const [active, setActive] = useState(false); const handleToggleClick = () => { setActive(!active); }; const isFlightOnly = includedServiceTypes?.length === 1 && includedServiceTypes.includes(ServiceType.flight); const canShowPriceBreakdownSection = Boolean(basePrice && basePrice > 0) || !isEmpty(includedCosts) || !isEmpty(extraCosts); const canShowTotalPriceSection = Boolean(totalPrice && totalPrice > 0); const remainingAmount = Number(((totalPrice ?? 0) - (deposit ?? 0)).toFixed(2)); // TODO: Determine currency code based on the data, for now default to EUR let currencyCode = 'EUR'; return (
{headerComponent}
{translations.SIDEBAR.TRAVEL_INFO}
{!isEmpty(travelerRooms) && travelerRooms?.map((room, rIndex) => (
{travelerRooms.length > 1 && `${translations.SHARED.ROOM} ${rIndex + 1}`} {travelerRooms.length === 1 && translations.ROOM_OPTIONS_FORM.TRAVELER_GROUP}
{room}
))} {startDateText && (
{startDateText && endDateText ? translations.SIDEBAR.DEPARTURE : translations.SIDEBAR.DEPARTURE_SINGLE}
{startDateText}
)} {endDateText && (
{translations.SIDEBAR.ARRIVAL}
{endDateText}
)} {/* {lines.map((line: any, idx: number) => (
{line.serviceType === 3 && ( <> {line.productName}
{line.accommodationName && {line.accommodationName}}
{line.from && line.to && ( {new Date(line.from).toLocaleDateString()} - {new Date(line.to).toLocaleDateString()} )} )} {line.serviceType === 7 && line.flightInformation && ( <> {line.productName}
{line.flightInformation.flightLines && line.flightInformation.flightLines.map((flight: any, fIdx: number) => (
{flight.airlineDescription} {flight.flightNumber}
{flight.departureAirportDescription} ({flight.departureAirportCode}) {flight.departureTime} → {flight.arrivalAirportDescription}{' '} ({flight.arrivalAirportCode}) {flight.arrivalTime}
))} )}
))} */}
{isLoading && loaderComponent} {!isLoading && departureFlightMetaData && ( )} {!isLoading && returnFlightMetaData && ( )} {accommodations && (
{translations.SIDEBAR.ACCOMMODATION}
{accommodations.map((accommodation) => { let option = accommodation.options.find((x) => x.isSelected); return (
{option?.accommodationName} {isOnRequest ? ` (${translations.SIDEBAR.ON_REQUEST})` : ''} {option?.isOnRequest ? ` (${translations.SIDEBAR.ON_REQUEST})` : ''}
{/*
{option && option.price > 0 && formatPrice(option?.price)}
*/}
{option?.regimeName}
{!isFlightOnly && getDatePeriodText(translations, option?.from, option?.to, true)}
); })}
)} {packagingAccommodations && (
{translations.SIDEBAR.ACCOMMODATION}
{packagingAccommodations.map((accommodation) => { return (
{accommodation?.accommodationName} {isOnRequest ? ` (${translations.SIDEBAR.ON_REQUEST})` : ''}
{/*
{option && option.price > 0 && formatPrice(option?.price)}
*/}
{accommodation?.regimeName}
{!isFlightOnly && getDatePeriodText(translations, accommodation?.from, accommodation?.to, true)}
); })}
)}
{!isLoading && canShowPriceBreakdownSection && (
{basePrice !== undefined && basePrice > 0 && (
{translations.SIDEBAR.BASE_PRICE}
{formatPrice(basePrice, currencyCode)}
{basePricePerPaxType && basePricePerPaxType.map((ppt, index) => (
{ppt.numberOfPax} {getPaxTypeTranslation(translations, ppt.paxType, ppt.numberOfPax)}
{formatPrice(ppt.pricePerPaxType, currencyCode)}
{ppt.details.map((detail, dIndex) => (
{detail.numberOfPax}x {detail.description}
{formatPrice(detail.price / detail.numberOfPax, currencyCode)}
))}
))}
)} {!isEmpty(includedCosts) && (
{translations.SIDEBAR.INCLUDED_COSTS}
{includedCosts?.map((priceDetail, index) => (
{priceDetail.productName}
{priceDetail.showPrice && (
{formatPrice(priceDetail.price * priceDetail.amount, currencyCode)}
)}
{priceDetail.accommodationName ?? priceDetail.accommodationCode}
))}
)} {!isEmpty(extraCosts) && (
{translations.SIDEBAR.EXTRA_COSTS}
{extraCosts?.map((priceDetail, index) => (
{priceDetail.productName}
{priceDetail.showPrice && (
{formatPrice(priceDetail.price * priceDetail.amount, currencyCode)}
)}
{priceDetail.accommodationName ?? priceDetail.accommodationCode}
{seperateExtraPricePerPaxType && seperateExtraPricePerPaxType.map((ppt, index) => (
{ppt.numberOfPax} {getPaxTypeTranslation(translations, ppt.paxType, ppt.numberOfPax)}
{formatPrice(ppt.pricePerPaxType, currencyCode)}
{ppt.details.map((detail, dIndex) => (
{detail.numberOfPax}x {detail.description}
{formatPrice(detail.price / detail.numberOfPax, currencyCode)}
))}
))}
))}
)}
)} {!isLoading && canShowTotalPriceSection && !isUnavailable && (
{deposit && remainingAmount > 0 ? (
{agent && (
{translations.SIDEBAR.COMMISSION}
{formatPrice(commission ?? 0, currencyCode)}
)} {totalPrice !== undefined && totalPrice > 0 && (
{translations.SHARED.TOTAL_PRICE}
{formatPrice(totalPrice, currencyCode)}
)}
{translations.SIDEBAR.DEPOSIT}
{formatPrice(deposit, currencyCode)}
{translations.SIDEBAR.DEPOSIT_TEXT1} {translations.SIDEBAR.DEPOSIT_TEXT2} {translations.SIDEBAR.DEPOSIT_TEXT3} {formatPrice(remainingAmount, currencyCode)} {translations.SIDEBAR.DEPOSIT_TEXT4} {translations.SIDEBAR.DEPOSIT_TEXT5} {translations.SIDEBAR.DEPOSIT_TEXT6}
) : (
{agent && (
{translations.SIDEBAR.COMMISSION}
{formatPrice(commission ?? 0, currencyCode)}
)} {totalPrice !== undefined && totalPrice > 0 && (
{translations.SHARED.TOTAL_PRICE}
{formatPrice(totalPrice, currencyCode)}
)}
)}
)} {footerComponent} {/*
{translations.SHARED.TOTAL_PRICE}
{formatPrice(price || 0, 'EUR')}
{depositAmount > 0 && (
{translations.SIDEBAR.DEPOSIT}
{formatPrice(depositAmount, 'EUR')}
)}
*/}
); }; export default SharedSidebar;