Repository: kiwicom/mobile
Pull request #1310 (2018-11-09 14:58:00)

Mmb scenes idx removal


Patch:
diff --git a/README.md b/README.md
index 648906a6..d6d8f6bb 100644
--- a/README.md
+++ b/README.md
@@ -238,15 +238,14 @@ props.user.friends[0] &&
 props.user.friends[0].friends
 ```
 
-But that's not very friendly and this is why we have `idx` function. You can use it like this:
+But that's not very friendly and this is why we have `optional chaining` . You can use it like this:
 
 ```js
-import idx from 'idx';
 
-idx(props, _ => _.user.friends[0].friends)
+const friends = props.user?.friends?.[0]?.friends;
 ```
 
-**Do not use `_.get(...)` from Lodash!** For more information please read [documentation here](https://github.com/facebookincubator/idx).
+**Do not use `_.get(...)` from Lodash!**
 
 ### Error handling
 
diff --git a/app/MMB/src/MainMenu.js b/app/MMB/src/MainMenu.js
index df149afe..eb14de52 100644
--- a/app/MMB/src/MainMenu.js
+++ b/app/MMB/src/MainMenu.js
@@ -7,7 +7,6 @@ import {
   type RelayRefetchProp,
 } from '@kiwicom/mobile-relay';
 import { RefreshableScrollView } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 
 import Header from './components/header/Header';
 import ManageMenuGroup from './menuGroups/ManageMenuGroup';
@@ -45,11 +44,11 @@ class MainMenu extends React.Component<Props, State> {
 
   refetch = () => {
     this.setState({ isRefreshing: true });
-
+    const { data } = this.props;
     this.props.relay.refetch(
       {
-        id: idx(this.props.data, _ => _.databaseId),
-        authToken: idx(this.props.data, _ => _.authToken),
+        id: data.databaseId,
+        authToken: data.authToken,
       },
       null,
       () => {
@@ -61,9 +60,9 @@ class MainMenu extends React.Component<Props, State> {
     );
   };
 
-  render = () => {
+  render() {
     const { activeId } = this.state;
-    const isPastBooking = idx(this.props.data, _ => _.isPastBooking);
+    const isPastBooking = this.props.data.isPastBooking;
     return (
       <RefreshableScrollView
         refreshing={this.state.isRefreshing}
@@ -104,7 +103,7 @@ class MainMenu extends React.Component<Props, State> {
         />
       </RefreshableScrollView>
     );
-  };
+  }
 }
 
 export default createRefetchContainer(
diff --git a/app/MMB/src/scenes/flightServices/FlightServicesMenuGroup.js b/app/MMB/src/scenes/flightServices/FlightServicesMenuGroup.js
index 4857f8af..304ed8db 100644
--- a/app/MMB/src/scenes/flightServices/FlightServicesMenuGroup.js
+++ b/app/MMB/src/scenes/flightServices/FlightServicesMenuGroup.js
@@ -1,4 +1,4 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { Translation } from '@kiwicom/mobile-localization';
@@ -14,7 +14,6 @@ import {
   graphql,
   type RelayRefetchProp,
 } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import FlightServiceMenuItem from './FlightServiceMenuItem';
 import type { FlightServicesMenuGroup_bookedServices } from './__generated__/FlightServicesMenuGroup_bookedServices.graphql';
@@ -84,7 +83,7 @@ export class FlightServicesMenuGroup extends React.Component<Props, State> {
 
   navigate = (key: RouteNamesType) => {
     this.props.navigation.navigate(key, {
-      bookingId: idx(this.props.bookedServices, _ => _.databaseId),
+      bookingId: this.props.bookedServices.databaseId,
     });
   };
 
@@ -92,8 +91,8 @@ export class FlightServicesMenuGroup extends React.Component<Props, State> {
     this.setState({ isLoading: true });
     this.props.relay.refetch(
       {
-        id: idx(this.props.bookedServices, _ => _.databaseId),
-        authToken: idx(this.props.bookedServices, _ => _.authToken),
+        id: this.props.bookedServices.databaseId,
+        authToken: this.props.bookedServices.authToken,
       },
       null,
       () => {
@@ -110,12 +109,11 @@ export class FlightServicesMenuGroup extends React.Component<Props, State> {
    * and status is not 'OPEN'.
    */
   getOrderedAndNotOrderedServices = () => {
-    const bookedServices =
-      idx(this.props.bookedServices, _ => _.bookedServices) || [];
+    const bookedServices = this.props.bookedServices.bookedServices ?? [];
 
     const orderedCategories = bookedServices
-      .filter(item => idx(item, _ => _.status) !== 'OPEN')
-      .map(item => idx(item, _ => _.category));
+      .filter(item => item?.status !== 'OPEN')
+      .map(item => item?.category);
 
     const ordered = offeredFlightServices.filter(item =>
       orderedCategories.includes(item.key),
diff --git a/app/MMB/src/scenes/help/Help.js b/app/MMB/src/scenes/help/Help.js
index 47d046b3..c8b78339 100644
--- a/app/MMB/src/scenes/help/Help.js
+++ b/app/MMB/src/scenes/help/Help.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { ScrollView, Platform, Linking } from 'react-native';
 import { TextIcon, StyleSheet } from '@kiwicom/mobile-shared';
@@ -34,7 +33,7 @@ class Help extends React.Component<Props> {
   };
 
   handleOpenCallSupport = () => {
-    const number = idx(this.props.data, _ => _.number) || '';
+    const number = this.props.data.number ?? '';
     const sanitizedNumber = number.replace(/\s/g, '');
     const url =
       Platform.OS === 'ios'
@@ -59,7 +58,7 @@ class Help extends React.Component<Props> {
   };
 
   render = () => {
-    const number = idx(this.props.data, _ => _.number) || '';
+    const number = this.props.data.number ?? '';
 
     return (
       <ScrollView>
diff --git a/app/MMB/src/scenes/list/Flight.js b/app/MMB/src/scenes/list/Flight.js
index d0631767..f2890652 100644
--- a/app/MMB/src/scenes/list/Flight.js
+++ b/app/MMB/src/scenes/list/Flight.js
@@ -5,7 +5,6 @@ import { View } from 'react-native';
 import { PublicApiRenderer, graphql } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { StyleSheet } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 
 import type { FlightQueryResponse } from './__generated__/FlightQuery.graphql';
 import OneWayFlight from './OneWayFlight';
@@ -28,9 +27,8 @@ type BookingTypes = {|
 
 export default class Flight extends React.Component<Props> {
   renderInner = (renderProps: FlightQueryResponse) => {
-    const isPastBooking =
-      idx(renderProps.singleBooking, _ => _.isPastBooking) || '';
-    const type = idx(renderProps.singleBooking, _ => _.__typename) || '';
+    const isPastBooking = renderProps.singleBooking?.isPastBooking ?? '';
+    const type = renderProps.singleBooking?.__typename ?? '';
     const types: BookingTypes = {
       BookingOneWay: <OneWayFlight booking={renderProps.singleBooking} />,
       BookingReturn: <ReturnFlight booking={renderProps.singleBooking} />,
diff --git a/app/MMB/src/scenes/list/FlightList.js b/app/MMB/src/scenes/list/FlightList.js
index 0b3f2963..d2bad50e 100644
--- a/app/MMB/src/scenes/list/FlightList.js
+++ b/app/MMB/src/scenes/list/FlightList.js
@@ -2,7 +2,6 @@
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import OneWayFlight from './OneWayFlight';
 import ReturnFlight from './ReturnFlight';
@@ -19,22 +18,20 @@ type State = {|
 |};
 
 export class FlightList extends React.Component<Props, State> {
-  render = () => {
-    const flights = idx(this.props, _ => _.data.edges);
+  render() {
+    const flights = this.props.data.edges;
 
     if (!flights) {
       return null;
     }
 
     return flights.map(flight => {
-      const key = idx(flight, _ => _.node.id);
-      const type = idx(flight, _ => _.node.__typename);
+      const key = flight?.node?.id;
+      const type = flight?.node?.__typename;
       const variants: Object = {
-        BookingOneWay: <OneWayFlight booking={idx(flight, _ => _.node)} />,
-        BookingReturn: <ReturnFlight booking={idx(flight, _ => _.node)} />,
-        BookingMulticity: (
-          <MulticityFlight booking={idx(flight, _ => _.node)} />
-        ),
+        BookingOneWay: <OneWayFlight booking={flight?.node} />,
+        BookingReturn: <ReturnFlight booking={flight?.node} />,
+        BookingMulticity: <MulticityFlight booking={flight?.node} />,
       };
 
       let Component = variants.ONE_WAY;
@@ -44,7 +41,7 @@ export class FlightList extends React.Component<Props, State> {
 
       return <FlightItemLayout key={key}>{Component}</FlightItemLayout>;
     });
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/list/MulticityFlight.js b/app/MMB/src/scenes/list/MulticityFlight.js
index 838f1d7f..1271e594 100644
--- a/app/MMB/src/scenes/list/MulticityFlight.js
+++ b/app/MMB/src/scenes/list/MulticityFlight.js
@@ -1,8 +1,7 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import CityImageContainer from './cityImage/CityImageContainer';
 import type { MulticityFlight_booking as MulticityFlightType } from './__generated__/MulticityFlight_booking.graphql';
@@ -16,8 +15,8 @@ type Props = {|
 const MulticityFlight = (props: Props) => (
   <CityImageContainer
     image={props.booking}
-    arrival={idx(props.booking, _ => _.end)}
-    departure={idx(props.booking, _ => _.start)}
+    arrival={props.booking.end}
+    departure={props.booking.start}
     type="MULTICITY"
   />
 );
diff --git a/app/MMB/src/scenes/list/OneWayFlight.js b/app/MMB/src/scenes/list/OneWayFlight.js
index 179a8531..ee51ace1 100644
--- a/app/MMB/src/scenes/list/OneWayFlight.js
+++ b/app/MMB/src/scenes/list/OneWayFlight.js
@@ -1,23 +1,22 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import CityImageContainer from './cityImage/CityImageContainer';
 import type { OneWayFlight_booking as OneWayFlightType } from './__generated__/OneWayFlight_booking.graphql';
 
 type Props = {|
-  imageUrl: string,
-  type: string,
-  booking: OneWayFlightType,
+  +imageUrl: string,
+  +type: string,
+  +booking: OneWayFlightType,
 |};
 
 const OneWayFlight = (props: Props) => (
   <CityImageContainer
     image={props.booking}
-    arrival={idx(props.booking, _ => _.trip.arrival)}
-    departure={idx(props.booking, _ => _.trip.departure)}
+    arrival={props.booking.trip?.arrival}
+    departure={props.booking.trip?.departure}
     type="ONE_WAY"
   />
 );
diff --git a/app/MMB/src/scenes/list/ReturnFlight.js b/app/MMB/src/scenes/list/ReturnFlight.js
index d48194d7..15e6314b 100644
--- a/app/MMB/src/scenes/list/ReturnFlight.js
+++ b/app/MMB/src/scenes/list/ReturnFlight.js
@@ -1,23 +1,22 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import CityImageContainer from './cityImage/CityImageContainer';
 import type { ReturnFlight_booking as ReturnFlightType } from './__generated__/ReturnFlight_booking.graphql';
 
 type Props = {|
-  imageUrl: string,
-  type: string,
-  booking: ReturnFlightType,
+  +imageUrl: string,
+  +type: string,
+  +booking: ReturnFlightType,
 |};
 
 const ReturnFlight = (props: Props) => (
   <CityImageContainer
     image={props.booking}
-    arrival={idx(props.booking, _ => _.outbound.arrival)}
-    departure={idx(props.booking, _ => _.outbound.departure)}
+    arrival={props.booking.outbound?.arrival}
+    departure={props.booking.outbound?.departure}
     type="RETURN"
   />
 );
diff --git a/app/MMB/src/scenes/list/cityImage/CityImageContainer.js b/app/MMB/src/scenes/list/cityImage/CityImageContainer.js
index 5465dddc..225d5d55 100644
--- a/app/MMB/src/scenes/list/cityImage/CityImageContainer.js
+++ b/app/MMB/src/scenes/list/cityImage/CityImageContainer.js
@@ -1,4 +1,4 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import {
@@ -13,7 +13,6 @@ import {
   type NavigationType,
   withNavigation,
 } from '@kiwicom/mobile-navigation';
-import idx from 'idx';
 
 import FromToRow from './FromToRow';
 import DateAndPassengerCount from './DateAndPassengerCount';
@@ -35,13 +34,13 @@ class CityImageContainer extends React.Component<PropsWithContext> {
   goToDetail = () => {
     const props = this.props;
 
-    const id = idx(props.image, _ => _.id) || '';
-    const bookingId = idx(props.image, _ => _.databaseId) || 0;
-    const isPastBooking = Boolean(idx(props.image, _ => _.isPastBooking));
-    const arrivalCityId = idx(props.arrival, _ => _.cityId) || '';
-    const arrivalTime = idx(props.arrival, _ => _.time) || '';
-    const departureTime = idx(props.departure, _ => _.time) || '';
-    const authToken = idx(props.image, _ => _.authToken) || '';
+    const id = props.image.id ?? '';
+    const bookingId = props.image?.databaseId ?? 0;
+    const isPastBooking = Boolean(props.image?.isPastBooking);
+    const arrivalCityId = props.arrival?.cityId ?? '';
+    const arrivalTime = props.arrival?.time ?? '';
+    const departureTime = props.departure?.time ?? '';
+    const authToken = props.image?.authToken ?? '';
 
     this.props.setBookingDetail({
       id,
diff --git a/app/MMB/src/scenes/list/cityImage/DateAndPassengerCount.js b/app/MMB/src/scenes/list/cityImage/DateAndPassengerCount.js
index a80ac5ab..744d098b 100644
--- a/app/MMB/src/scenes/list/cityImage/DateAndPassengerCount.js
+++ b/app/MMB/src/scenes/list/cityImage/DateAndPassengerCount.js
@@ -1,11 +1,10 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { View } from 'react-native';
 import { Text, StyleSheet, TextIcon } from '@kiwicom/mobile-shared';
 import { Translation, DateFormatter } from '@kiwicom/mobile-localization';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import type { DateAndPassengerCount_departure as DepartureType } from './__generated__/DateAndPassengerCount_departure.graphql';
@@ -16,7 +15,7 @@ type Props = {|
 |};
 
 export const DateAndPassengerCount = (props: Props) => {
-  let departureDate = idx(props, _ => _.departure.time);
+  let departureDate = props.departure.time;
   if (departureDate) {
     departureDate = DateFormatter(new Date(departureDate)).formatToDate();
   }
diff --git a/app/MMB/src/scenes/list/cityImage/FromToRow.js b/app/MMB/src/scenes/list/cityImage/FromToRow.js
index 545748a6..65b78feb 100644
--- a/app/MMB/src/scenes/list/cityImage/FromToRow.js
+++ b/app/MMB/src/scenes/list/cityImage/FromToRow.js
@@ -1,11 +1,10 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { View } from 'react-native';
 import { Text, StyleSheet } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import TravelTypeIcon from '../../../components/TravelTypeIcon';
@@ -22,9 +21,7 @@ export const FromToRow = (props: Props) => (
   <View style={styles.row}>
     <View style={styles.flexItem}>
       <Text style={[styles.text, styles.cityText]}>
-        <Translation
-          passThrough={idx(props.departure, _ => _.airport.city.name)}
-        />
+        <Translation passThrough={props.departure.airport?.city?.name} />
       </Text>
     </View>
     <View style={[styles.flexItem, styles.iconWrapper]}>
@@ -32,9 +29,7 @@ export const FromToRow = (props: Props) => (
     </View>
     <View style={[styles.flexItem, styles.arrivalWrapper]}>
       <Text style={[styles.text, styles.cityText]}>
-        <Translation
-          passThrough={idx(props.arrival, _ => _.airport.city.name)}
-        />
+        <Translation passThrough={props.arrival.airport?.city?.name} />
       </Text>
     </View>
   </View>
diff --git a/app/MMB/src/scenes/list/cityImage/StatusBadge.js b/app/MMB/src/scenes/list/cityImage/StatusBadge.js
index 86c3d189..e0521472 100644
--- a/app/MMB/src/scenes/list/cityImage/StatusBadge.js
+++ b/app/MMB/src/scenes/list/cityImage/StatusBadge.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { AdaptableBadge, StyleSheet } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import type { StatusBadge as StatusBadgeType } from './__generated__/StatusBadge.graphql';
@@ -14,8 +13,8 @@ type Props = {|
 |};
 
 const StatusBadge = (props: Props) => {
-  const status = idx(props.data, _ => _.status) || '';
-  const isPastBooking = idx(props.data, _ => _.isPastBooking) || '';
+  const status = props.data.status ?? '';
+  const isPastBooking = Boolean(props.data.isPastBooking);
 
   let renderStatus;
   switch (status) {
diff --git a/app/MMB/src/scenes/passenger/Passenger.js b/app/MMB/src/scenes/passenger/Passenger.js
index 76e37755..f712c844 100644
--- a/app/MMB/src/scenes/passenger/Passenger.js
+++ b/app/MMB/src/scenes/passenger/Passenger.js
@@ -1,11 +1,10 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation, DateFormatter } from '@kiwicom/mobile-localization';
 import { StyleSheet, SimpleCard } from '@kiwicom/mobile-shared';
 import { MenuGroup, SeparatorTrimmed } from '@kiwicom/mobile-navigation';
-import idx from 'idx';
 import { View } from 'react-native';
 import startCase from 'lodash/startCase';
 
@@ -25,19 +24,19 @@ type Props = {|
 |};
 
 export const Passenger = ({ passenger }: Props) => {
-  const title = idx(passenger, _ => _.title) || '';
-  const fullName = idx(passenger, _ => _.fullName) || '';
-  const birthday = idx(passenger, _ => _.birthday) || '';
-  const nationality = idx(passenger, _ => _.nationality) || '';
-  const idNumber = idx(passenger, _ => _.travelDocument.idNumber) || '';
+  const title = passenger.title ?? '';
+  const fullName = passenger.fullName ?? '';
+  const birthday = passenger.birthday ?? '';
+  const nationality = passenger.nationality ?? '';
+  const idNumber = passenger.travelDocument?.idNumber ?? '';
   const insuranceType = startCase(
-    (idx(passenger, _ => _.insuranceType) || '').toLowerCase(),
+    (passenger.insuranceType ?? '').toLowerCase(),
   );
 
-  let requiredIn = idx(passenger, _ => _.visaInformation.requiredIn) || [];
-  requiredIn = requiredIn.map(item => idx(item, _ => _.name) || '');
-  let warningIn = idx(passenger, _ => _.visaInformation.warningIn) || [];
-  warningIn = warningIn.map(item => idx(item, _ => _.name) || '');
+  let requiredIn = passenger.visaInformation?.requiredIn ?? [];
+  requiredIn = requiredIn.map(item => item?.name ?? '');
+  let warningIn = passenger.visaInformation?.warningIn ?? [];
+  warningIn = warningIn.map(item => item?.name ?? '');
 
   return (
     <SimpleCard style={styles.card}>
diff --git a/app/MMB/src/scenes/passenger/PassengerDetail.js b/app/MMB/src/scenes/passenger/PassengerDetail.js
index e3e31101..e6b2c918 100644
--- a/app/MMB/src/scenes/passenger/PassengerDetail.js
+++ b/app/MMB/src/scenes/passenger/PassengerDetail.js
@@ -8,7 +8,6 @@ import {
   type RelayRefetchProp,
 } from '@kiwicom/mobile-relay';
 import { RefreshableScrollView, StyleSheet } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 
 import type { PassengerDetail_booking as PassengersType } from './__generated__/PassengerDetail_booking.graphql';
 import Passenger from './Passenger';
@@ -31,11 +30,12 @@ export class PassengerDetail extends React.Component<Props, State> {
   };
 
   refetch = () => {
+    const { booking } = this.props;
     this.setState({ isRefreshing: true });
     this.props.relay.refetch(
       {
-        id: idx(this.props.booking, _ => _.databaseId),
-        authToken: idx(this.props.booking, _ => _.authToken),
+        id: booking.databaseId,
+        authToken: booking.authToken,
       },
       null,
       () => {
@@ -47,8 +47,9 @@ export class PassengerDetail extends React.Component<Props, State> {
     );
   };
 
-  render = () => {
-    const passengers = idx(this.props.booking, _ => _.passengers) || [];
+  render() {
+    const { booking } = this.props;
+    const passengers = booking.passengers ?? [];
 
     return (
       <RefreshableScrollView
@@ -56,25 +57,20 @@ export class PassengerDetail extends React.Component<Props, State> {
         onRefresh={this.refetch}
       >
         {passengers.map(passenger => (
-          <View
-            key={idx(passenger, _ => _.databaseId)}
-            style={styles.passengerContainer}
-          >
+          <View key={passenger?.databaseId} style={styles.passengerContainer}>
             <Passenger passenger={passenger} />
           </View>
         ))}
         <Baggage data={this.props.booking} />
         <View style={styles.contactDetailsWrapper}>
-          <ContactDetails
-            contactDetails={idx(this.props.booking, _ => _.contactDetails)}
-          />
+          <ContactDetails contactDetails={booking.contactDetails} />
         </View>
         <View style={styles.visaDisclaimerContainer}>
           <VisaDisclaimer />
         </View>
       </RefreshableScrollView>
     );
-  };
+  }
 }
 
 export default createRefetchContainer(
diff --git a/app/MMB/src/scenes/passenger/baggage/BagInfo.js b/app/MMB/src/scenes/passenger/baggage/BagInfo.js
index 00248a1c..2b6dfd86 100644
--- a/app/MMB/src/scenes/passenger/baggage/BagInfo.js
+++ b/app/MMB/src/scenes/passenger/baggage/BagInfo.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { Text, StyleSheet } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import type { BagInfo as BagInfoType } from './__generated__/BagInfo.graphql';
@@ -13,11 +12,11 @@ type Props = {|
   +data: BagInfoType,
 |};
 
-const BagInfo = (props: Props) => {
-  const height = idx(props.data, _ => _.height) || '';
-  const length = idx(props.data, _ => _.length) || '';
-  const width = idx(props.data, _ => _.width) || '';
-  const weight = idx(props.data, _ => _.weight) || '';
+const BagInfo = ({ data }: Props) => {
+  const height = data.height ?? '';
+  const length = data.length ?? '';
+  const width = data.width ?? '';
+  const weight = data.weight ?? '';
   return (
     <Text style={styles.text}>
       <Translation
diff --git a/app/MMB/src/scenes/passenger/baggage/Baggage.js b/app/MMB/src/scenes/passenger/baggage/Baggage.js
index bc9d2d14..85ba3188 100644
--- a/app/MMB/src/scenes/passenger/baggage/Baggage.js
+++ b/app/MMB/src/scenes/passenger/baggage/Baggage.js
@@ -8,7 +8,6 @@ import {
   SeparatorTrimmed,
 } from '@kiwicom/mobile-navigation';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import CabinBags from './CabinBags';
 import CheckedBaggage from './CheckedBaggage';
@@ -19,14 +18,14 @@ type Props = {|
   +data: BaggageType,
 |};
 
-const Baggage = (props: Props) => (
+const Baggage = ({ data }: Props) => (
   <TitledMenuGroup title={<Translation passThrough="Baggage" />}>
     <BaggageGroupButton>
       <MenuGroup
         customSeparator={<SeparatorTrimmed gapSizeStart={15} gapSizeEnd={15} />}
       >
-        <CabinBags data={idx(props.data, _ => _.allowedBaggage)} />
-        <CheckedBaggage data={idx(props.data, _ => _.allowedBaggage)} />
+        <CabinBags data={data.allowedBaggage} />
+        <CheckedBaggage data={data.allowedBaggage} />
       </MenuGroup>
     </BaggageGroupButton>
   </TitledMenuGroup>
diff --git a/app/MMB/src/scenes/passenger/baggage/CabinBags.js b/app/MMB/src/scenes/passenger/baggage/CabinBags.js
index acf0f34d..dec287cf 100644
--- a/app/MMB/src/scenes/passenger/baggage/CabinBags.js
+++ b/app/MMB/src/scenes/passenger/baggage/CabinBags.js
@@ -5,7 +5,6 @@ import { View } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { StyleSheet, TextIcon } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import type { CabinBags as Bags } from './__generated__/CabinBags.graphql';
@@ -16,8 +15,8 @@ type Props = {|
   +data: Bags,
 |};
 
-const CabinBags = (props: Props) => {
-  const bags = idx(props.data, _ => _.cabin) || [];
+const CabinBags = ({ data }: Props) => {
+  const bags = data.cabin ?? [];
   if (bags.length === 0) {
     return null;
   }
diff --git a/app/MMB/src/scenes/passenger/baggage/CheckedBaggage.js b/app/MMB/src/scenes/passenger/baggage/CheckedBaggage.js
index 354a915e..525d365d 100644
--- a/app/MMB/src/scenes/passenger/baggage/CheckedBaggage.js
+++ b/app/MMB/src/scenes/passenger/baggage/CheckedBaggage.js
@@ -5,7 +5,6 @@ import { View } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { StyleSheet, TextIcon } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import BagInfo from './BagInfo';
@@ -16,8 +15,8 @@ type Props = {|
   +data: Bags,
 |};
 
-const CheckedBaggage = (props: Props) => {
-  const bags = idx(props.data, _ => _.checked) || [];
+const CheckedBaggage = ({ data }: Props) => {
+  const bags = data.checked ?? [];
 
   if (bags.length === 0) {
     return null;
diff --git a/app/MMB/src/scenes/passenger/contactDetails/ContactDetails.js b/app/MMB/src/scenes/passenger/contactDetails/ContactDetails.js
index 4c5e4934..0ae0177f 100644
--- a/app/MMB/src/scenes/passenger/contactDetails/ContactDetails.js
+++ b/app/MMB/src/scenes/passenger/contactDetails/ContactDetails.js
@@ -2,7 +2,6 @@
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 import { Translation } from '@kiwicom/mobile-localization';
 import {
   TitledMenuGroup,
@@ -26,15 +25,11 @@ const ContactDetails = (props: Props) => (
     >
       <ContactMenuItem
         title={<Translation id="mmb.passengers.email" />}
-        value={
-          <Translation passThrough={idx(props.contactDetails, _ => _.email)} />
-        }
+        value={<Translation passThrough={props.contactDetails.email} />}
       />
       <ContactMenuItem
         title={<Translation id="mmb.passengers.phone" />}
-        value={
-          <Translation passThrough={idx(props.contactDetails, _ => _.phone)} />
-        }
+        value={<Translation passThrough={props.contactDetails.phone} />}
       />
     </MenuGroup>
   </TitledMenuGroup>
diff --git a/app/MMB/src/scenes/tickets/ETicket.js b/app/MMB/src/scenes/tickets/ETicket.js
index d242f2e6..17db9366 100644
--- a/app/MMB/src/scenes/tickets/ETicket.js
+++ b/app/MMB/src/scenes/tickets/ETicket.js
@@ -11,7 +11,6 @@ import {
 } from '@kiwicom/mobile-shared';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 import {
   type NavigationType,
   type RouteNamesType,
@@ -34,12 +33,12 @@ class ETicket extends React.Component<Props> {
 
   openDocument = () => {
     this.navigate('mmb.tickets.e_ticket', {
-      ticketUrl: idx(this.props.data, _ => _.ticketUrl),
+      ticketUrl: this.props.data.ticketUrl,
     });
   };
 
-  render = () => {
-    const isTicketConfirmed = Boolean(idx(this.props.data, _ => _.ticketUrl));
+  render() {
+    const isTicketConfirmed = Boolean(this.props.data.ticketUrl);
     return (
       <SimpleCard style={styles.card}>
         <View style={styles.header}>
@@ -74,7 +73,7 @@ class ETicket extends React.Component<Props> {
         </View>
       </SimpleCard>
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tickets/TicketRefetch.js b/app/MMB/src/scenes/tickets/TicketRefetch.js
index 1ba51096..e6487408 100644
--- a/app/MMB/src/scenes/tickets/TicketRefetch.js
+++ b/app/MMB/src/scenes/tickets/TicketRefetch.js
@@ -7,7 +7,6 @@ import {
   type RelayRefetchProp,
 } from '@kiwicom/mobile-relay';
 import { RefreshableScrollView, StyleSheet } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 
 import ETicket from './ETicket';
 import BoardingPasses from './boardingPasses/BoardingPasses';
@@ -28,12 +27,13 @@ class ETicketRefetch extends React.Component<Props, State> {
   };
 
   refetch = () => {
+    const { data } = this.props;
     this.setState({ isRefreshing: true });
 
     this.props.relay.refetch(
       {
-        id: idx(this.props.data, _ => _.databaseId),
-        authToken: idx(this.props.data, _ => _.authToken),
+        id: data.databaseId,
+        authToken: data.authToken,
       },
       null,
       () => {
@@ -45,16 +45,18 @@ class ETicketRefetch extends React.Component<Props, State> {
     );
   };
 
-  render = () => (
-    <RefreshableScrollView
-      refreshing={this.state.isRefreshing}
-      onRefresh={this.refetch}
-      contentContainerStyle={styles.container}
-    >
-      <ETicket data={idx(this.props.data, _ => _.assets)} />
-      <BoardingPasses data={this.props.data} />
-    </RefreshableScrollView>
-  );
+  render() {
+    return (
+      <RefreshableScrollView
+        refreshing={this.state.isRefreshing}
+        onRefresh={this.refetch}
+        contentContainerStyle={styles.container}
+      >
+        <ETicket data={this.props.data.assets} />
+        <BoardingPasses data={this.props.data} />
+      </RefreshableScrollView>
+    );
+  }
 }
 
 export default createRefetchContainer(
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js
index 9eddcf88..0ca23f0e 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassMultiCity.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { Translation } from '@kiwicom/mobile-localization';
 import { createFragmentContainer, graphql } from '@kiwicom/mobile-relay';
 import { TextIcon, StyleSheet, Color } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import last from 'lodash/last';
 
 import type { BoardingPassMultiCity as BookingType } from './__generated__/BoardingPassMultiCity.graphql';
@@ -15,7 +14,7 @@ type Props = {|
 |};
 
 export const BoardingPassMultiCity = (props: Props) => {
-  const trips = idx(props.data, _ => _.trips) || [];
+  const trips = props.data.trips ?? [];
   return trips.map((trip, index) => {
     const color = Color.tripColorCodes[index] || last(Color.tripColorCodes); // if we have more trips than colors, fallback to last color code
     const styles = StyleSheet.create({
@@ -29,9 +28,7 @@ export const BoardingPassMultiCity = (props: Props) => {
         data={trip}
         icon={<TextIcon code="&#xe103;" style={styles.textIcon} />}
         iconTitle={
-          <Translation
-            passThrough={idx(trip, _ => _.arrival.airport.city.name)}
-          />
+          <Translation passThrough={trip?.arrival?.airport?.city?.name} />
         }
       />
     );
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassOneWay.js b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassOneWay.js
index 3bacec33..f9bc1aed 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassOneWay.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassOneWay.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { Translation } from '@kiwicom/mobile-localization';
 import { createFragmentContainer, graphql } from '@kiwicom/mobile-relay';
 import { TextIcon, StyleSheet } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import type { BoardingPassOneWay as BookingType } from './__generated__/BoardingPassOneWay.graphql';
@@ -16,7 +15,7 @@ type Props = {|
 
 const BoardingPassOneWay = (props: Props) => (
   <FlightSegments
-    data={idx(props.data, _ => _.trip)}
+    data={props.data.trip}
     icon={<TextIcon code="&#xe103;" style={styles.outboundIcon} />}
     iconTitle={
       <Translation id="mmb.boarding_passes.boarding_pass_one_way.departure" />
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassReturn.js b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassReturn.js
index 698ca902..14523149 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassReturn.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/BoardingPassReturn.js
@@ -2,7 +2,6 @@
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 import { TextIcon, StyleSheet } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
@@ -14,17 +13,17 @@ type Props = {|
   +data: BoardingPassReturnType,
 |};
 
-export const BoardingPassReturn = (props: Props) => (
+export const BoardingPassReturn = ({ data }: Props) => (
   <React.Fragment>
     <FlightSegments
-      data={idx(props.data, _ => _.outbound)}
+      data={data.outbound}
       icon={<TextIcon code="&#xe103;" style={styles.outboundIcon} />}
       iconTitle={
         <Translation id="mmb.boarding_passes.boarding_pass_return.departure" />
       }
     />
     <FlightSegments
-      data={idx(props.data, _ => _.inbound)}
+      data={data.inbound}
       icon={<TextIcon code="&#xe103;" style={styles.inboundIcon} />}
       iconTitle={
         <Translation id="mmb.boarding_passes.boarding_pass_return.return" />
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/DownloadButton.js b/app/MMB/src/scenes/tickets/boardingPasses/DownloadButton.js
index 6114c740..d4c46866 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/DownloadButton.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/DownloadButton.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { Button, StyleSheet, Text } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import {
   type NavigationType,
   withNavigation,
@@ -21,14 +20,18 @@ type Props = {|
 
 class DownloadButton extends React.Component<Props> {
   navigateToBoardingPass = () => {
+    const { data } = this.props;
+
     this.props.navigation.navigate('mmb.tickets.boarding_pass', {
-      boardingPassUrl: idx(this.props, _ => _.data.boardingPassUrl),
-      flightNumber: idx(this.props, _ => _.data.flightNumber),
+      boardingPassUrl: data.boardingPassUrl,
+      flightNumber: data.flightNumber,
     });
   };
 
-  render = () => {
-    const isDisabled = !idx(this.props.data, _ => _.boardingPassUrl);
+  render() {
+    const isDisabled =
+      this.props.data.boardingPassUrl == null ||
+      this.props.data.boardingPassUrl === '';
     return (
       <React.Fragment>
         <BoardingPassInformation data={this.props.data} />
@@ -43,7 +46,7 @@ class DownloadButton extends React.Component<Props> {
         </Button>
       </React.Fragment>
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/FlightFromTo.js b/app/MMB/src/scenes/tickets/boardingPasses/FlightFromTo.js
index c01cc870..5710b86c 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/FlightFromTo.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/FlightFromTo.js
@@ -5,7 +5,6 @@ import { View } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation, DateFormatter } from '@kiwicom/mobile-localization';
 import { TextIcon, StyleSheet, Text } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import BoardingPassRow from '../components/BoardingPassRow';
@@ -20,19 +19,21 @@ type PropsWithContext = {|
 |};
 
 export class FlightFromTo extends React.Component<PropsWithContext> {
-  componentDidMount = () => {
-    const id = idx(this.props.data, _ => _.id) || '';
-    const airlineLogoUrl = idx(this.props.data, _ => _.airline.logoUrl) || '';
-    const flightDate = idx(this.props.data, _ => _.departure.localTime) || null;
+  componentDidMount() {
+    const { data } = this.props;
+    const id = data?.id ?? '';
+    const airlineLogoUrl = data?.airline?.logoUrl ?? '';
+    const flightDate = data?.departure?.localTime ?? null;
     this.props.addSegment({
       id,
       airlineLogoUrl, // TODO: This is not the correct logo. Fix when images have been added to images.kiwi.com
       flightDate,
     });
-  };
+  }
 
-  render = () => {
-    const date = idx(this.props.data, _ => _.departure.localTime);
+  render() {
+    const { data } = this.props;
+    const date = data?.departure?.localTime;
     const shortDate = date
       ? DateFormatter(new Date(date)).formatToShortDate()
       : '';
@@ -54,43 +55,30 @@ export class FlightFromTo extends React.Component<PropsWithContext> {
             <View style={[styles.row, styles.cityContainer]}>
               <Text style={styles.cityText}>
                 <Translation
-                  passThrough={idx(
-                    this.props.data,
-                    _ => _.departure.airport.city.name,
-                  )}
+                  passThrough={data?.departure?.airport?.city?.name}
                 />
               </Text>
               <TextIcon code="C" style={styles.icon} />
               <Text style={styles.cityText}>
-                <Translation
-                  passThrough={idx(
-                    this.props.data,
-                    _ => _.arrival.airport.city.name,
-                  )}
-                />
+                <Translation passThrough={data?.arrival?.airport?.city?.name} />
               </Text>
             </View>
             <View style={styles.buttonContainer}>
-              <DownloadButton
-                data={idx(this.props.data, _ => _.boardingPass)}
-              />
+              <DownloadButton data={data?.boardingPass} />
             </View>
 
             <View style={styles.appleWalletContainer}>
-              <TicketList
-                segmentId={idx(this.props.data, _ => _.id)}
-                data={idx(this.props.data, _ => _.boardingPass)}
-              />
+              <TicketList segmentId={data?.id} data={data?.boardingPass} />
             </View>
           </View>
         }
       />
     );
-  };
+  }
 }
 
 type Props = {|
-  +data: RouteStopType,
+  +data: ?RouteStopType,
 |};
 
 const FlightFromToWithContext = (props: Props) => (
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/FlightSegments.js b/app/MMB/src/scenes/tickets/boardingPasses/FlightSegments.js
index 5459d40b..113d0699 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/FlightSegments.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/FlightSegments.js
@@ -6,7 +6,6 @@ import { TextIcon, StyleSheet, Text } from '@kiwicom/mobile-shared';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { SeparatorFullWidth } from '@kiwicom/mobile-navigation';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import BoardingPassRow from '../components/BoardingPassRow';
@@ -20,7 +19,7 @@ type Props = {|
 |};
 
 const FlightSegments = (props: Props) => {
-  const legs = idx(props.data, _ => _.legs) || [];
+  const legs = props.data.legs ?? [];
   const icon = React.cloneElement(props.icon, {
     style: StyleSheet.flatten([styles.icon, props.icon.props.style]),
   });
@@ -37,7 +36,7 @@ const FlightSegments = (props: Props) => {
         />
       </View>
       {legs.map(item => (
-        <View style={styles.flightItem} key={idx(item, _ => _.id)}>
+        <View style={styles.flightItem} key={item?.id}>
           <FlightFromTo data={item} />
         </View>
       ))}
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/BoardingPassInformation.js b/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/BoardingPassInformation.js
index eaeb1374..c2e7da62 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/BoardingPassInformation.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/BoardingPassInformation.js
@@ -2,7 +2,6 @@
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import FutureBookingInformation from './FutureBookingInformation';
 import BookingDetailContext from '../../../../context/BookingDetailContext';
@@ -14,26 +13,26 @@ type PropsWithContext = {|
   +isPastBooking: boolean,
 |};
 
-const BoardingPassInformation = (props: PropsWithContext) => {
-  const availableAt = idx(props.data, _ => _.availableAt) || '';
+const BoardingPassInformation = ({ data, isPastBooking }: PropsWithContext) => {
+  const availableAt = data.availableAt ?? '';
   const [year, month, day] = availableAt.split('-');
-  const date = availableAt
+  const boardingPassAvailableDate = availableAt
     ? new Date(Date.UTC(parseInt(year), parseInt(month) - 1, parseInt(day)))
     : null;
 
-  if (props.isPastBooking) {
+  if (isPastBooking) {
     return (
       <PastBookingInformation
-        boardingPassAvailableDate={date}
-        boardingPassUrl={idx(props.data, _ => _.boardingPassUrl)}
+        boardingPassAvailableDate={boardingPassAvailableDate}
+        boardingPassUrl={data.boardingPassUrl}
       />
     );
   }
 
   return (
     <FutureBookingInformation
-      boardingPassAvailableDate={date}
-      data={props.data}
+      boardingPassAvailableDate={boardingPassAvailableDate}
+      data={data}
     />
   );
 };
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/FutureBookingInformation.js b/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/FutureBookingInformation.js
index 9297d361..4c0d6956 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/FutureBookingInformation.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/boardingPassInformation/FutureBookingInformation.js
@@ -3,7 +3,6 @@
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import BookingDetailContext from '../../../../context/BookingDetailContext';
 import type { FutureBookingInformation as BoardingPass } from './__generated__/FutureBookingInformation.graphql';
@@ -14,7 +13,7 @@ type PropsWithContext = {|
 |};
 
 export const FutureBookingInformation = (props: PropsWithContext) => {
-  const isAvailable = Boolean(idx(props.data, _ => _.boardingPassUrl));
+  const isAvailable = Boolean(props.data.boardingPassUrl);
 
   if (!isAvailable && props.boardingPassAvailableDate !== null) {
     return (
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/TicketList.js b/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/TicketList.js
index e0c3449d..eca372af 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/TicketList.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/TicketList.js
@@ -5,7 +5,6 @@ import { View, Platform } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { Text, StyleSheet } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import WalletPassenger from './WalletPassenger';
@@ -16,8 +15,8 @@ type Props = {|
   +segmentId: ?string,
 |};
 
-const TicketList = (props: Props) => {
-  const pkpasses = idx(props.data, _ => _.pkpasses) || [];
+const TicketList = ({ data, segmentId }: Props) => {
+  const pkpasses = data.pkpasses ?? [];
 
   if (pkpasses.length === 0) {
     return null;
@@ -47,10 +46,10 @@ const TicketList = (props: Props) => {
       <View style={styles.passengerContainer}>
         {pkpasses.map(item => (
           <WalletPassenger
-            key={idx(item, _ => _.passenger.databaseId)}
+            key={item.passenger?.databaseId}
             data={item}
-            segmentId={props.segmentId}
-            flightNumber={idx(props.data, _ => _.flightNumber)}
+            segmentId={segmentId}
+            flightNumber={data.flightNumber}
           />
         ))}
       </View>
diff --git a/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/WalletPassenger.js b/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/WalletPassenger.js
index fed84d62..8e859e2b 100644
--- a/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/WalletPassenger.js
+++ b/app/MMB/src/scenes/tickets/boardingPasses/mobileTicket/WalletPassenger.js
@@ -5,7 +5,6 @@ import { Platform } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon, StyleSheet, Touchable } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import {
   type NavigationType,
   withNavigation,
@@ -49,12 +48,13 @@ class WalletPassenger extends React.Component<PropsWithContext, State> {
   };
 
   onPressIos = () => {
-    const name = idx(this.props.data, _ => _.passenger.fullName) || '';
-    const url = idx(this.props.data, _ => _.url) || '';
+    const { data, segmentId } = this.props;
+    const name = data.passenger?.fullName ?? '';
+    const url = data.url ?? '';
 
-    if (this.props.segmentId != null) {
+    if (segmentId != null) {
       // We cannot navigate before selected segment has been set
-      this.props.addPkpassData(name, url, this.props.segmentId, () => {
+      this.props.addPkpassData(name, url, segmentId, () => {
         this.props.navigation.navigate('AppleWalletScreen');
       });
     }
@@ -69,7 +69,7 @@ class WalletPassenger extends React.Component<PropsWithContext, State> {
   };
 
   getFolderPath = () => {
-    const databaseId = idx(this.props.data, _ => _.passenger.databaseId) || '';
+    const databaseId = this.props.data.passenger?.databaseId ?? '';
     const flightNumber =
       this.props.flightNumber == null ? '' : this.props.flightNumber;
     return `pkpasses/${this.props.bookingId}/${flightNumber}/${databaseId}`;
@@ -77,10 +77,11 @@ class WalletPassenger extends React.Component<PropsWithContext, State> {
 
   downloadPkpass = async () => {
     try {
-      const url = idx(this.props.data, _ => _.url) || '';
-      const databaseId = idx(this.props.data, _ => _.passenger.databaseId);
+      const { data, flightNumber } = this.props;
+      const url = data.url ?? '';
+      const databaseId = data.passenger?.databaseId;
 
-      if (this.props.flightNumber != null && databaseId != null) {
+      if (flightNumber != null && databaseId != null) {
         const folderPath = this.getFolderPath();
         const pkPath = `${folderPath}/pass.pkpass`;
 
@@ -97,7 +98,7 @@ class WalletPassenger extends React.Component<PropsWithContext, State> {
     }
   };
 
-  render = () => {
+  render() {
     const onPress = Platform.select({
       ios: this.onPressIos,
       android: this.onPressAndroid,
@@ -106,9 +107,7 @@ class WalletPassenger extends React.Component<PropsWithContext, State> {
     return (
       <Touchable onPress={onPress} style={styles.row}>
         <React.Fragment>
-          <Translation
-            passThrough={idx(this.props.data, _ => _.passenger.fullName)}
-          />
+          <Translation passThrough={this.props.data.passenger?.fullName} />
           {Platform.select({
             android: this.state.isDownloaded ? (
               <TextIcon code="V" style={styles.icon} />
@@ -120,7 +119,7 @@ class WalletPassenger extends React.Component<PropsWithContext, State> {
         </React.Fragment>
       </Touchable>
     );
-  };
+  }
 }
 
 type Props = {|
diff --git a/app/MMB/src/scenes/tickets/boardingPassesPdf/BoardingPassPdfScreen.js b/app/MMB/src/scenes/tickets/boardingPassesPdf/BoardingPassPdfScreen.js
index 4d311a66..364e930c 100644
--- a/app/MMB/src/scenes/tickets/boardingPassesPdf/BoardingPassPdfScreen.js
+++ b/app/MMB/src/scenes/tickets/boardingPassesPdf/BoardingPassPdfScreen.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import Share from 'react-native-share';
 import { documentDir } from '@kiwicom/mobile-assets';
 import type { NavigationType } from '@kiwicom/mobile-navigation';
-import idx from 'idx';
 
 import BoardingPassesPdf from './BoardingPassPdf';
 import ShareButton from '../../../components/ShareButton';
@@ -44,11 +43,8 @@ type ShareButtonProps = {|
 |};
 
 export function BoardingPassShareButtonWithContext(props: ShareButtonProps) {
-  const boardingPassUrl = idx(
-    props,
-    _ => _.navigation.state.params.boardingPassUrl,
-  );
-  const flightNumber = idx(props, _ => _.navigation.state.params.flightNumber);
+  const boardingPassUrl = props.navigation?.state.params.boardingPassUrl;
+  const flightNumber = props.navigation?.state.params.flightNumber;
 
   if (boardingPassUrl == null || flightNumber == null) {
     return null;
diff --git a/app/MMB/src/scenes/timeline/Timeline.js b/app/MMB/src/scenes/timeline/Timeline.js
index c45bfe07..d22a1bea 100644
--- a/app/MMB/src/scenes/timeline/Timeline.js
+++ b/app/MMB/src/scenes/timeline/Timeline.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { PublicApiRenderer, graphql } from '@kiwicom/mobile-relay';
 import { DateFormatter, DateUtils } from '@kiwicom/mobile-localization';
 
@@ -105,7 +104,7 @@ function renderChildren(events: Events) {
   if (events) {
     const renderedEventsByDate = events.reduce((acc: Acc, curr: Event) => {
       const event = getValidTimelineEvent(curr);
-      const timestamp = idx(curr, _ => _.timestamp);
+      const timestamp = curr?.timestamp;
       if (!event || !timestamp) {
         return acc;
       }
@@ -143,8 +142,7 @@ function renderChildren(events: Events) {
               isLastDate && index === renderedEvents.length - 1
             ),
           };
-          const typename =
-            idx(renderedEvent, _ => _.props.data.__typename) || '';
+          const typename = renderedEvent?.props.data.__typename ?? '';
 
           return (
             <TimelineEventIconContext.Provider
@@ -168,7 +166,7 @@ function renderChildren(events: Events) {
 
 export default class Timeline extends React.Component<{||}> {
   renderInner = (renderProps: TimelineQueryResponse) => {
-    const events = idx(renderProps, _ => _.bookingTimeline.events);
+    const events = renderProps.bookingTimeline?.events;
     const children = renderChildren(events);
     return <SectionListScrollTo data={children} />;
   };
diff --git a/app/MMB/src/scenes/timeline/events/AirportArrivalTimelineEvent.js b/app/MMB/src/scenes/timeline/events/AirportArrivalTimelineEvent.js
index 49ec156e..70a4efa4 100644
--- a/app/MMB/src/scenes/timeline/events/AirportArrivalTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/AirportArrivalTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import React from 'react';
-import idx from 'idx';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
@@ -17,10 +16,10 @@ type Props = {|
   +data: ?AirportArrivalTimelineEventType,
 |};
 
-const AirportArrivalTimelineEvent = (props: Props) => {
-  const airport = idx(props, _ => _.data.location.airport.name);
-  const code = idx(props, _ => _.data.location.airport.locationId) || '';
-  const timestamp = idx(props, _ => _.data.timestamp);
+const AirportArrivalTimelineEvent = ({ data }: Props) => {
+  const airport = data?.location?.airport?.name;
+  const code = data?.location?.airport?.locationId ?? '';
+  const timestamp = data?.timestamp;
   return (
     <TimelineEventDateLocationContext.Provider value={{ highlightText: true }}>
       <TimelineEvent
diff --git a/app/MMB/src/scenes/timeline/events/ArrivalTimelineEvent.js b/app/MMB/src/scenes/timeline/events/ArrivalTimelineEvent.js
index 45bf2e92..28cfa311 100644
--- a/app/MMB/src/scenes/timeline/events/ArrivalTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/ArrivalTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
@@ -16,10 +15,10 @@ type Props = {|
   +data: ArrivalTimelineEventType,
 |};
 
-const ArrivalTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
-  const airport = idx(props, _ => _.data.location.airport.city.name);
-  const code = idx(props, _ => _.data.location.airport.locationId) || '';
+const ArrivalTimelineEvent = ({ data }: Props) => {
+  const timestamp = data.timestamp;
+  const airport = data.location?.airport?.city?.name;
+  const code = data.location?.airport?.locationId ?? '';
   return (
     <TimelineEventDateLocationContext.Provider value={{ highlightText: true }}>
       <TimelineEvent
diff --git a/app/MMB/src/scenes/timeline/events/BoardingTimelineEvent.js b/app/MMB/src/scenes/timeline/events/BoardingTimelineEvent.js
index db729589..77ac61a8 100644
--- a/app/MMB/src/scenes/timeline/events/BoardingTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/BoardingTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import React from 'react';
-import idx from 'idx';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
@@ -16,12 +15,13 @@ type Props = {|
   +data: ?BoardingTimelineEventType,
 |};
 
-const BoardingTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
-  const terminal = idx(props, _ => _.data.terminal);
-  const noteTranslationId = terminal
-    ? 'mmb.booking_timeline.event.gate_arrival.note_terminal'
-    : 'mmb.booking_timeline.event.gate_arrival.note';
+const BoardingTimelineEvent = ({ data }: Props) => {
+  const timestamp = data?.timestamp;
+  const terminal = data?.terminal;
+  const noteTranslationId =
+    terminal != null
+      ? 'mmb.booking_timeline.event.gate_arrival.note_terminal'
+      : 'mmb.booking_timeline.event.gate_arrival.note';
   return (
     <TimelineEvent
       timestamp={timestamp}
diff --git a/app/MMB/src/scenes/timeline/events/BookedFlightTimelineEvent.js b/app/MMB/src/scenes/timeline/events/BookedFlightTimelineEvent.js
index f43ac504..a2fb15ca 100644
--- a/app/MMB/src/scenes/timeline/events/BookedFlightTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/BookedFlightTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
@@ -15,9 +14,9 @@ type Props = {|
   +data: BookedFlightTimelineEventType,
 |};
 
-const BookedFlightTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
-  const destination = idx(props, _ => _.data.location.airport.city.name);
+const BookedFlightTimelineEvent = ({ data }: Props) => {
+  const timestamp = data.timestamp;
+  const destination = data.location?.airport?.city?.name;
   return (
     <TimelineEvent
       timestamp={timestamp}
diff --git a/app/MMB/src/scenes/timeline/events/CheckinClosingTimelineEvent.js b/app/MMB/src/scenes/timeline/events/CheckinClosingTimelineEvent.js
index e1370e5a..c470d8f8 100644
--- a/app/MMB/src/scenes/timeline/events/CheckinClosingTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/CheckinClosingTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { View } from 'react-native';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon, StyleSheet } from '@kiwicom/mobile-shared';
@@ -17,8 +16,8 @@ type Props = {|
   +data: CheckinClosingTimelineEventType,
 |};
 
-const CheckinClosingTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
+const CheckinClosingTimelineEvent = ({ data }: Props) => {
+  const timestamp = data.timestamp;
   return (
     <TimelineEvent
       timestamp={timestamp}
diff --git a/app/MMB/src/scenes/timeline/events/DepartureTimelineEvent/index.js b/app/MMB/src/scenes/timeline/events/DepartureTimelineEvent/index.js
index 1d8b8fd6..6df3b57e 100644
--- a/app/MMB/src/scenes/timeline/events/DepartureTimelineEvent/index.js
+++ b/app/MMB/src/scenes/timeline/events/DepartureTimelineEvent/index.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
@@ -17,24 +16,24 @@ type Props = {|
   +data: DeparturelineEventType,
 |};
 
-const DepartureTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
-  const destination = idx(props, _ => _.data.location.airport.city.name);
-  const duration = idx(props, _ => _.data.duration);
-  const airlineCode = idx(props, _ => _.data.airline.code);
-  const airlineName = idx(props, _ => _.data.airline.name);
-  const flightNumber = idx(props, _ => _.data.flightNumber);
+const DepartureTimelineEvent = ({ data }: Props) => {
+  const timestamp = data.timestamp;
+  const destination = data.location?.airport?.city?.name;
+  const duration = data.duration;
+  const airlineCode = data.airline?.code;
+  const airlineName = data.airline?.name;
+  const flightNumber = data.flightNumber;
 
   let flight = '';
-  if (airlineCode && flightNumber) {
+  if (airlineCode != null && flightNumber != null) {
     flight = `${airlineCode} ${flightNumber}`;
   }
-  if (flight.length > 9 && airlineCode) {
+  if (flight.length > 9 && airlineCode != null) {
     flight = airlineCode;
   }
 
   let flightIdentifier = '';
-  if (airlineCode && flightNumber) {
+  if (airlineCode != null && flightNumber != null) {
     flightIdentifier = `${airlineCode}${flightNumber}`;
   }
 
diff --git a/app/MMB/src/scenes/timeline/events/DownloadBoardingPassTimelineEvent.js b/app/MMB/src/scenes/timeline/events/DownloadBoardingPassTimelineEvent.js
index 1c39a1f5..5a0ebd85 100644
--- a/app/MMB/src/scenes/timeline/events/DownloadBoardingPassTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/DownloadBoardingPassTimelineEvent.js
@@ -1,7 +1,6 @@
 // @flow
 
 import * as React from 'react';
-import idx from 'idx';
 import { View } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { StyleSheet, TextButton, TextIcon } from '@kiwicom/mobile-shared';
@@ -29,26 +28,19 @@ class DownloadBoardingPassTimelineEvent extends React.Component<Props> {
   };
 
   handleOpenBoardingPass = () => {
+    const { data } = this.props;
     this.navigate('mmb.tickets.boarding_pass', {
-      boardingPassUrl: idx(
-        this.props,
-        _ => _.data.leg.boardingPass.boardingPassUrl,
-      ),
-      flightNumber: idx(this.props, _ => _.data.leg.boardingPass.flightNumber),
+      boardingPassUrl: data.leg?.boardingPass?.boardingPassUrl,
+      flightNumber: data.leg?.boardingPass?.flightNumber,
     });
   };
 
   render() {
-    const timestamp = idx(this.props, _ => _.data.timestamp);
-    const boardingPassUrl = idx(
-      this.props,
-      _ => _.data.leg.boardingPass.boardingPassUrl,
-    );
-    const origin = idx(this.props, _ => _.data.leg.departure.airport.city.name);
-    const destination = idx(
-      this.props,
-      _ => _.data.leg.arrival.airport.city.name,
-    );
+    const { data } = this.props;
+    const timestamp = data.timestamp;
+    const boardingPassUrl = data.leg?.boardingPass?.boardingPassUrl;
+    const origin = data.leg?.departure?.airport?.city?.name;
+    const destination = data.leg?.arrival?.airport?.city?.name;
     const disabled = !boardingPassUrl;
 
     let noteContent = null;
diff --git a/app/MMB/src/scenes/timeline/events/DownloadETicketTimelineEvent.js b/app/MMB/src/scenes/timeline/events/DownloadETicketTimelineEvent.js
index 8d2aeb50..545a5ef6 100644
--- a/app/MMB/src/scenes/timeline/events/DownloadETicketTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/DownloadETicketTimelineEvent.js
@@ -1,7 +1,6 @@
 // @flow
 
 import * as React from 'react';
-import idx from 'idx';
 import { View } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { StyleSheet, TextButton, TextIcon } from '@kiwicom/mobile-shared';
@@ -29,13 +28,14 @@ class DownloadETicketTimelineEvent extends React.Component<Props> {
 
   handleOpenETicket = () => {
     this.navigate('mmb.tickets.e_ticket', {
-      ticketUrl: idx(this.props.data, _ => _.ticketUrl),
+      ticketUrl: this.props.data.ticketUrl,
     });
   };
 
   render() {
-    const timestamp = idx(this.props, _ => _.data.timestamp);
-    const ticketUrl = idx(this.props, _ => _.data.ticketUrl);
+    const { data } = this.props;
+    const timestamp = data.timestamp;
+    const ticketUrl = data.ticketUrl;
     const disabled = !ticketUrl;
 
     const buttonTitle = disabled ? (
diff --git a/app/MMB/src/scenes/timeline/events/DownloadInvoiceTimelineEvent.js b/app/MMB/src/scenes/timeline/events/DownloadInvoiceTimelineEvent.js
index 0bfcc8cc..8cbc2e46 100644
--- a/app/MMB/src/scenes/timeline/events/DownloadInvoiceTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/DownloadInvoiceTimelineEvent.js
@@ -1,7 +1,6 @@
 // @flow
 
 import * as React from 'react';
-import idx from 'idx';
 import { View } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { StyleSheet, TextButton, TextIcon } from '@kiwicom/mobile-shared';
@@ -24,6 +23,8 @@ type Props = {|
   +navigation: NavigationType,
 |};
 
+type Legs = $PropertyType<DownloadInvoiceTimelineEventType, 'legs'>;
+
 function renderNote(
   disabled: boolean,
   numberPassengers: ?number,
@@ -48,15 +49,15 @@ function renderNote(
 }
 
 function renderLeg(leg) {
-  const departureCity = idx(leg, _ => _.departure.airport.city.name);
-  const arrivalCity = idx(leg, _ => _.arrival.airport.city.name);
+  const departureCity = leg?.departure?.airport?.city?.name;
+  const arrivalCity = leg?.arrival?.airport?.city?.name;
   if (departureCity && arrivalCity) {
     return departureCity + ' - ' + arrivalCity;
   }
   return '';
 }
 
-function renderLegs(legs) {
+function renderLegs(legs: Legs) {
   if (!legs) {
     return '';
   }
@@ -73,10 +74,11 @@ class DownloadInvoiceTimelineEvent extends React.Component<Props> {
   };
 
   render() {
-    const timestamp = idx(this.props, _ => _.data.timestamp);
-    const invoiceUrl = idx(this.props, _ => _.data.invoiceUrl);
-    const numberPassengers = idx(this.props, _ => _.data.numberPassengers);
-    const legs = idx(this.props, _ => _.data.legs);
+    const { data } = this.props;
+    const timestamp = data.timestamp;
+    const invoiceUrl = data.invoiceUrl;
+    const numberPassengers = data.numberPassengers;
+    const legs = data.legs;
     const disabled = !invoiceUrl;
 
     const route = renderLegs(legs);
diff --git a/app/MMB/src/scenes/timeline/events/EnterDetailsTimelineEvent.js b/app/MMB/src/scenes/timeline/events/EnterDetailsTimelineEvent.js
index c95f2488..9afb65ae 100644
--- a/app/MMB/src/scenes/timeline/events/EnterDetailsTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/EnterDetailsTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { View } from 'react-native';
 import { Translation, DateUtils } from '@kiwicom/mobile-localization';
 import { TextIcon, TextButton, StyleSheet } from '@kiwicom/mobile-shared';
@@ -28,7 +27,7 @@ class EnterDetailsTimelineEvent extends React.Component<Props> {
   };
 
   render() {
-    const timestamp = idx(this.props, _ => _.data.timestamp) || Date.now();
+    const timestamp = this.props.data.timestamp ?? Date.now();
     // Trick to have the event not show as past event
     const almostMidnight = DateUtils.latestTimeOfDay(new Date(timestamp));
     return (
diff --git a/app/MMB/src/scenes/timeline/events/LeaveForAirportTimelineEvent.js b/app/MMB/src/scenes/timeline/events/LeaveForAirportTimelineEvent.js
index 044c09aa..5d6efad2 100644
--- a/app/MMB/src/scenes/timeline/events/LeaveForAirportTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/LeaveForAirportTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
@@ -17,7 +16,7 @@ type Props = {|
 |};
 
 const LeaveForAirportTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
+  const timestamp = props.data.timestamp;
   return (
     <TimelineEvent
       timestamp={timestamp}
diff --git a/app/MMB/src/scenes/timeline/events/NavigateToTerminalTimelineEvent.js b/app/MMB/src/scenes/timeline/events/NavigateToTerminalTimelineEvent.js
index fe81ee52..e7202e11 100644
--- a/app/MMB/src/scenes/timeline/events/NavigateToTerminalTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/NavigateToTerminalTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
@@ -16,7 +15,7 @@ type Props = {|
 |};
 
 const NavigateToTerminalTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
+  const timestamp = props.data.timestamp;
   return (
     <TimelineEvent
       timestamp={timestamp}
diff --git a/app/MMB/src/scenes/timeline/events/NoMoreEditsTimelineEvent.js b/app/MMB/src/scenes/timeline/events/NoMoreEditsTimelineEvent.js
index 2d9b038e..c5714d84 100644
--- a/app/MMB/src/scenes/timeline/events/NoMoreEditsTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/NoMoreEditsTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
@@ -16,7 +15,7 @@ type Props = {|
 |};
 
 const NoMoreEditsTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
+  const timestamp = props.data.timestamp;
   return (
     <TimelineEvent
       displayTime={false}
diff --git a/app/MMB/src/scenes/timeline/events/TimeToCheckinTimelineEvent.js b/app/MMB/src/scenes/timeline/events/TimeToCheckinTimelineEvent.js
index 61b10f2a..dbfbae85 100644
--- a/app/MMB/src/scenes/timeline/events/TimeToCheckinTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/TimeToCheckinTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { View } from 'react-native';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon, StyleSheet } from '@kiwicom/mobile-shared';
@@ -18,7 +17,7 @@ type Props = {|
 |};
 
 const TimeToCheckinTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
+  const timestamp = props.data.timestamp;
   return (
     <TimelineEvent
       displayTime={false}
diff --git a/app/MMB/src/scenes/timeline/events/TransportFromAirportTimelineEvent.js b/app/MMB/src/scenes/timeline/events/TransportFromAirportTimelineEvent.js
index 5d6ae953..028aaf58 100644
--- a/app/MMB/src/scenes/timeline/events/TransportFromAirportTimelineEvent.js
+++ b/app/MMB/src/scenes/timeline/events/TransportFromAirportTimelineEvent.js
@@ -1,7 +1,6 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { Translation } from '@kiwicom/mobile-localization';
 import { TextIcon } from '@kiwicom/mobile-shared';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
@@ -17,7 +16,7 @@ type Props = {|
 |};
 
 const TransportFromAirportTimelineEvent = (props: Props) => {
-  const timestamp = idx(props, _ => _.data.timestamp);
+  const timestamp = props.data.timestamp;
   return (
     <TimelineEvent
       displayTime={false}
diff --git a/app/MMB/src/scenes/travelDocument/FillTravelDocument.js b/app/MMB/src/scenes/travelDocument/FillTravelDocument.js
index be15faa2..48118b6d 100644
--- a/app/MMB/src/scenes/travelDocument/FillTravelDocument.js
+++ b/app/MMB/src/scenes/travelDocument/FillTravelDocument.js
@@ -8,7 +8,6 @@ import {
   type RelayRefetchProp,
 } from '@kiwicom/mobile-relay';
 import { RefreshableScrollView, StyleSheet } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 
 import CityImage from '../../components/CityImage';
 import TripInfo from '../../components/header/TripInfo';
@@ -30,11 +29,12 @@ class FillTravelDocument extends React.Component<Props, State> {
   };
 
   refetch = () => {
+    const { data } = this.props;
     this.setState({ isRefreshing: true });
     this.props.relay.refetch(
       {
-        id: idx(this.props.data, _ => _.databaseId),
-        authToken: idx(this.props.data, _ => _.authToken),
+        id: data.databaseId,
+        authToken: data.authToken,
       },
       null,
       () => {
diff --git a/app/MMB/src/scenes/travelDocument/PassengerTravelDocumentMenuGroup.js b/app/MMB/src/scenes/travelDocument/PassengerTravelDocumentMenuGroup.js
index bb15b096..9dc20b68 100644
--- a/app/MMB/src/scenes/travelDocument/PassengerTravelDocumentMenuGroup.js
+++ b/app/MMB/src/scenes/travelDocument/PassengerTravelDocumentMenuGroup.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { createFragmentContainer, graphql } from '@kiwicom/mobile-relay';
 import { TitledMenuGroup } from '@kiwicom/mobile-navigation';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import TravelDocumentPassengerMenuItem from './menuItem/TravelDocumentPassengerMenuItem';
 import type { PassengerTravelDocumentMenuGroup as PassengersType } from './__generated__/PassengerTravelDocumentMenuGroup.graphql';
@@ -14,7 +13,7 @@ type Props = {|
 |};
 
 const PassengerTravelDocumentMenuGroup = (props: Props) => {
-  const passengers = idx(props.data, _ => _.passengers) || [];
+  const passengers = props.data.passengers ?? [];
   return (
     <TitledMenuGroup
       title={
@@ -24,7 +23,7 @@ const PassengerTravelDocumentMenuGroup = (props: Props) => {
       {passengers.map(passenger => (
         <TravelDocumentPassengerMenuItem
           data={passenger}
-          key={idx(passenger, _ => _.databaseId)}
+          key={passenger?.databaseId}
         />
       ))}
     </TitledMenuGroup>
diff --git a/app/MMB/src/scenes/travelDocument/form/expiryPicker/ExpiryDatePicker.js b/app/MMB/src/scenes/travelDocument/form/expiryPicker/ExpiryDatePicker.js
index a51f7800..2d7135e8 100644
--- a/app/MMB/src/scenes/travelDocument/form/expiryPicker/ExpiryDatePicker.js
+++ b/app/MMB/src/scenes/travelDocument/form/expiryPicker/ExpiryDatePicker.js
@@ -6,7 +6,6 @@ import { Text, StyleSheet, DatePicker, Switch } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import max from 'lodash/max';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import TravelDocumentFormContext from '../TravelDocumentFormContext';
@@ -21,9 +20,9 @@ type PropsWithContext = {|
 |};
 
 export const ExpiryDatePicker = (props: PropsWithContext) => {
-  const segments = idx(props, _ => _.data.legs) || [];
+  const segments = props.data.legs ?? [];
   const minDate = max(
-    segments.map(item => new Date(idx(item, _ => _.departure.time) || 0)),
+    segments.map(item => new Date(item?.departure?.time ?? 0)),
   );
   return (
     <React.Fragment>
diff --git a/app/MMB/src/scenes/travelDocument/menuItem/TravelDocumentPassengerMenuItem.js b/app/MMB/src/scenes/travelDocument/menuItem/TravelDocumentPassengerMenuItem.js
index 08fe5038..964116f6 100644
--- a/app/MMB/src/scenes/travelDocument/menuItem/TravelDocumentPassengerMenuItem.js
+++ b/app/MMB/src/scenes/travelDocument/menuItem/TravelDocumentPassengerMenuItem.js
@@ -1,7 +1,6 @@
 // @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { createFragmentContainer, graphql } from '@kiwicom/mobile-relay';
 import {
   type NavigationType,
@@ -18,15 +17,15 @@ type Props = {|
   +navigation: NavigationType,
 |};
 
-const TravelDocumentPassengerMenuItem = (props: Props) => {
-  const title = idx(props.data, _ => _.title) || '';
-  const fullName = idx(props.data, _ => _.fullName) || '';
-  const idNumber = idx(props.data, _ => _.travelDocument.idNumber) || null;
-  const expiryDate = idx(props.data, _ => _.travelDocument.expiration) || null;
-  const passengerId = idx(props.data, _ => _.databaseId) || null;
+const TravelDocumentPassengerMenuItem = ({ data, navigation }: Props) => {
+  const title = data.title ?? '';
+  const fullName = data.fullName ?? '';
+  const idNumber = data.travelDocument?.idNumber ?? null;
+  const expiryDate = data.travelDocument?.expiration ?? null;
+  const passengerId = data.databaseId ?? null;
 
   function onPress() {
-    props.navigation.navigate('TravelDocumentModalScreen', {
+    navigation.navigate('TravelDocumentModalScreen', {
       title,
       fullName,
       passengerId,
@@ -35,7 +34,7 @@ const TravelDocumentPassengerMenuItem = (props: Props) => {
 
   return (
     <PassengerMenuItem
-      passengerFullName={idx(props.data, _ => _.fullName) || ''}
+      passengerFullName={data.fullName ?? ''}
       onPress={onPress}
       disabled={idNumber !== null}
       passengerSubtitle={
diff --git a/app/MMB/src/scenes/tripOverview/Timeline.js b/app/MMB/src/scenes/tripOverview/Timeline.js
index 6d6dc27e..90bd99a0 100644
--- a/app/MMB/src/scenes/tripOverview/Timeline.js
+++ b/app/MMB/src/scenes/tripOverview/Timeline.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { View } from 'react-native';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { type AlertTranslationType } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 import { StyleSheet } from '@kiwicom/mobile-shared';
 
 import TripOverviewContext, { type BookingType } from './TripOverviewContext';
@@ -36,16 +35,13 @@ class Timeline extends React.Component<PropsWithContext> {
 
   departureDifferentFromPreviousArrival(trip, index) {
     if (index > 0) {
-      const trips = idx(this.props, _ => _.data) || [];
-      const arrivalPreviousTrip = idx(trips, _ => _[index - 1].arrival);
-      const departure = idx(trip, _ => _.departure);
-      const arrivalLocationId =
-        idx(arrivalPreviousTrip, _ => _.airport.locationId) || '';
-      const departureLocationId =
-        idx(departure, _ => _.airport.locationId) || '';
-      const arrivalCityName =
-        idx(arrivalPreviousTrip, _ => _.airport.city.name) || '';
-      const departureCityName = idx(departure, _ => _.airport.city.name) || '';
+      const trips = this.props.data ?? [];
+      const arrivalPreviousTrip = trips[index - 1].arrival;
+      const departure = trip.departure;
+      const arrivalLocationId = arrivalPreviousTrip?.airport?.locationId ?? '';
+      const departureLocationId = departure?.airport?.locationId ?? '';
+      const arrivalCityName = arrivalPreviousTrip?.airport?.city?.name ?? '';
+      const departureCityName = departure?.airport?.city?.name ?? '';
 
       if (arrivalLocationId !== departureLocationId) {
         const warning = {
@@ -57,7 +53,7 @@ class Timeline extends React.Component<PropsWithContext> {
             },
           },
           timelineTitle: {
-            localTime: idx(departure, _ => _.localTime),
+            localTime: departure?.localTime,
             iataCode: departureLocationId,
           },
         };
@@ -67,13 +63,13 @@ class Timeline extends React.Component<PropsWithContext> {
   }
 
   lastArrivalDifferentFromFirstDeparture() {
-    const trips = idx(this.props, _ => _.data) || [];
-    const arrival = idx(trips, _ => _[trips.length - 1].arrival);
-    const departure = idx(trips, _ => _[0].departure);
-    const arrivalLocationId = idx(arrival, _ => _.airport.locationId) || '';
-    const departureLocationId = idx(departure, _ => _.airport.locationId) || '';
-    const arrivalCityName = idx(arrival, _ => _.airport.city.name) || '';
-    const departureCityName = idx(departure, _ => _.airport.city.name) || '';
+    const trips = this.props.data ?? [];
+    const arrival = trips[trips.length - 1].arrival;
+    const departure = trips[0].departure;
+    const arrivalLocationId = arrival?.airport?.locationId ?? '';
+    const departureLocationId = departure?.airport?.locationId ?? '';
+    const arrivalCityName = arrival?.airport?.city?.name ?? '';
+    const departureCityName = departure?.airport?.city?.name ?? '';
     if (arrivalLocationId !== departureLocationId) {
       const warning = {
         text: {
@@ -85,7 +81,7 @@ class Timeline extends React.Component<PropsWithContext> {
           },
         },
         timelineTitle: {
-          localTime: idx(arrival, _ => _.localTime),
+          localTime: arrival?.localTime,
           iataCode: arrivalLocationId,
         },
       };
@@ -94,7 +90,7 @@ class Timeline extends React.Component<PropsWithContext> {
   }
 
   addWarnings() {
-    const trips = idx(this.props, _ => _.data) || [];
+    const trips = this.props.data ?? [];
     trips.forEach((trip, index) => {
       this.departureDifferentFromPreviousArrival(trip, index);
     });
@@ -104,13 +100,13 @@ class Timeline extends React.Component<PropsWithContext> {
   }
 
   render() {
-    const trips = idx(this.props, _ => _.data) || [];
+    const trips = this.props.data ?? [];
 
     let legsCounted = 0;
     return (
       <React.Fragment>
         {trips.map((trip, index) => {
-          const legs = idx(trip, _ => _.legs) || [];
+          const legs = trip.legs ?? [];
           const legsCount = legsCounted;
           legsCounted += legs.length;
           return (
diff --git a/app/MMB/src/scenes/tripOverview/TimelineDeparture.js b/app/MMB/src/scenes/tripOverview/TimelineDeparture.js
index 92c65600..a26f6959 100644
--- a/app/MMB/src/scenes/tripOverview/TimelineDeparture.js
+++ b/app/MMB/src/scenes/tripOverview/TimelineDeparture.js
@@ -10,7 +10,6 @@ import {
   TextIcon,
   Duration,
 } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import TimelineRow from './TimelineRow';
@@ -29,18 +28,18 @@ type Props = {|
 function TimelineDeparture(props: Props) {
   const legInfo = props.legInfo;
 
-  const flightNumber = idx(legInfo, _ => _.flightNumber);
-  const airlineLogoUrl = idx(legInfo, _ => _.airline.logoUrl);
-  const airlineName = idx(legInfo, _ => _.airline.name);
-  const airlineIata = idx(legInfo, _ => _.airline.code);
+  const flightNumber = legInfo.flightNumber;
+  const airlineLogoUrl = legInfo.airline?.logoUrl;
+  const airlineName = legInfo.airline?.name;
+  const airlineIata = legInfo.airline?.code;
 
-  const operatingAirline = idx(legInfo, _ => _.operatingAirline.name) || '';
-  const operatingAirlineIata = idx(legInfo, _ => _.operatingAirline.iata);
+  const operatingAirline = legInfo.operatingAirline?.name ?? '';
+  const operatingAirlineIata = legInfo.operatingAirline?.iata;
 
-  const flightModel = idx(legInfo, _ => _.vehicle.model) || '';
-  const manufacturer = idx(legInfo, _ => _.vehicle.manufacturer) || '';
+  const flightModel = legInfo.vehicle?.model ?? '';
+  const manufacturer = legInfo.vehicle?.manufacturer ?? '';
 
-  const duration = idx(legInfo, _ => _.duration);
+  const duration = legInfo.duration;
   return (
     <React.Fragment>
       <TimelineTitle data={props.routeStop} />
diff --git a/app/MMB/src/scenes/tripOverview/TimelineTerminal.js b/app/MMB/src/scenes/tripOverview/TimelineTerminal.js
index 32ee0289..c182d342 100644
--- a/app/MMB/src/scenes/tripOverview/TimelineTerminal.js
+++ b/app/MMB/src/scenes/tripOverview/TimelineTerminal.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { TextIcon } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import TimelineRow from './TimelineRow';
 import type { TimelineTerminal as TimelineTerminalType } from './__generated__/TimelineTerminal.graphql';
@@ -14,17 +13,17 @@ type Props = {|
   +data: TimelineTerminalType,
 |};
 
-const TimelineTerminal = (props: Props) => {
-  const terminal = idx(props.data, _ => _.terminal);
-  const iata = idx(props.data, _ => _.airport.code) || '';
-  const city = idx(props.data, _ => _.airport.city.name) || '';
+const TimelineTerminal = ({ data, icon }: Props) => {
+  const terminal = data.terminal;
+  const iata = data.airport?.code ?? '';
+  const city = data.airport?.city?.name ?? '';
 
   if (terminal == null) {
     return null;
   }
   return (
     <TimelineRow
-      icon={props.icon}
+      icon={icon}
       value={
         <Translation
           id="mmb.flight_overview.timeline.terminal"
diff --git a/app/MMB/src/scenes/tripOverview/TimelineTitle.js b/app/MMB/src/scenes/tripOverview/TimelineTitle.js
index 195fced1..0e97d4b4 100644
--- a/app/MMB/src/scenes/tripOverview/TimelineTitle.js
+++ b/app/MMB/src/scenes/tripOverview/TimelineTitle.js
@@ -10,7 +10,6 @@ import {
   type AlertTranslationType,
 } from '@kiwicom/mobile-localization';
 import { StyleSheet, Text, Touchable, TextIcon } from '@kiwicom/mobile-shared';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 import memoize from 'memoize-one';
 
@@ -41,10 +40,10 @@ class TimelineTitle extends React.Component<PropsWithContext> {
   );
 
   onPress = () => {
-    const data = this.props.data;
-    const localTime = idx(data, _ => _.localTime);
-    const iataCode = idx(data, _ => _.airport.locationId);
-    const warnings = idx(this.props, _ => _.warnings) || [];
+    const { data } = this.props;
+    const localTime = data.localTime;
+    const iataCode = data.airport?.locationId;
+    const warnings = this.props.warnings ?? [];
 
     const warning = this.getWarning(warnings, localTime, iataCode);
     if (warning) {
@@ -53,12 +52,11 @@ class TimelineTitle extends React.Component<PropsWithContext> {
   };
 
   render() {
-    const data = this.props.data;
-    const localTime = idx(data, _ => _.localTime);
-    const cityName = idx(data, _ => _.airport.city.name);
-    const iataCode = idx(data, _ => _.airport.locationId);
-    const warnings = idx(this.props, _ => _.warnings) || [];
-    const warning = this.getWarning(warnings, localTime, iataCode);
+    const { data, warnings } = this.props;
+    const localTime = data.localTime;
+    const cityName = data.airport?.city?.name;
+    const iataCode = data.airport?.locationId;
+    const warning = this.getWarning(warnings ?? [], localTime, iataCode);
 
     const warningStyle = warning != null ? styleSheet.warningStyle : null;
     return (
diff --git a/app/MMB/src/scenes/tripOverview/TimelineTrip.js b/app/MMB/src/scenes/tripOverview/TimelineTrip.js
index 3d5ff018..36e4e84e 100644
--- a/app/MMB/src/scenes/tripOverview/TimelineTrip.js
+++ b/app/MMB/src/scenes/tripOverview/TimelineTrip.js
@@ -1,8 +1,7 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 import { Color } from '@kiwicom/mobile-shared';
 import last from 'lodash/last';
 
@@ -17,7 +16,7 @@ type Props = {|
 |};
 
 function TimelineTrip(props: Props) {
-  const legs = idx(props.data, _ => _.legs) || [];
+  const legs = props.data.legs ?? [];
 
   return (
     <React.Fragment>
@@ -49,7 +48,7 @@ function TimelineTrip(props: Props) {
               shouldDrawDashedLine={index + 1 !== legs.length}
               shouldDrawSolidLine={false}
               color={arrivalColorCode}
-              data={idx(legs, _ => _[index + 1]) || null} // Guarantee field is on next leg
+              data={legs[index + 1] ?? null} // Guarantee field is on next leg
             >
               <TimelineArrival data={leg.arrival} />
             </TimelineLegWrapper>
diff --git a/app/MMB/src/scenes/tripOverview/TripStopOver.js b/app/MMB/src/scenes/tripOverview/TripStopOver.js
index 31c56943..6b2a4a6e 100644
--- a/app/MMB/src/scenes/tripOverview/TripStopOver.js
+++ b/app/MMB/src/scenes/tripOverview/TripStopOver.js
@@ -16,7 +16,6 @@ import {
   type NavigationType,
 } from '@kiwicom/mobile-navigation';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import type { TripStopOver as TripStopOverType } from './__generated__/TripStopOver.graphql';
 
@@ -30,10 +29,10 @@ class TripStopOver extends React.Component<Props> {
     this.props.navigation.navigate('GuaranteeScreen');
   };
 
-  render = () => {
-    const isKiwiGuarantee =
-      idx(this.props, _ => _.data.guarantee) === 'KIWICOM';
-    const duration = idx(this.props, _ => _.data.stopoverDuration);
+  render() {
+    const { data } = this.props;
+    const isKiwiGuarantee = data.guarantee === 'KIWICOM';
+    const duration = data.stopoverDuration;
     return (
       <View style={styles.container}>
         <Duration
@@ -54,7 +53,7 @@ class TripStopOver extends React.Component<Props> {
         )}
       </View>
     );
-  };
+  }
 }
 
 const styles = StyleSheet.create({
diff --git a/app/MMB/src/scenes/tripOverview/tripTitle/MulticityName.js b/app/MMB/src/scenes/tripOverview/tripTitle/MulticityName.js
index 2f637114..c71960df 100644
--- a/app/MMB/src/scenes/tripOverview/tripTitle/MulticityName.js
+++ b/app/MMB/src/scenes/tripOverview/tripTitle/MulticityName.js
@@ -3,7 +3,6 @@
 import * as React from 'react';
 import { Translation } from '@kiwicom/mobile-localization';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import type { MulticityName as MulticityNameType } from './__generated__/MulticityName.graphql';
 import TripTitleText from './TripTitleText';
@@ -13,7 +12,7 @@ type Props = {|
 |};
 
 const MulticityName = (props: Props) => {
-  const cityName = idx(props, _ => _.data.airport.city.name);
+  const cityName = props.data.airport?.city?.name;
   if (cityName == null) {
     return null;
   }
diff --git a/app/MMB/src/scenes/tripOverview/tripTitle/TripTitle.js b/app/MMB/src/scenes/tripOverview/tripTitle/TripTitle.js
index efdd4c4d..9a426c25 100644
--- a/app/MMB/src/scenes/tripOverview/tripTitle/TripTitle.js
+++ b/app/MMB/src/scenes/tripOverview/tripTitle/TripTitle.js
@@ -5,7 +5,6 @@ import { View } from 'react-native';
 import { StyleSheet, Duration } from '@kiwicom/mobile-shared';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import TripOverviewContext, { type BookingType } from '../TripOverviewContext';
 import type { TripTitle as TripTitleType } from './__generated__/TripTitle.graphql';
@@ -31,7 +30,7 @@ const TripTitle = ({ type, data, index }: PropsWithContext) => {
       <View style={styles.durationContainer}>
         <Duration
           showIcon={false}
-          duration={idx(data, _ => _.duration)}
+          duration={data.duration}
           style={styles.durationText}
         />
       </View>
diff --git a/app/MMB/src/scenes/tripServices/CarRentalMenuItem.js b/app/MMB/src/scenes/tripServices/CarRentalMenuItem.js
index 21affc30..9b135c2a 100644
--- a/app/MMB/src/scenes/tripServices/CarRentalMenuItem.js
+++ b/app/MMB/src/scenes/tripServices/CarRentalMenuItem.js
@@ -7,7 +7,6 @@ import { TextIcon } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
 import { MenuItem } from '@kiwicom/mobile-navigation';
 import querystring from 'querystring';
-import idx from 'idx';
 
 import LocationsPopup from './LocationsPopup';
 import LocationPopupButton from './LocationPopupButton';
@@ -52,12 +51,11 @@ export class CarRentalMenuItem extends React.Component<Props, State> {
   };
 
   openPopup = () => {
-    const relevantCities =
-      idx(this.props, _ => _.data.carRental.relevantCities) || [];
+    const relevantCities = this.props.data.carRental?.relevantCities ?? [];
 
     if (relevantCities.length === 1) {
       // do not open the modal for only one whitelabel URL (open it directly)
-      const whitelabelURL = idx(relevantCities, _ => _[0].whitelabelURL);
+      const whitelabelURL = relevantCities[0]?.whitelabelURL;
       this.openLink(whitelabelURL || '');
       return;
     }
@@ -73,15 +71,15 @@ export class CarRentalMenuItem extends React.Component<Props, State> {
     });
   };
 
-  render = () => {
-    const carRental = idx(this.props, _ => _.data.carRental);
+  render() {
+    const carRental = this.props.data.carRental;
 
     if (!carRental) {
       // no car rental service available for this trip (do not render the menu item at all)
       return null;
     }
 
-    const relevantCities = idx(carRental, _ => _.relevantCities) || [];
+    const relevantCities = carRental.relevantCities ?? [];
 
     return (
       <React.Fragment>
@@ -113,7 +111,7 @@ export class CarRentalMenuItem extends React.Component<Props, State> {
         />
       </React.Fragment>
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tripServices/GeneralServicesMenuGroup.js b/app/MMB/src/scenes/tripServices/GeneralServicesMenuGroup.js
index 3bfaabfd..dcbaf071 100644
--- a/app/MMB/src/scenes/tripServices/GeneralServicesMenuGroup.js
+++ b/app/MMB/src/scenes/tripServices/GeneralServicesMenuGroup.js
@@ -13,7 +13,6 @@ import {
   type NavigationType,
   type RouteNamesType,
 } from '@kiwicom/mobile-navigation';
-import idx from 'idx';
 
 import InsuranceMenuItemContainer from './insuranceMenuItem/InsuranceMenuItemContainer';
 import type { GeneralServicesMenuGroup as GeneralServicesMenuGroupType } from './__generated__/GeneralServicesMenuGroup.graphql';
@@ -33,11 +32,11 @@ class GeneralServicesMenuGroup extends React.Component<Props> {
     this.navigate('mmb.trip_services.insurance');
   };
 
-  isPastBooking = () => idx(this.props.data, _ => _.isPastBooking);
-  isStatusConfirmed = () => idx(this.props.data, _ => _.status) === 'CONFIRMED';
+  isPastBooking = () => this.props.data.isPastBooking;
+  isStatusConfirmed = () => this.props.data.status === 'CONFIRMED';
 
   noUSPassengers = () => {
-    const passengers = idx(this.props.data, _ => _.passengers);
+    const passengers = this.props.data.passengers;
     return (
       passengers != null &&
       passengers.every(passenger => {
diff --git a/app/MMB/src/scenes/tripServices/LocationPopupButton.js b/app/MMB/src/scenes/tripServices/LocationPopupButton.js
index 7a9072ae..767af6a7 100644
--- a/app/MMB/src/scenes/tripServices/LocationPopupButton.js
+++ b/app/MMB/src/scenes/tripServices/LocationPopupButton.js
@@ -6,7 +6,6 @@ import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Touchable, StyleSheet, Text } from '@kiwicom/mobile-shared';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import CountryFlag from '../../components/CountryFlag';
 import type { LocationPopupButton as LocationPopupButtonType } from './__generated__/LocationPopupButton.graphql';
@@ -30,11 +29,10 @@ class LocationPopupButton extends React.Component<Props> {
     this.props.onPress(this.props.whitelabelURL);
   };
 
-  render = () => {
-    const cityName = idx(this.props, _ => _.data.city.name);
-    const locationId = idx(this.props, _ => _.data.locationId);
-    const date = idx(this.props, _ => _.date);
-    const displayDate = idx(this.props, _ => _.displayDate);
+  render() {
+    const { data, date, displayDate } = this.props;
+    const cityName = data.city?.name;
+    const locationId = data.locationId;
 
     return (
       <Touchable onPress={this.openWhitelabel} style={styleSheet.wrapper}>
@@ -59,7 +57,7 @@ class LocationPopupButton extends React.Component<Props> {
         </React.Fragment>
       </Touchable>
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tripServices/LoungeMenuItem.js b/app/MMB/src/scenes/tripServices/LoungeMenuItem.js
index 44e08d29..b6dab65c 100644
--- a/app/MMB/src/scenes/tripServices/LoungeMenuItem.js
+++ b/app/MMB/src/scenes/tripServices/LoungeMenuItem.js
@@ -7,7 +7,6 @@ import { TextIcon } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
 import { MenuItem } from '@kiwicom/mobile-navigation';
 import querystring from 'querystring';
-import idx from 'idx';
 
 import LocationsPopup from './LocationsPopup';
 import LocationPopupButton from './LocationPopupButton';
@@ -50,12 +49,11 @@ class LoungeMenuItem extends React.Component<Props, State> {
   };
 
   openPopup = () => {
-    const relevantAirports =
-      idx(this.props, _ => _.data.lounge.relevantAirports) || [];
+    const relevantAirports = this.props.data.lounge?.relevantAirports ?? [];
 
     if (relevantAirports.length === 1) {
       // do not open the modal for only one whitelabel URL (open it directly)
-      const whitelabelURL = idx(relevantAirports, _ => _[0].whitelabelURL);
+      const whitelabelURL = relevantAirports[0]?.whitelabelURL;
       this.openLoungeLink(whitelabelURL || '');
       return;
     }
@@ -72,14 +70,14 @@ class LoungeMenuItem extends React.Component<Props, State> {
   };
 
   render = () => {
-    const lounge = idx(this.props, _ => _.data.lounge);
+    const lounge = this.props.data.lounge;
 
     if (!lounge) {
       // no lounges available on this trip (do not render the menu item at all)
       return null;
     }
 
-    const relevantAirports = idx(lounge, _ => _.relevantAirports) || [];
+    const relevantAirports = lounge.relevantAirports ?? [];
 
     return (
       <React.Fragment>
diff --git a/app/MMB/src/scenes/tripServices/ParkingMenuItem.js b/app/MMB/src/scenes/tripServices/ParkingMenuItem.js
index 73f46810..945a1866 100644
--- a/app/MMB/src/scenes/tripServices/ParkingMenuItem.js
+++ b/app/MMB/src/scenes/tripServices/ParkingMenuItem.js
@@ -7,7 +7,6 @@ import { TextIcon } from '@kiwicom/mobile-shared';
 import { Translation, DeviceInfo } from '@kiwicom/mobile-localization';
 import { MenuItem } from '@kiwicom/mobile-navigation';
 import querystring from 'querystring';
-import idx from 'idx';
 
 import type { ParkingMenuItem as ParkingMenuItemType } from './__generated__/ParkingMenuItem.graphql';
 
@@ -18,8 +17,7 @@ type Props = {|
 
 class ParkingMenuItem extends React.Component<Props> {
   openLink = () => {
-    const whitelabelURL =
-      idx(this.props, _ => _.data.parking.whitelabelURL) || '';
+    const whitelabelURL = this.props.data.parking?.whitelabelURL ?? '';
 
     this.props.onOpenWebview(
       whitelabelURL +
@@ -35,8 +33,8 @@ class ParkingMenuItem extends React.Component<Props> {
     );
   };
 
-  render = () => {
-    const parking = idx(this.props, _ => _.data.parking);
+  render() {
+    const { parking } = this.props.data;
 
     if (!parking) {
       // no parking available for this trip (do not render the menu item at all)
@@ -50,7 +48,7 @@ class ParkingMenuItem extends React.Component<Props> {
         icon={<TextIcon code="&#xe03e;" />}
       />
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tripServices/TripServiceRefreshContainer.js b/app/MMB/src/scenes/tripServices/TripServiceRefreshContainer.js
index 911d07d4..1f541cba 100644
--- a/app/MMB/src/scenes/tripServices/TripServiceRefreshContainer.js
+++ b/app/MMB/src/scenes/tripServices/TripServiceRefreshContainer.js
@@ -7,7 +7,6 @@ import {
   createRefetchContainer,
   type RelayRefetchProp,
 } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import GeneralServicesMenuGroup from './GeneralServicesMenuGroup';
 import LocalServicesMenuGroup from './LocalServicesMenuGroup';
@@ -28,11 +27,12 @@ class TripServiceRefreshContainer extends React.Component<Props, State> {
   };
 
   refetch = () => {
+    const { data } = this.props;
     this.setState({ isRefreshing: true });
     this.props.relay.refetch(
       {
-        id: idx(this.props.data, _ => _.databaseId),
-        authToken: idx(this.props.data, _ => _.authToken),
+        id: data.databaseId,
+        authToken: data.authToken,
       },
       null,
       () => {
@@ -44,20 +44,22 @@ class TripServiceRefreshContainer extends React.Component<Props, State> {
     );
   };
 
-  render = () => (
-    <RefreshableScrollView
-      refreshing={this.state.isRefreshing}
-      onRefresh={this.refetch}
-    >
-      {/* TODO: ordered services - how does it work here? */}
+  render() {
+    return (
+      <RefreshableScrollView
+        refreshing={this.state.isRefreshing}
+        onRefresh={this.refetch}
+      >
+        {/* TODO: ordered services - how does it work here? */}
 
-      <GeneralServicesMenuGroup data={this.props.data} />
+        <GeneralServicesMenuGroup data={this.props.data} />
 
-      <LocalServicesMenuGroup
-        data={idx(this.props.data, _ => _.availableWhitelabeledServices)}
-      />
-    </RefreshableScrollView>
-  );
+        <LocalServicesMenuGroup
+          data={this.props.data.availableWhitelabeledServices}
+        />
+      </RefreshableScrollView>
+    );
+  }
 }
 
 export default createRefetchContainer(
diff --git a/app/MMB/src/scenes/tripServices/hotelMenuItem/HotelMenuItem.js b/app/MMB/src/scenes/tripServices/hotelMenuItem/HotelMenuItem.js
index 6abd2aed..98325680 100644
--- a/app/MMB/src/scenes/tripServices/hotelMenuItem/HotelMenuItem.js
+++ b/app/MMB/src/scenes/tripServices/hotelMenuItem/HotelMenuItem.js
@@ -18,7 +18,6 @@ import {
   type NavigationType,
 } from '@kiwicom/mobile-navigation';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import LocationItem from './LocationItem';
 import LocationsPopup from '../LocationsPopup';
@@ -77,7 +76,7 @@ export class HotelMenuItem extends React.Component<PropsWithContext, State> {
 
   openHotelsModal = ({ cityId, cityName, checkin, checkout }: HotelData) => {
     const roomsConfiguration =
-      idx(this.props.data, _ => _.hotel.roomsConfiguration) || null;
+      this.props.data.hotel?.roomsConfiguration ?? null;
     const sanitizedDates = this.sanitizeDates({ checkin, checkout });
 
     this.props.navigation.navigate('MMBHotelsStack', {
@@ -98,14 +97,13 @@ export class HotelMenuItem extends React.Component<PropsWithContext, State> {
   };
 
   menuItemOnPress = () => {
-    const relevantLocations =
-      idx(this.props.data, _ => _.hotel.relevantLocations) || [];
+    const relevantLocations = this.props.data.hotel?.relevantLocations ?? [];
 
     if (relevantLocations.length === 1) {
-      const cityId = idx(relevantLocations, _ => _[0].hotelCity.id) || '';
-      const cityName = idx(relevantLocations, _ => _[0].hotelCity.name) || '';
-      const checkin = idx(relevantLocations, _ => _[0].checkin) || null;
-      const checkout = idx(relevantLocations, _ => _[0].checkout) || null;
+      const cityId = relevantLocations[0]?.hotelCity?.id ?? '';
+      const cityName = relevantLocations[0]?.hotelCity?.name ?? '';
+      const checkin = relevantLocations[0]?.checkin ?? null;
+      const checkout = relevantLocations[0]?.checkout ?? null;
       this.openHotelsModal({
         cityId,
         cityName,
@@ -128,9 +126,8 @@ export class HotelMenuItem extends React.Component<PropsWithContext, State> {
     }));
   };
 
-  render = () => {
-    const relevantLocations =
-      idx(this.props.data, _ => _.hotel.relevantLocations) || [];
+  render() {
+    const relevantLocations = this.props.data.hotel?.relevantLocations ?? [];
 
     return (
       <React.Fragment>
@@ -139,10 +136,10 @@ export class HotelMenuItem extends React.Component<PropsWithContext, State> {
           onClose={this.togglePopup}
         >
           {relevantLocations.map((relevantLocation, index) => {
+            const key = relevantLocation?.location?.id ?? '';
             return (
               <LocationItem
-                key={`${idx(relevantLocation, _ => _.location.id) ||
-                  ''}-${index}`}
+                key={`${key}-${index}`}
                 data={relevantLocation}
                 onPress={this.onLocationPress}
               />
@@ -156,7 +153,7 @@ export class HotelMenuItem extends React.Component<PropsWithContext, State> {
         />
       </React.Fragment>
     );
-  };
+  }
 }
 
 type Props = {|
diff --git a/app/MMB/src/scenes/tripServices/hotelMenuItem/LocationItem.js b/app/MMB/src/scenes/tripServices/hotelMenuItem/LocationItem.js
index 65a85d8b..0a28ddbd 100644
--- a/app/MMB/src/scenes/tripServices/hotelMenuItem/LocationItem.js
+++ b/app/MMB/src/scenes/tripServices/hotelMenuItem/LocationItem.js
@@ -2,7 +2,6 @@
 
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 
 import LocationPopupButton from '../LocationPopupButton';
 import type { LocationItem as LocationItemType } from './__generated__/LocationItem.graphql';
@@ -15,10 +14,11 @@ type Props = {|
 
 class LocationItem extends React.Component<Props> {
   onPress = () => {
-    const cityId = idx(this.props.data, _ => _.hotelCity.id) || '';
-    const cityName = idx(this.props.data, _ => _.hotelCity.name) || '';
-    const checkin = idx(this.props.data, _ => _.checkin) || null;
-    const checkout = idx(this.props.data, _ => _.checkout) || null;
+    const { data } = this.props;
+    const cityId = data.hotelCity?.id ?? '';
+    const cityName = data.hotelCity?.name ?? '';
+    const checkin = data.checkin ?? null;
+    const checkout = data.checkout ?? null;
 
     this.props.onPress({
       cityId,
@@ -28,8 +28,8 @@ class LocationItem extends React.Component<Props> {
     });
   };
 
-  render = () => {
-    const location = idx(this.props.data, _ => _.location);
+  render() {
+    const location = this.props.data.location;
     if (!location) {
       return null;
     }
@@ -41,7 +41,7 @@ class LocationItem extends React.Component<Props> {
         displayIata={false}
       />
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tripServices/insurance/InsuranceTermsPdfScene.js b/app/MMB/src/scenes/tripServices/insurance/InsuranceTermsPdfScene.js
index a82e83d2..03f648a6 100644
--- a/app/MMB/src/scenes/tripServices/insurance/InsuranceTermsPdfScene.js
+++ b/app/MMB/src/scenes/tripServices/insurance/InsuranceTermsPdfScene.js
@@ -1,18 +1,17 @@
 // @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { PublicApiRenderer, graphql } from '@kiwicom/mobile-relay';
 import PdfViewer from '@kiwicom/mobile-pdf';
 
 import type { InsuranceTermsPdfSceneQueryResponse as Props } from './__generated__/InsuranceTermsPdfSceneQuery.graphql';
 
 const renderPdfViewer = (props: Props) => {
-  const documents = idx(props, _ => _.allDocuments.edges) || [];
+  const documents = props.allDocuments?.edges ?? [];
   const insuranceTermsDocument = documents.find(
-    document => idx(document, _ => _.node.__typename) === 'InsuranceTerms',
+    document => document?.node?.__typename === 'InsuranceTerms',
   );
-  const node = idx(insuranceTermsDocument, _ => _.node) || {};
+  const node = insuranceTermsDocument?.node ?? {};
   const uri = node.url || '';
   return <PdfViewer uri={uri} />;
 };
diff --git a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/DestinationImage.js b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/DestinationImage.js
index 501b1d02..c882fbe8 100644
--- a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/DestinationImage.js
+++ b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/DestinationImage.js
@@ -4,7 +4,6 @@ import * as React from 'react';
 import { View } from 'react-native';
 import { StyleSheet, NetworkImage } from '@kiwicom/mobile-shared';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import idx from 'idx';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 
 import type { DestinationImage as DestinationImageType } from './__generated__/DestinationImage.graphql';
@@ -17,7 +16,7 @@ const DestinationImage = (props: Props) => (
   <View style={styles.container}>
     <NetworkImage
       source={{
-        uri: idx(props.data, _ => _.destinationImageUrl),
+        uri: props.data.destinationImageUrl,
       }}
       style={styles.image}
       resizeMode="cover"
diff --git a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewPassengerMenuGroup.js b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewPassengerMenuGroup.js
index 1acee8c5..8d26e1c1 100644
--- a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewPassengerMenuGroup.js
+++ b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewPassengerMenuGroup.js
@@ -3,7 +3,6 @@
 import * as React from 'react';
 import { TitledMenuGroup } from '@kiwicom/mobile-navigation';
 import { Translation } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import PassengerInsuranceMenuItem from './menuItem/PassengerInsuranceMenuItem';
 
@@ -22,13 +21,13 @@ type Props = {|
 |};
 
 const InsuranceOverviewPassengerMenuGroup = (props: Props) => {
-  const passengers = idx(props, _ => _.passengers) || [];
+  const passengers = props.passengers ?? [];
   return (
     <TitledMenuGroup title={<Translation id="mmb.trip_services.order.pax" />}>
       {passengers.map(passenger => (
         <PassengerInsuranceMenuItem
           passenger={passenger}
-          key={idx(passenger, _ => _.databaseId)}
+          key={passenger.databaseId}
         />
       ))}
     </TitledMenuGroup>
diff --git a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewSceneContext.js b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewSceneContext.js
index 7372194b..0e678a5e 100644
--- a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewSceneContext.js
+++ b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/InsuranceOverviewSceneContext.js
@@ -1,7 +1,6 @@
 // @flow
 
 import * as React from 'react';
-import idx from 'idx';
 
 const defaultState = {
   passengers: [],
@@ -35,7 +34,7 @@ type Passenger = {|
 
 type InsurancePrice = {|
   +insuranceType: InsuranceType,
-  +price: {|
+  +price?: {|
     +amount: number,
     +currency: string,
   |},
@@ -104,12 +103,8 @@ class Provider extends React.Component<Props, State> {
       }));
       // TODO test whether all currencies are the same and do something if not?
       const currency =
-        idx(
-          insurancePrices.find(insurancePrice =>
-            idx(insurancePrice, _ => _.price.currency),
-          ),
-          _ => _.price.currency,
-        ) || '';
+        insurancePrices.find(insurancePrice => insurancePrice.price?.currency)
+          ?.price?.currency ?? '';
       this.setState({
         passengers,
         insurancePrices,
@@ -177,21 +172,15 @@ class Provider extends React.Component<Props, State> {
         let originalPrice = 0;
         if (change.to !== 'NONE') {
           newPrice =
-            idx(
-              this.state.insurancePrices.find(
-                insurancePrice => insurancePrice.insuranceType === change.to,
-              ),
-              _ => _.price.amount,
-            ) || 0;
+            this.state.insurancePrices.find(
+              insurancePrice => insurancePrice.insuranceType === change.to,
+            )?.price?.amount ?? 0;
         }
         if (change.from !== 'NONE') {
           originalPrice =
-            idx(
-              this.state.insurancePrices.find(
-                insurancePrice => insurancePrice.insuranceType === change.from,
-              ),
-              _ => _.price.amount,
-            ) || 0;
+            this.state.insurancePrices.find(
+              insurancePrice => insurancePrice.insuranceType === change.from,
+            )?.price?.amount ?? 0;
         }
         return newPrice - originalPrice;
       })
diff --git a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/menuItem/PassengerInsuranceMenuItem.js b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/menuItem/PassengerInsuranceMenuItem.js
index 95d81de4..c68c0d68 100644
--- a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/menuItem/PassengerInsuranceMenuItem.js
+++ b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/menuItem/PassengerInsuranceMenuItem.js
@@ -1,7 +1,6 @@
 // @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import {
   type NavigationType,
   withNavigation,
@@ -26,9 +25,9 @@ type Props = {|
 |};
 
 const PassengerInsuranceMenuItem = (props: Props) => {
-  const passenger = idx(props, _ => _.passenger);
-  const fullName = idx(passenger, _ => _.fullName) || '';
-  const insuranceType = idx(passenger, _ => _.insuranceType);
+  const passenger = props.passenger;
+  const fullName = passenger.fullName ?? '';
+  const insuranceType = passenger.insuranceType;
 
   function onPress() {
     props.navigation.navigate('mmb.trip_services.insurance.selection', {
diff --git a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/orderSummary/InsuranceRow.js b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/orderSummary/InsuranceRow.js
index 4228d5e5..777728e5 100644
--- a/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/orderSummary/InsuranceRow.js
+++ b/app/MMB/src/scenes/tripServices/insurance/insuranceOverviewScene/orderSummary/InsuranceRow.js
@@ -2,7 +2,6 @@
 
 import * as React from 'react';
 import { View } from 'react-native';
-import idx from 'idx';
 import { StyleSheet, Text, Price } from '@kiwicom/mobile-shared';
 import { Translation } from '@kiwicom/mobile-localization';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
@@ -65,26 +64,24 @@ export function InsuranceRow(props: Props) {
       change => change.to === props.insuranceType && change.from !== change.to,
     )
     .map(change => {
-      const priceFrom = idx(
-        insurancePrices.find(
-          insurancePrice => insurancePrice.insuranceType === change.from,
-        ),
-        _ => _.price,
-      );
-      const priceTo = idx(
-        insurancePrices.find(
-          insurancePrice => insurancePrice.insuranceType === change.to,
-        ),
-        _ => _.price,
-      );
+      const priceFrom = insurancePrices.find(
+        insurancePrice => insurancePrice.insuranceType === change.from,
+      )?.price;
+      const priceTo = insurancePrices.find(
+        insurancePrice => insurancePrice.insuranceType === change.to,
+      )?.price;
+
       if (priceFrom && priceTo && priceFrom.currency === priceTo.currency) {
         currency = priceFrom.currency;
+
         return priceTo.amount - priceFrom.amount;
       } else if (priceFrom && priceTo === null) {
         currency = priceFrom.currency;
+
         return -priceFrom.amount;
       } else if (priceFrom === null && priceTo) {
         currency = priceTo.currency;
+
         return priceTo.amount;
       }
       return 0;
diff --git a/app/MMB/src/scenes/tripServices/insurance/insuranceSelectionScene/variantButtons/VariantButtons.js b/app/MMB/src/scenes/tripServices/insurance/insuranceSelectionScene/variantButtons/VariantButtons.js
index 615853ff..dbd29ac6 100644
--- a/app/MMB/src/scenes/tripServices/insurance/insuranceSelectionScene/variantButtons/VariantButtons.js
+++ b/app/MMB/src/scenes/tripServices/insurance/insuranceSelectionScene/variantButtons/VariantButtons.js
@@ -1,7 +1,6 @@
 // @flow
 
 import * as React from 'react';
-import idx from 'idx';
 import { TextIcon, StyleSheet } from '@kiwicom/mobile-shared';
 import { defaultTokens } from '@kiwicom/mobile-orbit';
 import { Translation } from '@kiwicom/mobile-localization';
@@ -26,14 +25,10 @@ type Props = {|
 
 class VariantButtons extends React.Component<Props> {
   getPriceOfType = (insuranceType: InsuranceType): ?PriceType => {
-    const insurancePrices = idx(this.props, _ => _.data.insurancePrices) || [];
-    return idx(
-      insurancePrices.find(
-        insurancePrice =>
-          idx(insurancePrice, _ => _.insuranceType) === insuranceType,
-      ),
-      _ => _.price,
-    );
+    const insurancePrices = this.props.data.insurancePrices ?? [];
+    return insurancePrices.find(
+      insurancePrice => insurancePrice?.insuranceType === insuranceType,
+    )?.price;
   };
 
   selectTravelPlus = () => this.props.selectVariant('TRAVEL_PLUS');
diff --git a/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItem.js b/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItem.js
index cb2fc432..9c37a20f 100644
--- a/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItem.js
+++ b/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItem.js
@@ -1,7 +1,6 @@
 // @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { TextIcon } from '@kiwicom/mobile-shared';
 import { Translation, DateUtils, Alert } from '@kiwicom/mobile-localization';
 import { MenuItem } from '@kiwicom/mobile-navigation';
@@ -16,7 +15,7 @@ type Props = {|
 
 export class InsuranceMenuItem extends React.Component<Props> {
   isMoreThan48HoursBefore = () => {
-    const departureTime = idx(this.props.data, _ => _.departure.time);
+    const departureTime = this.props.data.departure?.time;
     return (
       departureTime &&
       DateUtils.diffInHours(new Date(departureTime), DateUtils.getUTCNow()) > 48
diff --git a/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItemContainer.js b/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItemContainer.js
index f025719a..89c85ed9 100644
--- a/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItemContainer.js
+++ b/app/MMB/src/scenes/tripServices/insuranceMenuItem/InsuranceMenuItemContainer.js
@@ -1,7 +1,6 @@
 // @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
 import { createFragmentContainer, graphql } from '@kiwicom/mobile-relay';
 
 import type { InsuranceMenuItemContainer as InsuranceMenuItemContainerType } from './__generated__/InsuranceMenuItemContainer.graphql';
@@ -13,11 +12,11 @@ type Props = {|
 |};
 
 export class InsuranceMenuItemContainer extends React.Component<Props> {
-  isPastBooking = () => idx(this.props.data, _ => _.isPastBooking);
-  isStatusConfirmed = () => idx(this.props.data, _ => _.status) === 'CONFIRMED';
+  isPastBooking = () => this.props.data.isPastBooking;
+  isStatusConfirmed = () => this.props.data.status === 'CONFIRMED';
 
   noUSPassengers = () => {
-    const passengers = idx(this.props.data, _ => _.passengers);
+    const passengers = this.props.data.passengers;
     return (
       passengers != null &&
       passengers.every(passenger => {
@@ -31,19 +30,20 @@ export class InsuranceMenuItemContainer extends React.Component<Props> {
     !this.isPastBooking() && this.isStatusConfirmed() && this.noUSPassengers();
 
   getData = () => {
-    switch (this.props.data.__typename) {
+    const { data } = this.props;
+    switch (data.__typename) {
       case 'BookingOneWay':
-        return idx(this.props.data, _ => _.trip);
+        return data.trip;
       case 'BookingReturn':
-        return idx(this.props.data, _ => _.outbound);
+        return data.outbound;
       case 'BookingMulticity':
-        return idx(this.props.data, _ => _.trips[0]);
+        return data.trips?.[0];
       default:
         return null;
     }
   };
 
-  render = () => {
+  render() {
     if (!this.displayMenuItem()) {
       return null;
     }
@@ -54,7 +54,7 @@ export class InsuranceMenuItemContainer extends React.Component<Props> {
         data={this.getData()}
       />
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportLocationItem.js b/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportLocationItem.js
index 28b9830b..43a3eeda 100644
--- a/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportLocationItem.js
+++ b/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportLocationItem.js
@@ -3,7 +3,6 @@
 import * as React from 'react';
 import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
 import { Alert } from '@kiwicom/mobile-localization';
-import idx from 'idx';
 
 import LocationPopupButton from '../LocationPopupButton';
 import type { LocationItem as LocationItemType } from './__generated__/TransportLocationItem.graphql';
@@ -21,10 +20,10 @@ type Props = {|
 
 class LocationItem extends React.Component<Props> {
   onPress = () => {
-    const lat = idx(this.props.data, _ => _.location.lat);
-    const lng = idx(this.props.data, _ => _.location.lng);
+    const { data, whitelabelURL } = this.props;
+    const { lat, lng } = data.location;
+
     if (lat != null && lng != null) {
-      const whitelabelURL = this.props.whitelabelURL;
       const date = this.props.date;
       this.props.onPress({ location: { lat, lng }, whitelabelURL, date });
     } else {
@@ -32,8 +31,8 @@ class LocationItem extends React.Component<Props> {
     }
   };
 
-  render = () => {
-    const location = idx(this.props.data, _ => _.location);
+  render() {
+    const { location } = this.props.data;
     if (!location) {
       return null;
     }
@@ -48,7 +47,7 @@ class LocationItem extends React.Component<Props> {
         displayDate={this.props.displayDate}
       />
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportationMenuItem.js b/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportationMenuItem.js
index 6f7742bc..2f92ac0c 100644
--- a/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportationMenuItem.js
+++ b/app/MMB/src/scenes/tripServices/transportationMenuItem/TransportationMenuItem.js
@@ -9,7 +9,6 @@ import {
   withNavigation,
   type NavigationType,
 } from '@kiwicom/mobile-navigation';
-import idx from 'idx';
 
 import LocationsPopup from '../LocationsPopup';
 import TransportLocationItem from './TransportLocationItem';
@@ -46,13 +45,12 @@ class TransportationMenuItem extends React.Component<Props, State> {
 
   openPopup = () => {
     const relevantLocations =
-      idx(this.props, _ => _.data.transportation.relevantLocations) || [];
+      this.props.data.transportation?.relevantLocations ?? [];
     if (relevantLocations.length === 1) {
       // do not open the modal for only one whitelabel URL (open it directly)
-      const whitelabelURL =
-        idx(relevantLocations, _ => _[0].whitelabelURL) || '';
+      const whitelabelURL = relevantLocations[0]?.whitelabelURL ?? '';
 
-      const location = idx(relevantLocations, _ => _[0].location.location);
+      const location = relevantLocations[0]?.location?.location;
 
       if (location != null) {
         this.openTransportationMap({ location, whitelabelURL });
@@ -81,14 +79,14 @@ class TransportationMenuItem extends React.Component<Props, State> {
     });
   };
 
-  render = () => {
-    const transport = idx(this.props, _ => _.data.transportation);
+  render() {
+    const transport = this.props.data.transportation;
 
     if (!transport) {
       return null;
     }
 
-    const relevantLocations = idx(transport, _ => _.relevantLocations) || [];
+    const relevantLocations = transport.relevantLocations ?? [];
 
     return (
       <React.Fragment>
@@ -101,7 +99,7 @@ class TransportationMenuItem extends React.Component<Props, State> {
               return null;
             }
             const { whitelabelURL, location, date } = relevantLocation;
-            const currentCityName = idx(location, _ => _.city.name);
+            const currentCityName = location?.city?.name;
             return (
               <TransportLocationItem
                 key={whitelabelURL}
@@ -109,10 +107,7 @@ class TransportationMenuItem extends React.Component<Props, State> {
                 date={date}
                 displayDate={
                   relevantLocations.filter(_relevantLocation => {
-                    const cityName = idx(
-                      _relevantLocation,
-                      _ => _.location.city.name,
-                    );
+                    const cityName = _relevantLocation?.location?.city?.name;
                     return (
                       cityName != null &&
                       currentCityName != null &&
@@ -137,7 +132,7 @@ class TransportationMenuItem extends React.Component<Props, State> {
         />
       </React.Fragment>
     );
-  };
+  }
 }
 
 export default createFragmentContainer(
diff --git a/babel.config.js b/babel.config.js
index ad227412..8b1290e4 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -15,7 +15,6 @@ module.exports = (api /* :API */) => {
   ];
   const plugins = [
     '@babel/plugin-transform-runtime',
-    'babel-plugin-idx',
     ['relay', { schema: 'app/schema.graphql' }],
   ];
 
diff --git a/package.json b/package.json
index ee838311..5439583f 100644
--- a/package.json
+++ b/package.json
@@ -39,7 +39,6 @@
     "babel-core": "^7.0.0-bridge.0",
     "babel-eslint": "^8.2.5",
     "babel-jest": "^23.6.0",
-    "babel-plugin-idx": "^2.4.0",
     "detox": "^9.0.5",
     "eslint": "^5.8.0",
     "eslint-config-prettier": "^3.1.0",
diff --git a/packages/localization/src/Translation.js b/packages/localization/src/Translation.js
index ee889510..2605b183 100644
--- a/packages/localization/src/Translation.js
+++ b/packages/localization/src/Translation.js
@@ -71,6 +71,9 @@ export default class Translation extends React.Component<Props> {
     if (this.props.id === undefined) {
       // ID prop is missing so let's assume it's "pass through" translation
       // (property passThrough may be undefined)
+      if (this.props.passThrough == null) {
+        return null;
+      }
       return (
         <Text style={containerStyle}>
           {/* $FlowExpectedError: we do not allow to use 'string' in the 'Text' components but translations are exceptions. */}
diff --git a/packages/shared/package.json b/packages/shared/package.json
index f40b9574..54dc133b 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -7,7 +7,6 @@
     "@kiwicom/mobile-accessibility": "^0",
     "@kiwicom/mobile-localization": "^0",
     "@ptomasroos/react-native-multi-slider": "^1.0.0",
-    "idx": "^2.4.0",
     "querystring": "^0.2.0",
     "react-native-image-progress": "^1.1.1",
     "react-native-maps": "0.22.0",
diff --git a/yarn.lock b/yarn.lock
index 1b4e158d..958d4814 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1336,11 +1336,6 @@ babel-plugin-dotenv@0.1.1:
   dependencies:
     dotenv "^2.0.0"
 
-babel-plugin-idx@^2.4.0:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-idx/-/babel-plugin-idx-2.4.0.tgz#5d144eb337fb22c4bf1ff75cb2e1c051a76a0323"
-  integrity sha512-+rEYZgSCLh0suJDlgZ64isSLhDW7Qxu6AnUMGhl/mW1kyYvfwqLqsDmgj3e5QXH0oX7A4Hq2x0BgqdU8tiuo5A==
-
 babel-plugin-istanbul@^4.1.6:
   version "4.1.6"
   resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
@@ -3934,11 +3929,6 @@ iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-idx@^2.4.0:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/idx/-/idx-2.4.0.tgz#e89e6650c889a44bf889f79d47f40fe09b4eeaa3"
-  integrity sha512-FnV6fXF1/cXvam/OXAz98v3GbhQVws+ecMEVLxyQ1aXgK2nooTkTDqex5Lks84wiCsS1So6QtwwCYT6H+vIKkw==
-
 ignore-walk@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"


Test patch:
diff --git a/packages/localization/src/__tests__/__snapshots__/Translation.test.js.snap b/packages/localization/src/__tests__/__snapshots__/Translation.test.js.snap
index c464a2b2..40c5e4df 100644
--- a/packages/localization/src/__tests__/__snapshots__/Translation.test.js.snap
+++ b/packages/localization/src/__tests__/__snapshots__/Translation.test.js.snap
@@ -1,10 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`works with optional pass through parameter 1`] = `
-<Text>
-  undefined
-</Text>
-`;
+exports[`works with optional pass through parameter 1`] = `null`;
 
 exports[`works with pass through translations 1`] = `
 <Text>