UNPKG

@kiwicom/smart-faq

Version:

Smart FAQ

233 lines (213 loc) 6.77 kB
// @flow import * as React from 'react'; import { createFragmentContainer, graphql } from 'react-relay'; import { withTheme } from 'styled-components'; import { withRouter } from 'react-router-dom'; import idx from 'idx'; import { Ticket, Airplane, InformationCircle, City, } from '@kiwicom/orbit-components/lib/icons'; import CarrierLogo from '@kiwicom/orbit-components/lib/CarrierLogo'; import Translate from '@kiwicom/nitro/lib/components/Translate'; import TextLink from '@kiwicom/orbit-components/lib/TextLink'; import List from '@kiwicom/orbit-components/lib/List'; import ListItem from '@kiwicom/orbit-components/lib/List/ListItem'; import type { AccordionLegCitiesInfo_leg } from './__generated__/AccordionLegCitiesInfo_leg.graphql'; import bookingLegTypes from '../../common/booking/bookingLegTypes'; type Props = {| leg: AccordionLegCitiesInfo_leg, theme: { orbit: { paletteProductNormal: string, }, }, history: { push: string => void, }, |}; const LegCitiesInfo = (props: Props) => { const { leg, theme } = props; const flightNumber = leg.flightNumber || ''; const transportationMode = leg.type; const reservationNumber = leg.pnr || ''; const carrier = { code: idx(leg.airline, _ => _.code) || '', name: idx(leg.airline, _ => _.name) || '', }; const carrierName = transportationMode === bookingLegTypes.AIRCRAFT ? ( <Translate t={__( 'smartfaq.single_booking_page.accordion_cities_info.airline_title_name', )} values={{ carrierName: carrier.name }} /> ) : ( <Translate t={__( 'smartfaq.single_booking_page.accordion_cities_info.carrier_title_name', )} values={{ carrierName: carrier.name }} /> ); const operatingAirline = { code: idx(leg.operatingAirline, _ => _.iata) || '', name: idx(leg.operatingAirline, _ => _.name) || '', }; const vehicle = { manufacturer: idx(leg.vehicle, _ => _.manufacturer) || '', model: idx(leg.vehicle, _ => _.model) || '', }; const departureStationName = idx(leg, _ => _.departure.airport.name) || ''; const arrivalStationName = idx(leg, _ => _.arrival.airport.name) || ''; const isOperatingAirlineDisplayed = transportationMode === bookingLegTypes.AIRCRAFT && operatingAirline.code && operatingAirline.code !== carrier.code; const isReservationNumberDisplayed = transportationMode === bookingLegTypes.AIRCRAFT && reservationNumber; const isAircraftTypeDisplayed = transportationMode === bookingLegTypes.AIRCRAFT && vehicle.manufacturer; const isGroundTransportation = transportationMode !== bookingLegTypes.AIRCRAFT; const renderFlightNumber = () => { if (transportationMode === bookingLegTypes.BUS) return null; let titleNumber = null; if (transportationMode === bookingLegTypes.AIRCRAFT) { titleNumber = ( <Translate t={__('smartfaq.single_booking_page.accordion_cities_info.flight_no')} values={{ flight_number: flightNumber, carrier_code: carrier.code, }} /> ); } else if (transportationMode === bookingLegTypes.TRAIN) { titleNumber = ( <Translate t={__('smartfaq.single_booking_page.accordion_cities_info.train_no')} values={{ flight_number: flightNumber, carrier_code: carrier.code, }} /> ); } return <ListItem icon={<InformationCircle />}>{titleNumber}</ListItem>; }; return ( <div style={{ paddingBottom: '16px' }}> <List size="small" type="secondary" dataTest="legCities"> <> <ListItem icon={<CarrierLogo carriers={[carrier]} />}> {carrierName} </ListItem> {isOperatingAirlineDisplayed && ( <ListItem icon={<CarrierLogo carriers={[operatingAirline]} />}> <Translate t={__( 'smartfaq.single_booking_page.accordion_cities_info.operating_airline', )} values={{ operatingAirline: operatingAirline.name }} /> </ListItem> )} {renderFlightNumber()} {isReservationNumberDisplayed && ( <ListItem icon={<Ticket size="small" color="secondary" />}> <Translate t={__( 'smartfaq.single_booking_page.accordion_cities_info.reservation_number', )} values={{ reservationNumber }} /> </ListItem> )} {isAircraftTypeDisplayed && ( <ListItem icon={<Airplane size="small" color="secondary" />}> <Translate t={__( 'smartfaq.single_booking_page.accordion_cities_info.vehicle_type', )} values={{ vehicle_manufacturer: vehicle.manufacturer, vehicle_model: vehicle.model, }} /> </ListItem> )} {isGroundTransportation && ( <> <ListItem icon={<City size="small" color="secondary" />}> {departureStationName} </ListItem> <ListItem icon={<City size="small" color="secondary" />}> {arrivalStationName} </ListItem> <ListItem icon={ <InformationCircle size="small" customColor={theme.orbit.paletteProductNormal} /> } dataTest="moreInfoLink" > <TextLink dataTest="moreInfoLink" onClick={() => props.history.push( '/faq/search/article/RkFRQXJ0aWNsZToxMjc=', ) } > <Translate t={__( 'smartfaq.single_booking_page.accordion_cities_info.trains_buses_info', )} /> </TextLink> </ListItem> </> )} </> </List> </div> ); }; export default createFragmentContainer( withTheme(withRouter(LegCitiesInfo)), graphql` fragment AccordionLegCitiesInfo_leg on Leg { type airline { code name } operatingAirline { iata name } flightNumber vehicle { manufacturer model } pnr departure { airport { name } } arrival { airport { name } } } `, );