Repository: kiwicom/mobile
Pull request #1157 (2018-09-28 08:03:13)

Hotels: Refactor hotel list and map wrappers


Patch:
diff --git a/app/hotels/src/allHotels/AllHotelsSearchList.js b/app/hotels/src/allHotels/AllHotelsSearchList.js
index c067d7f7..391503fd 100644
--- a/app/hotels/src/allHotels/AllHotelsSearchList.js
+++ b/app/hotels/src/allHotels/AllHotelsSearchList.js
@@ -1,195 +1,54 @@
-// @flow
+// @flow strict
 
 import * as React from 'react';
-import idx from 'idx';
-import { ScrollView } from 'react-native';
-import {
-  Logger,
-  GeneralError,
-  StyleSheet,
-  Device,
-} from '@kiwicom/mobile-shared';
-import {
-  createPaginationContainer,
-  graphql,
-  type RelayPaginationProp,
-} from '@kiwicom/mobile-relay';
+import { GeneralError } from '@kiwicom/mobile-shared';
+import { createFragmentContainer, graphql } from '@kiwicom/mobile-relay';
 import { Translation } from '@kiwicom/mobile-localization';
+import idx from 'idx';
 
-import HotelsSearchContext from '../HotelsSearchContext';
 import AllHotelsSearchRow from './AllHotelsSearchRow';
-import LoadMoreButton from './LoadMoreButton';
-import type { AllHotelsSearchList as AllHotelsSearchListProps } from './__generated__/AllHotelsSearchList_data.graphql';
-
-type PropsWithContext = {
-  ...Props,
-  +setCurrentSearchStats: (currentSearchStats: Object) => void,
-};
+import type { AllHotelsSearchList as AllHotelsSearchListProps } from './__generated__/AllHotelsSearchList.graphql';
 
-type State = {|
-  isLoading: boolean,
+type Props = {|
+  +openSingleHotel: (id: string) => void,
+  +data: AllHotelsSearchListProps,
 |};
 
-export class AllHotelsSearchList extends React.Component<
-  PropsWithContext,
-  State,
-> {
-  state = {
-    isLoading: false,
-  };
-
-  componentDidMount = () => {
-    Logger.ancillaryDisplayed(Logger.Type.ANCILLARY_STEP_RESULTS);
-
-    const priceMax = idx(
-      this.props,
-      _ => _.data.allAvailableHotels.stats.maxPrice,
-    );
-    const priceMin = idx(
-      this.props,
-      _ => _.data.allAvailableHotels.stats.minPrice,
-    );
-
-    if (priceMax != null && priceMin != null) {
-      this.props.setCurrentSearchStats({
-        priceMax,
-        priceMin,
-      });
-    }
-  };
-
-  loadMore = () => {
-    if (this.props.relay.hasMore() && !this.props.relay.isLoading()) {
-      this.setState(
-        {
-          isLoading: true,
-        },
-        () => {
-          this.props.relay.loadMore(50, () => {
-            this.setState({
-              isLoading: false,
-            });
-          });
-        },
-      );
-    }
-  };
-
-  render = () => {
-    // Note: it's not possible to use FlatList here because it's wrapped
-    // with ScrollView and it causes performance issues.
-
-    const hotels = idx(this.props, _ => _.data.allAvailableHotels.edges) || [];
-
-    if (hotels.length === 0) {
-      return (
-        <GeneralError
-          errorMessage={
-            <Translation id="hotels_search.all_hotels_search_list.no_hotels_found" />
-          }
-        />
-      );
-    }
+export const AllHotelsSearchList = (props: Props) => {
+  const hotels = props.data || [];
 
+  if (hotels.length === 0) {
     return (
-      <ScrollView contentContainerStyle={styles.content}>
-        {hotels.map(hotel => (
-          <AllHotelsSearchRow
-            key={hotel.node.id}
-            data={hotel.node}
-            openSingleHotel={this.props.openSingleHotel}
-          />
-        ))}
-        {this.props.relay.hasMore() && (
-          <LoadMoreButton
-            isLoading={this.state.isLoading}
-            onPress={this.loadMore}
-          />
-        )}
-      </ScrollView>
+      <GeneralError
+        errorMessage={
+          <Translation id="hotels_search.all_hotels_search_list.no_hotels_found" />
+        }
+      />
     );
-  };
-}
+  }
 
-type Props = {|
-  openSingleHotel: (id: string) => void,
-  data: AllHotelsSearchListProps,
-  relay: RelayPaginationProp,
-|};
-
-function AllHotelsSearchListWithContext(props: Props) {
   return (
-    <HotelsSearchContext.Consumer>
-      {({ actions }) => (
-        <AllHotelsSearchList
-          {...props}
-          setCurrentSearchStats={actions.setCurrentSearchStats}
+    <React.Fragment>
+      {hotels.map(hotel => (
+        <AllHotelsSearchRow
+          key={idx(hotel, _ => _.node.id)}
+          data={hotel.node}
+          openSingleHotel={props.openSingleHotel}
         />
-      )}
-    </HotelsSearchContext.Consumer>
+      ))}
+    </React.Fragment>
   );
-}
-
-const styles = StyleSheet.create({
-  content: {
-    paddingBottom: Device.isIPhoneX ? 80 : 44,
-  },
-});
+};
 
-export default createPaginationContainer(
-  AllHotelsSearchListWithContext,
-  {
-    data: graphql`
-      fragment AllHotelsSearchList_data on RootQuery {
-        allAvailableHotels(
-          search: $search
-          filter: $filter
-          options: $options
-          first: $first
-          after: $after
-        ) @connection(key: "AllHotels_allAvailableHotels") {
-          pageInfo {
-            hasNextPage
-            hasPreviousPage
-            startCursor
-            endCursor
-          }
-          edges {
-            node {
-              id
-              ...AllHotelsSearchRow
-            }
-            ...MapView
-          }
-          stats {
-            maxPrice
-            minPrice
-          }
-        }
-      }
-    `,
-  },
-  {
-    getVariables(props, { count, cursor }, fragmentVariables) {
-      const { search, filter, options } = fragmentVariables;
-      return {
-        first: count,
-        after: cursor,
-        search,
-        filter,
-        options,
-      };
-    },
-    query: graphql`
-      query AllHotelsSearchListQuery(
-        $search: HotelsSearchInput!
-        $filter: HotelsFilterInput!
-        $options: AvailableHotelOptionsInput
-        $after: String
-        $first: Int
-      ) {
-        ...AllHotelsSearchList_data
+export default createFragmentContainer(
+  AllHotelsSearchList,
+  graphql`
+    fragment AllHotelsSearchList on HotelAvailabilityEdge @relay(plural: true) {
+      node {
+        id
+        ...AllHotelsSearchRow
       }
-    `,
-  },
+      ...MapView
+    }
+  `,
 );
diff --git a/app/hotels/src/allHotels/RenderSearchResults.js b/app/hotels/src/allHotels/RenderSearchResults.js
index dff9953a..2d8f81c9 100644
--- a/app/hotels/src/allHotels/RenderSearchResults.js
+++ b/app/hotels/src/allHotels/RenderSearchResults.js
@@ -1,9 +1,19 @@
 // @flow strict
 
 import * as React from 'react';
-import { Animated } from 'react-native';
-import { graphql, createFragmentContainer } from '@kiwicom/mobile-relay';
-import { StyleSheet, AdaptableLayout } from '@kiwicom/mobile-shared';
+import { Animated, ScrollView } from 'react-native';
+import {
+  graphql,
+  createPaginationContainer,
+  type RelayPaginationProp,
+} from '@kiwicom/mobile-relay';
+import {
+  StyleSheet,
+  AdaptableLayout,
+  Logger,
+  Device,
+} from '@kiwicom/mobile-shared';
+import idx from 'idx';
 
 import MapScreen from '../map/allHotels/MapScreen';
 import AllHotelsSearchList from './AllHotelsSearchList';
@@ -11,109 +21,243 @@ import type { RenderSearchResults as RenderResultsType } from './__generated__/R
 import SearchResultsContext, {
   type ResultType,
 } from '../navigation/allHotels/SearchResultsContext';
+import HotelsSearchContext from '../HotelsSearchContext';
+import LoadMoreButton from './LoadMoreButton';
+import type { CurrentSearchStats } from '../filter/CurrentSearchStatsType';
 
 type PropsWithContext = {|
   ...Props,
   +show: ResultType,
+  +setCurrentSearchStats: (currentSearchStats: CurrentSearchStats) => void,
 |};
 
-const topValue = 1000;
-const lowValue = -100;
+type State = {|
+  isLoading: boolean,
+|};
+
+export const topValue = 1000;
+export const lowValue = -100;
 
-class RenderSearchResults extends React.Component<PropsWithContext> {
-  mapAnimation;
-  listAnimation;
+export class RenderSearchResults extends React.Component<
+  PropsWithContext,
+  State,
+> {
+  mapAnimation: Animated.Value;
+  listAnimation: Animated.Value;
 
-  constructor(props) {
+  constructor(props: PropsWithContext) {
     super(props);
 
     const showList = props.show === 'list';
     this.mapAnimation = new Animated.Value(showList ? topValue : 0);
     this.listAnimation = new Animated.Value(showList ? 0 : lowValue);
+
+    this.state = {
+      isLoading: false,
+    };
   }
 
+  componentDidMount = () => {
+    Logger.ancillaryDisplayed(Logger.Type.ANCILLARY_STEP_RESULTS);
+
+    const priceMax = idx(
+      this.props,
+      _ => _.data.allAvailableHotels.stats.maxPrice,
+    );
+    const priceMin = idx(
+      this.props,
+      _ => _.data.allAvailableHotels.stats.minPrice,
+    );
+
+    if (priceMax != null && priceMin != null) {
+      this.props.setCurrentSearchStats({
+        priceMax,
+        priceMin,
+      });
+    }
+  };
+
   componentDidUpdate = (prevProps: PropsWithContext) => {
     if (prevProps.show === 'list' && this.props.show === 'map') {
-      Animated.parallel([
-        Animated.timing(this.mapAnimation, {
-          toValue: 0,
-          duration: 500,
-          useNativeDriver: true,
-        }),
-        Animated.timing(this.listAnimation, {
-          toValue: lowValue,
-          duration: 500,
-          useNativeDriver: true,
-        }),
-      ]).start();
+      this.animateToMap();
     }
     if (prevProps.show === 'map' && this.props.show === 'list') {
-      Animated.parallel([
-        Animated.timing(this.mapAnimation, {
-          toValue: topValue,
-          duration: 500,
-          useNativeDriver: true,
-        }),
-        Animated.timing(this.listAnimation, {
-          toValue: 0,
-          duration: 500,
-          useNativeDriver: true,
-        }),
-      ]).start();
+      this.animateToList();
     }
   };
-  render = () => (
-    <React.Fragment>
-      <Animated.View
-        style={{
-          ...StyleSheet.absoluteFillObject,
-          top: 56,
-          transform: [{ translateY: this.listAnimation }],
-        }}
-      >
-        <AllHotelsSearchList
-          data={this.props.data}
-          openSingleHotel={this.props.openSingleHotel}
-        />
-      </Animated.View>
-      <AdaptableLayout
-        renderOnNarrow={
-          <Animated.View
-            style={{
-              ...StyleSheet.absoluteFillObject,
-              top: 56,
-              transform: [{ translateY: this.mapAnimation }],
-            }}
-          >
-            <MapScreen
-              data={this.props.data}
-              onOpenSingleHotel={this.props.openSingleHotel}
+
+  animateToMap = () => {
+    Animated.parallel([
+      Animated.timing(this.mapAnimation, {
+        toValue: 0,
+        duration: 500,
+        useNativeDriver: true,
+      }),
+      Animated.timing(this.listAnimation, {
+        toValue: lowValue,
+        duration: 500,
+        useNativeDriver: true,
+      }),
+    ]).start();
+  };
+
+  animateToList = () => {
+    Animated.parallel([
+      Animated.timing(this.mapAnimation, {
+        toValue: topValue,
+        duration: 500,
+        useNativeDriver: true,
+      }),
+      Animated.timing(this.listAnimation, {
+        toValue: 0,
+        duration: 500,
+        useNativeDriver: true,
+      }),
+    ]).start();
+  };
+
+  loadMore = () => {
+    if (this.props.relay.hasMore() && !this.props.relay.isLoading()) {
+      this.setState(
+        {
+          isLoading: true,
+        },
+        () => {
+          this.props.relay.loadMore(50, () => {
+            this.setState({
+              isLoading: false,
+            });
+          });
+        },
+      );
+    }
+  };
+
+  render = () => {
+    const data = idx(this.props.data, _ => _.allAvailableHotels.edges);
+    return (
+      <React.Fragment>
+        <Animated.View
+          style={{
+            ...StyleSheet.absoluteFillObject,
+            top: 56,
+            transform: [{ translateY: this.listAnimation }],
+          }}
+        >
+          {/*  Note: it's not possible to use FlatList here because it's wrapped with ScrollView and it causes performance issues.*/}
+          <ScrollView contentContainerStyle={styles.content}>
+            <AllHotelsSearchList
+              data={data}
+              openSingleHotel={this.props.openSingleHotel}
             />
-          </Animated.View>
-        }
-      />
-    </React.Fragment>
-  );
+            {this.props.relay.hasMore() && (
+              <LoadMoreButton
+                isLoading={this.state.isLoading}
+                onPress={this.loadMore}
+              />
+            )}
+          </ScrollView>
+        </Animated.View>
+        <AdaptableLayout
+          renderOnNarrow={
+            <Animated.View
+              style={{
+                ...StyleSheet.absoluteFillObject,
+                top: 56,
+                transform: [{ translateY: this.mapAnimation }],
+              }}
+            >
+              <MapScreen
+                data={data}
+                onOpenSingleHotel={this.props.openSingleHotel}
+              />
+            </Animated.View>
+          }
+        />
+      </React.Fragment>
+    );
+  };
 }
+
 type Props = {|
   +data: RenderResultsType,
   +openSingleHotel: () => void,
+  +relay: RelayPaginationProp,
 |};
 
 const RenderSearchResultsWithContext = (props: Props) => (
-  <SearchResultsContext.Consumer>
-    {({ show }) => {
-      return <RenderSearchResults {...props} show={show} />;
-    }}
-  </SearchResultsContext.Consumer>
+  <HotelsSearchContext.Consumer>
+    {({ actions }) => (
+      <SearchResultsContext.Consumer>
+        {({ show }) => {
+          return (
+            <RenderSearchResults
+              {...props}
+              show={show}
+              setCurrentSearchStats={actions.setCurrentSearchStats}
+            />
+          );
+        }}
+      </SearchResultsContext.Consumer>
+    )}
+  </HotelsSearchContext.Consumer>
 );
 
-export default createFragmentContainer(
+const styles = StyleSheet.create({
+  content: {
+    paddingBottom: Device.isIPhoneX ? 80 : 44,
+  },
+});
+
+export default createPaginationContainer(
   RenderSearchResultsWithContext,
   graphql`
     fragment RenderSearchResults on RootQuery {
-      ...AllHotelsSearchList_data
-      ...MapScreen
+      allAvailableHotels(
+        search: $search
+        filter: $filter
+        options: $options
+        first: $first
+        after: $after
+      ) @connection(key: "AllHotels_allAvailableHotels") {
+        pageInfo {
+          hasNextPage
+          hasPreviousPage
+          startCursor
+          endCursor
+        }
+        stats {
+          maxPrice
+          minPrice
+        }
+        edges {
+          ...AllHotelsSearchList
+          ...MapScreen
+        }
+      }
     }
   `,
+  {
+    getVariables(props, { count, cursor }, fragmentVariables) {
+      const { search, filter, options } = fragmentVariables;
+      return {
+        first: count,
+        after: cursor,
+        search,
+        filter,
+        options,
+      };
+    },
+    query: graphql`
+      query RenderSearchResultsQuery(
+        $search: HotelsSearchInput!
+        $filter: HotelsFilterInput!
+        $options: AvailableHotelOptionsInput
+        $after: String
+        $first: Int
+      ) {
+        ...RenderSearchResults
+      }
+    `,
+  },
 );
diff --git a/app/hotels/src/allHotels/__generated__/AllHotelsSearchList.graphql.js b/app/hotels/src/allHotels/__generated__/AllHotelsSearchList.graphql.js
new file mode 100644
index 00000000..f587d310
--- /dev/null
+++ b/app/hotels/src/allHotels/__generated__/AllHotelsSearchList.graphql.js
@@ -0,0 +1,67 @@
+/**
+ * @flow
+ */
+
+/* eslint-disable */
+
+'use strict';
+
+/*::
+import type { ConcreteFragment } from 'relay-runtime';
+type AllHotelsSearchRow$ref = any;
+type MapView$ref = any;
+import type { FragmentReference } from "relay-runtime";
+declare export opaque type AllHotelsSearchList$ref: FragmentReference;
+export type AllHotelsSearchList = $ReadOnlyArray<{|
+  +node: ?{|
+    +id: string,
+    +$fragmentRefs: AllHotelsSearchRow$ref,
+  |},
+  +$fragmentRefs: MapView$ref,
+  +$refType: AllHotelsSearchList$ref,
+|}>;
+*/
+
+
+const node/*: ConcreteFragment*/ = {
+  "kind": "Fragment",
+  "name": "AllHotelsSearchList",
+  "type": "HotelAvailabilityEdge",
+  "metadata": {
+    "plural": true
+  },
+  "argumentDefinitions": [],
+  "selections": [
+    {
+      "kind": "LinkedField",
+      "alias": null,
+      "name": "node",
+      "storageKey": null,
+      "args": null,
+      "concreteType": "HotelAvailability",
+      "plural": false,
+      "selections": [
+        {
+          "kind": "ScalarField",
+          "alias": null,
+          "name": "id",
+          "args": null,
+          "storageKey": null
+        },
+        {
+          "kind": "FragmentSpread",
+          "name": "AllHotelsSearchRow",
+          "args": null
+        }
+      ]
+    },
+    {
+      "kind": "FragmentSpread",
+      "name": "MapView",
+      "args": null
+    }
+  ]
+};
+// prettier-ignore
+(node/*: any*/).hash = '27b5370ff58499fc503291daf2320715';
+module.exports = node;
diff --git a/app/hotels/src/allHotels/__generated__/AllHotelsSearchListQuery.graphql.js b/app/hotels/src/allHotels/__generated__/AllHotelsSearchListQuery.graphql.js
deleted file mode 100644
index 0ee89587..00000000
--- a/app/hotels/src/allHotels/__generated__/AllHotelsSearchListQuery.graphql.js
+++ /dev/null
@@ -1,526 +0,0 @@
-/**
- * @flow
- * @relayHash 7f0720c66e6abfd38b5d47b99fd57fdd
- */
-
-/* eslint-disable */
-
-'use strict';
-
-/*::
-import type { ConcreteRequest } from 'relay-runtime';
-type AllHotelsSearchList_data$ref = any;
-export type Currency = "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BRL" | "BSD" | "BTC" | "BTN" | "BWP" | "BYN" | "BYR" | "BZD" | "CAD" | "CDF" | "CHF" | "CLF" | "CLP" | "CNY" | "COP" | "CRC" | "CUC" | "CUP" | "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EEK" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | "GBP" | "GEL" | "GGP" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | "IDR" | "ILS" | "IMP" | "INR" | "IQD" | "IRR" | "ISK" | "JEP" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LTL" | "LVL" | "LYD" | "MAD" | "MDL" | "MGA" | "MKD" | "MMK" | "MNT" | "MOP" | "MRO" | "MTL" | "MUR" | "MVR" | "MWK" | "MXN" | "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | "PKR" | "PLN" | "PYG" | "QAR" | "QUN" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | "SGD" | "SHP" | "SLL" | "SOS" | "SRD" | "STD" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "UYU" | "UZS" | "VEF" | "VND" | "VUV" | "WST" | "XAF" | "XAG" | "XAU" | "XCD" | "XDR" | "XOF" | "XPD" | "XPF" | "XPT" | "YER" | "ZAR" | "ZMK" | "ZMW" | "ZWL" | "%future added value";
-export type Language = "ar" | "bg" | "ca" | "cs" | "da" | "de" | "el" | "en" | "engb" | "enus" | "es" | "esar" | "et" | "fi" | "fr" | "he" | "hr" | "hu" | "id" | "is" | "it" | "ja" | "ko" | "lt" | "lv" | "ms" | "nl" | "no" | "pl" | "pt" | "ptbr" | "ptpt" | "ro" | "ru" | "sk" | "sl" | "sr" | "sv" | "th" | "tl" | "tr" | "uk" | "vi" | "zh" | "zhcn" | "zhtw" | "%future added value";
-export type HotelsSearchInput = {
-  latitude?: ?number,
-  longitude?: ?number,
-  cityId?: ?string,
-  checkin: any,
-  checkout: any,
-  language?: ?Language,
-  roomsConfiguration: $ReadOnlyArray<RoomsConfiguration>,
-};
-export type RoomsConfiguration = {
-  adultsCount: number,
-  children?: ?$ReadOnlyArray<?RoomsChildrenConfiguration>,
-};
-export type RoomsChildrenConfiguration = {
-  age?: ?number
-};
-export type HotelsFilterInput = {
-  starsRating?: ?$ReadOnlyArray<?number>,
-  minPrice?: ?number,
-  maxPrice?: ?number,
-  hotelFacilities?: ?HotelFacilitiesInput,
-  minScore?: ?number,
-  freeCancellation?: ?boolean,
-};
-export type HotelFacilitiesInput = {
-  airportShuttle?: ?boolean,
-  familyRooms?: ?boolean,
-  facilitiesForDisabled?: ?boolean,
-  fitnessCenter?: ?boolean,
-  parking?: ?boolean,
-  freeParking?: ?boolean,
-  valetParking?: ?boolean,
-  indoorPool?: ?boolean,
-  petsAllowed?: ?boolean,
-  spa?: ?boolean,
-  wifi?: ?boolean,
-};
-export type AvailableHotelOptionsInput = {
-  currency?: ?Currency
-};
-export type AllHotelsSearchListQueryVariables = {|
-  search: HotelsSearchInput,
-  filter: HotelsFilterInput,
-  options?: ?AvailableHotelOptionsInput,
-  after?: ?string,
-  first?: ?number,
-|};
-export type AllHotelsSearchListQueryResponse = {|
-  +$fragmentRefs: AllHotelsSearchList_data$ref
-|};
-export type AllHotelsSearchListQuery = {|
-  variables: AllHotelsSearchListQueryVariables,
-  response: AllHotelsSearchListQueryResponse,
-|};
-*/
-
-
-/*
-query AllHotelsSearchListQuery(
-  $search: HotelsSearchInput!
-  $filter: HotelsFilterInput!
-  $options: AvailableHotelOptionsInput
-  $after: String
-  $first: Int
-) {
-  ...AllHotelsSearchList_data
-}
-
-fragment AllHotelsSearchList_data on RootQuery {
-  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {
-    pageInfo {
-      hasNextPage
-      hasPreviousPage
-      startCursor
-      endCursor
-    }
-    edges {
-      node {
-        id
-        ...AllHotelsSearchRow
-        __typename
-      }
-      ...MapView
-      cursor
-    }
-    stats {
-      maxPrice
-      minPrice
-    }
-  }
-}
-
-fragment AllHotelsSearchRow on HotelAvailability {
-  ...HotelTitle
-  hotel {
-    id
-    mainPhoto {
-      lowResUrl
-      id
-    }
-    ...HotelReviewScore_hotel
-  }
-}
-
-fragment MapView on HotelAvailabilityEdge {
-  node {
-    id
-    price {
-      ...PriceMarker
-    }
-    hotel {
-      coordinates {
-        lat
-        lng
-      }
-      id
-    }
-  }
-}
-
-fragment PriceMarker on Price {
-  amount
-  currency
-}
-
-fragment HotelTitle on HotelAvailability {
-  price {
-    amount
-    currency
-  }
-  hotel {
-    ...HotelDistance_hotel
-    name
-    rating {
-      stars
-    }
-    id
-  }
-}
-
-fragment HotelReviewScore_hotel on Hotel {
-  review {
-    score
-  }
-}
-
-fragment HotelDistance_hotel on Hotel {
-  distanceFromCenter
-}
-*/
-
-const node/*: ConcreteRequest*/ = (function(){
-var v0 = [
-  {
-    "kind": "LocalArgument",
-    "name": "search",
-    "type": "HotelsSearchInput!",
-    "defaultValue": null
-  },
-  {
-    "kind": "LocalArgument",
-    "name": "filter",
-    "type": "HotelsFilterInput!",
-    "defaultValue": null
-  },
-  {
-    "kind": "LocalArgument",
-    "name": "options",
-    "type": "AvailableHotelOptionsInput",
-    "defaultValue": null
-  },
-  {
-    "kind": "LocalArgument",
-    "name": "after",
-    "type": "String",
-    "defaultValue": null
-  },
-  {
-    "kind": "LocalArgument",
-    "name": "first",
-    "type": "Int",
-    "defaultValue": null
-  }
-],
-v1 = [
-  {
-    "kind": "Variable",
-    "name": "after",
-    "variableName": "after",
-    "type": "String"
-  },
-  {
-    "kind": "Variable",
-    "name": "filter",
-    "variableName": "filter",
-    "type": "HotelsFilterInput"
-  },
-  {
-    "kind": "Variable",
-    "name": "first",
-    "variableName": "first",
-    "type": "Int"
-  },
-  {
-    "kind": "Variable",
-    "name": "options",
-    "variableName": "options",
-    "type": "AvailableHotelOptionsInput"
-  },
-  {
-    "kind": "Variable",
-    "name": "search",
-    "variableName": "search",
-    "type": "HotelsSearchInput!"
-  }
-],
-v2 = {
-  "kind": "ScalarField",
-  "alias": null,
-  "name": "id",
-  "args": null,
-  "storageKey": null
-};
-return {
-  "kind": "Request",
-  "operationKind": "query",
-  "name": "AllHotelsSearchListQuery",
-  "id": null,
-  "text": "query AllHotelsSearchListQuery(\n  $search: HotelsSearchInput!\n  $filter: HotelsFilterInput!\n  $options: AvailableHotelOptionsInput\n  $after: String\n  $first: Int\n) {\n  ...AllHotelsSearchList_data\n}\n\nfragment AllHotelsSearchList_data on RootQuery {\n  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {\n    pageInfo {\n      hasNextPage\n      hasPreviousPage\n      startCursor\n      endCursor\n    }\n    edges {\n      node {\n        id\n        ...AllHotelsSearchRow\n        __typename\n      }\n      ...MapView\n      cursor\n    }\n    stats {\n      maxPrice\n      minPrice\n    }\n  }\n}\n\nfragment AllHotelsSearchRow on HotelAvailability {\n  ...HotelTitle\n  hotel {\n    id\n    mainPhoto {\n      lowResUrl\n      id\n    }\n    ...HotelReviewScore_hotel\n  }\n}\n\nfragment MapView on HotelAvailabilityEdge {\n  node {\n    id\n    price {\n      ...PriceMarker\n    }\n    hotel {\n      coordinates {\n        lat\n        lng\n      }\n      id\n    }\n  }\n}\n\nfragment PriceMarker on Price {\n  amount\n  currency\n}\n\nfragment HotelTitle on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelDistance_hotel\n    name\n    rating {\n      stars\n    }\n    id\n  }\n}\n\nfragment HotelReviewScore_hotel on Hotel {\n  review {\n    score\n  }\n}\n\nfragment HotelDistance_hotel on Hotel {\n  distanceFromCenter\n}\n",
-  "metadata": {},
-  "fragment": {
-    "kind": "Fragment",
-    "name": "AllHotelsSearchListQuery",
-    "type": "RootQuery",
-    "metadata": null,
-    "argumentDefinitions": v0,
-    "selections": [
-      {
-        "kind": "FragmentSpread",
-        "name": "AllHotelsSearchList_data",
-        "args": null
-      }
-    ]
-  },
-  "operation": {
-    "kind": "Operation",
-    "name": "AllHotelsSearchListQuery",
-    "argumentDefinitions": v0,
-    "selections": [
-      {
-        "kind": "LinkedField",
-        "alias": null,
-        "name": "allAvailableHotels",
-        "storageKey": null,
-        "args": v1,
-        "concreteType": "HotelAvailabilityConnection",
-        "plural": false,
-        "selections": [
-          {
-            "kind": "LinkedField",
-            "alias": null,
-            "name": "pageInfo",
-            "storageKey": null,
-            "args": null,
-            "concreteType": "PageInfo",
-            "plural": false,
-            "selections": [
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "hasNextPage",
-                "args": null,
-                "storageKey": null
-              },
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "hasPreviousPage",
-                "args": null,
-                "storageKey": null
-              },
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "startCursor",
-                "args": null,
-                "storageKey": null
-              },
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "endCursor",
-                "args": null,
-                "storageKey": null
-              }
-            ]
-          },
-          {
-            "kind": "LinkedField",
-            "alias": null,
-            "name": "edges",
-            "storageKey": null,
-            "args": null,
-            "concreteType": "HotelAvailabilityEdge",
-            "plural": true,
-            "selections": [
-              {
-                "kind": "LinkedField",
-                "alias": null,
-                "name": "node",
-                "storageKey": null,
-                "args": null,
-                "concreteType": "HotelAvailability",
-                "plural": false,
-                "selections": [
-                  v2,
-                  {
-                    "kind": "LinkedField",
-                    "alias": null,
-                    "name": "price",
-                    "storageKey": null,
-                    "args": null,
-                    "concreteType": "Price",
-                    "plural": false,
-                    "selections": [
-                      {
-                        "kind": "ScalarField",
-                        "alias": null,
-                        "name": "amount",
-                        "args": null,
-                        "storageKey": null
-                      },
-                      {
-                        "kind": "ScalarField",
-                        "alias": null,
-                        "name": "currency",
-                        "args": null,
-                        "storageKey": null
-                      }
-                    ]
-                  },
-                  {
-                    "kind": "LinkedField",
-                    "alias": null,
-                    "name": "hotel",
-                    "storageKey": null,
-                    "args": null,
-                    "concreteType": "Hotel",
-                    "plural": false,
-                    "selections": [
-                      {
-                        "kind": "ScalarField",
-                        "alias": null,
-                        "name": "distanceFromCenter",
-                        "args": null,
-                        "storageKey": null
-                      },
-                      {
-                        "kind": "ScalarField",
-                        "alias": null,
-                        "name": "name",
-                        "args": null,
-                        "storageKey": null
-                      },
-                      {
-                        "kind": "LinkedField",
-                        "alias": null,
-                        "name": "rating",
-                        "storageKey": null,
-                        "args": null,
-                        "concreteType": "HotelRating",
-                        "plural": false,
-                        "selections": [
-                          {
-                            "kind": "ScalarField",
-                            "alias": null,
-                            "name": "stars",
-                            "args": null,
-                            "storageKey": null
-                          }
-                        ]
-                      },
-                      v2,
-                      {
-                        "kind": "LinkedField",
-                        "alias": null,
-                        "name": "mainPhoto",
-                        "storageKey": null,
-                        "args": null,
-                        "concreteType": "HotelPhoto",
-                        "plural": false,
-                        "selections": [
-                          {
-                            "kind": "ScalarField",
-                            "alias": null,
-                            "name": "lowResUrl",
-                            "args": null,
-                            "storageKey": null
-                          },
-                          v2
-                        ]
-                      },
-                      {
-                        "kind": "LinkedField",
-                        "alias": null,
-                        "name": "review",
-                        "storageKey": null,
-                        "args": null,
-                        "concreteType": "HotelReview",
-                        "plural": false,
-                        "selections": [
-                          {
-                            "kind": "ScalarField",
-                            "alias": null,
-                            "name": "score",
-                            "args": null,
-                            "storageKey": null
-                          }
-                        ]
-                      },
-                      {
-                        "kind": "LinkedField",
-                        "alias": null,
-                        "name": "coordinates",
-                        "storageKey": null,
-                        "args": null,
-                        "concreteType": "Coordinates",
-                        "plural": false,
-                        "selections": [
-                          {
-                            "kind": "ScalarField",
-                            "alias": null,
-                            "name": "lat",
-                            "args": null,
-                            "storageKey": null
-                          },
-                          {
-                            "kind": "ScalarField",
-                            "alias": null,
-                            "name": "lng",
-                            "args": null,
-                            "storageKey": null
-                          }
-                        ]
-                      }
-                    ]
-                  },
-                  {
-                    "kind": "ScalarField",
-                    "alias": null,
-                    "name": "__typename",
-                    "args": null,
-                    "storageKey": null
-                  }
-                ]
-              },
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "cursor",
-                "args": null,
-                "storageKey": null
-              }
-            ]
-          },
-          {
-            "kind": "LinkedField",
-            "alias": null,
-            "name": "stats",
-            "storageKey": null,
-            "args": null,
-            "concreteType": "HotelAvailabilityStats",
-            "plural": false,
-            "selections": [
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "maxPrice",
-                "args": null,
-                "storageKey": null
-              },
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "minPrice",
-                "args": null,
-                "storageKey": null
-              }
-            ]
-          }
-        ]
-      },
-      {
-        "kind": "LinkedHandle",
-        "alias": null,
-        "name": "allAvailableHotels",
-        "args": v1,
-        "handle": "connection",
-        "key": "AllHotels_allAvailableHotels",
-        "filters": [
-          "search",
-          "filter",
-          "options"
-        ]
-      }
-    ]
-  }
-};
-})();
-// prettier-ignore
-(node/*: any*/).hash = 'b1e0fcc916c0515a5c6c87ae6c3ac37a';
-module.exports = node;
diff --git a/app/hotels/src/allHotels/__generated__/AllHotelsSearchList_data.graphql.js b/app/hotels/src/allHotels/__generated__/AllHotelsSearchList_data.graphql.js
deleted file mode 100644
index a99eeb58..00000000
--- a/app/hotels/src/allHotels/__generated__/AllHotelsSearchList_data.graphql.js
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * @flow
- */
-
-/* eslint-disable */
-
-'use strict';
-
-/*::
-import type { ConcreteFragment } from 'relay-runtime';
-type AllHotelsSearchRow$ref = any;
-type MapView$ref = any;
-import type { FragmentReference } from "relay-runtime";
-declare export opaque type AllHotelsSearchList_data$ref: FragmentReference;
-export type AllHotelsSearchList_data = {|
-  +allAvailableHotels: ?{|
-    +pageInfo: {|
-      +hasNextPage: boolean,
-      +hasPreviousPage: boolean,
-      +startCursor: ?string,
-      +endCursor: ?string,
-    |},
-    +edges: ?$ReadOnlyArray<?{|
-      +node: ?{|
-        +id: string,
-        +$fragmentRefs: AllHotelsSearchRow$ref,
-      |},
-      +$fragmentRefs: MapView$ref,
-    |}>,
-    +stats: ?{|
-      +maxPrice: ?number,
-      +minPrice: ?number,
-    |},
-  |},
-  +$refType: AllHotelsSearchList_data$ref,
-|};
-*/
-
-
-const node/*: ConcreteFragment*/ = {
-  "kind": "Fragment",
-  "name": "AllHotelsSearchList_data",
-  "type": "RootQuery",
-  "metadata": {
-    "connection": [
-      {
-        "count": "first",
-        "cursor": "after",
-        "direction": "forward",
-        "path": [
-          "allAvailableHotels"
-        ]
-      }
-    ]
-  },
-  "argumentDefinitions": [
-    {
-      "kind": "RootArgument",
-      "name": "search",
-      "type": "HotelsSearchInput!"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "filter",
-      "type": "HotelsFilterInput"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "options",
-      "type": "AvailableHotelOptionsInput"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "first",
-      "type": "Int"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "after",
-      "type": "String"
-    }
-  ],
-  "selections": [
-    {
-      "kind": "LinkedField",
-      "alias": "allAvailableHotels",
-      "name": "__AllHotels_allAvailableHotels_connection",
-      "storageKey": null,
-      "args": [
-        {
-          "kind": "Variable",
-          "name": "filter",
-          "variableName": "filter",
-          "type": "HotelsFilterInput"
-        },
-        {
-          "kind": "Variable",
-          "name": "options",
-          "variableName": "options",
-          "type": "AvailableHotelOptionsInput"
-        },
-        {
-          "kind": "Variable",
-          "name": "search",
-          "variableName": "search",
-          "type": "HotelsSearchInput!"
-        }
-      ],
-      "concreteType": "HotelAvailabilityConnection",
-      "plural": false,
-      "selections": [
-        {
-          "kind": "LinkedField",
-          "alias": null,
-          "name": "pageInfo",
-          "storageKey": null,
-          "args": null,
-          "concreteType": "PageInfo",
-          "plural": false,
-          "selections": [
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "hasNextPage",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "hasPreviousPage",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "startCursor",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "endCursor",
-              "args": null,
-              "storageKey": null
-            }
-          ]
-        },
-        {
-          "kind": "LinkedField",
-          "alias": null,
-          "name": "edges",
-          "storageKey": null,
-          "args": null,
-          "concreteType": "HotelAvailabilityEdge",
-          "plural": true,
-          "selections": [
-            {
-              "kind": "LinkedField",
-              "alias": null,
-              "name": "node",
-              "storageKey": null,
-              "args": null,
-              "concreteType": "HotelAvailability",
-              "plural": false,
-              "selections": [
-                {
-                  "kind": "ScalarField",
-                  "alias": null,
-                  "name": "id",
-                  "args": null,
-                  "storageKey": null
-                },
-                {
-                  "kind": "FragmentSpread",
-                  "name": "AllHotelsSearchRow",
-                  "args": null
-                },
-                {
-                  "kind": "ScalarField",
-                  "alias": null,
-                  "name": "__typename",
-                  "args": null,
-                  "storageKey": null
-                }
-              ]
-            },
-            {
-              "kind": "FragmentSpread",
-              "name": "MapView",
-              "args": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "cursor",
-              "args": null,
-              "storageKey": null
-            }
-          ]
-        },
-        {
-          "kind": "LinkedField",
-          "alias": null,
-          "name": "stats",
-          "storageKey": null,
-          "args": null,
-          "concreteType": "HotelAvailabilityStats",
-          "plural": false,
-          "selections": [
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "maxPrice",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "minPrice",
-              "args": null,
-              "storageKey": null
-            }
-          ]
-        }
-      ]
-    }
-  ]
-};
-// prettier-ignore
-(node/*: any*/).hash = '315b2a41f510a384ff02ff04f95c6223';
-module.exports = node;
diff --git a/app/hotels/src/allHotels/__generated__/NewAllHotelsSearchQuery.graphql.js b/app/hotels/src/allHotels/__generated__/NewAllHotelsSearchQuery.graphql.js
index da7e163e..07f22109 100644
--- a/app/hotels/src/allHotels/__generated__/NewAllHotelsSearchQuery.graphql.js
+++ b/app/hotels/src/allHotels/__generated__/NewAllHotelsSearchQuery.graphql.js
@@ -1,6 +1,6 @@
 /**
  * @flow
- * @relayHash 284728f793100f1357f43f9ebf21264c
+ * @relayHash d450a94a10eb5b008d2dd7bf22bab852
  */
 
 /* eslint-disable */
@@ -81,11 +81,6 @@ query NewAllHotelsSearchQuery(
 }
 
 fragment RenderSearchResults on RootQuery {
-  ...AllHotelsSearchList_data
-  ...MapScreen
-}
-
-fragment AllHotelsSearchList_data on RootQuery {
   allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {
     pageInfo {
       hasNextPage
@@ -93,46 +88,38 @@ fragment AllHotelsSearchList_data on RootQuery {
       startCursor
       endCursor
     }
-    edges {
-      node {
-        id
-        ...AllHotelsSearchRow
-        __typename
-      }
-      ...MapView
-      cursor
-    }
     stats {
       maxPrice
       minPrice
     }
-  }
-}
-
-fragment MapScreen on RootQuery {
-  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {
-    pageInfo {
-      hasNextPage
-      hasPreviousPage
-      startCursor
-      endCursor
-    }
     edges {
+      ...AllHotelsSearchList
+      ...MapScreen
+      cursor
       node {
-        id
         __typename
+        id
       }
-      ...MapView
-      ...HotelSwipeList
-      cursor
-    }
-    stats {
-      maxPrice
-      minPrice
     }
   }
 }
 
+fragment AllHotelsSearchList on HotelAvailabilityEdge {
+  node {
+    id
+    ...AllHotelsSearchRow
+  }
+  ...MapView
+}
+
+fragment MapScreen on HotelAvailabilityEdge {
+  node {
+    id
+  }
+  ...MapView
+  ...HotelSwipeList
+}
+
 fragment MapView on HotelAvailabilityEdge {
   node {
     id
@@ -314,7 +301,7 @@ return {
   "operationKind": "query",
   "name": "NewAllHotelsSearchQuery",
   "id": null,
-  "text": "query NewAllHotelsSearchQuery(\n  $search: HotelsSearchInput!\n  $filter: HotelsFilterInput!\n  $options: AvailableHotelOptionsInput\n  $first: Int\n  $after: String\n) {\n  ...RenderSearchResults\n}\n\nfragment RenderSearchResults on RootQuery {\n  ...AllHotelsSearchList_data\n  ...MapScreen\n}\n\nfragment AllHotelsSearchList_data on RootQuery {\n  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {\n    pageInfo {\n      hasNextPage\n      hasPreviousPage\n      startCursor\n      endCursor\n    }\n    edges {\n      node {\n        id\n        ...AllHotelsSearchRow\n        __typename\n      }\n      ...MapView\n      cursor\n    }\n    stats {\n      maxPrice\n      minPrice\n    }\n  }\n}\n\nfragment MapScreen on RootQuery {\n  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {\n    pageInfo {\n      hasNextPage\n      hasPreviousPage\n      startCursor\n      endCursor\n    }\n    edges {\n      node {\n        id\n        __typename\n      }\n      ...MapView\n      ...HotelSwipeList\n      cursor\n    }\n    stats {\n      maxPrice\n      minPrice\n    }\n  }\n}\n\nfragment MapView on HotelAvailabilityEdge {\n  node {\n    id\n    price {\n      ...PriceMarker\n    }\n    hotel {\n      coordinates {\n        lat\n        lng\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeList on HotelAvailabilityEdge {\n  node {\n    id\n    ...HotelSwipeItem\n    hotel {\n      address {\n        ...Address_address\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeItem on HotelAvailability {\n  ...HotelDetailPreview_availability\n  hotel {\n    id\n  }\n}\n\nfragment Address_address on Address {\n  street\n  city\n  zip\n}\n\nfragment HotelDetailPreview_availability on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelReviewScore_hotel\n    id\n    name\n    mainPhoto {\n      thumbnailUrl\n      id\n    }\n    rating {\n      stars\n    }\n  }\n}\n\nfragment HotelReviewScore_hotel on Hotel {\n  review {\n    score\n  }\n}\n\nfragment PriceMarker on Price {\n  amount\n  currency\n}\n\nfragment AllHotelsSearchRow on HotelAvailability {\n  ...HotelTitle\n  hotel {\n    id\n    mainPhoto {\n      lowResUrl\n      id\n    }\n    ...HotelReviewScore_hotel\n  }\n}\n\nfragment HotelTitle on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelDistance_hotel\n    name\n    rating {\n      stars\n    }\n    id\n  }\n}\n\nfragment HotelDistance_hotel on Hotel {\n  distanceFromCenter\n}\n",
+  "text": "query NewAllHotelsSearchQuery(\n  $search: HotelsSearchInput!\n  $filter: HotelsFilterInput!\n  $options: AvailableHotelOptionsInput\n  $first: Int\n  $after: String\n) {\n  ...RenderSearchResults\n}\n\nfragment RenderSearchResults on RootQuery {\n  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {\n    pageInfo {\n      hasNextPage\n      hasPreviousPage\n      startCursor\n      endCursor\n    }\n    stats {\n      maxPrice\n      minPrice\n    }\n    edges {\n      ...AllHotelsSearchList\n      ...MapScreen\n      cursor\n      node {\n        __typename\n        id\n      }\n    }\n  }\n}\n\nfragment AllHotelsSearchList on HotelAvailabilityEdge {\n  node {\n    id\n    ...AllHotelsSearchRow\n  }\n  ...MapView\n}\n\nfragment MapScreen on HotelAvailabilityEdge {\n  node {\n    id\n  }\n  ...MapView\n  ...HotelSwipeList\n}\n\nfragment MapView on HotelAvailabilityEdge {\n  node {\n    id\n    price {\n      ...PriceMarker\n    }\n    hotel {\n      coordinates {\n        lat\n        lng\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeList on HotelAvailabilityEdge {\n  node {\n    id\n    ...HotelSwipeItem\n    hotel {\n      address {\n        ...Address_address\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeItem on HotelAvailability {\n  ...HotelDetailPreview_availability\n  hotel {\n    id\n  }\n}\n\nfragment Address_address on Address {\n  street\n  city\n  zip\n}\n\nfragment HotelDetailPreview_availability on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelReviewScore_hotel\n    id\n    name\n    mainPhoto {\n      thumbnailUrl\n      id\n    }\n    rating {\n      stars\n    }\n  }\n}\n\nfragment HotelReviewScore_hotel on Hotel {\n  review {\n    score\n  }\n}\n\nfragment PriceMarker on Price {\n  amount\n  currency\n}\n\nfragment AllHotelsSearchRow on HotelAvailability {\n  ...HotelTitle\n  hotel {\n    id\n    mainPhoto {\n      lowResUrl\n      id\n    }\n    ...HotelReviewScore_hotel\n  }\n}\n\nfragment HotelTitle on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelDistance_hotel\n    name\n    rating {\n      stars\n    }\n    id\n  }\n}\n\nfragment HotelDistance_hotel on Hotel {\n  distanceFromCenter\n}\n",
   "metadata": {},
   "fragment": {
     "kind": "Fragment",
@@ -383,6 +370,31 @@ return {
               }
             ]
           },
+          {
+            "kind": "LinkedField",
+            "alias": null,
+            "name": "stats",
+            "storageKey": null,
+            "args": null,
+            "concreteType": "HotelAvailabilityStats",
+            "plural": false,
+            "selections": [
+              {
+                "kind": "ScalarField",
+                "alias": null,
+                "name": "maxPrice",
+                "args": null,
+                "storageKey": null
+              },
+              {
+                "kind": "ScalarField",
+                "alias": null,
+                "name": "minPrice",
+                "args": null,
+                "storageKey": null
+              }
+            ]
+          },
           {
             "kind": "LinkedField",
             "alias": null,
@@ -589,31 +601,6 @@ return {
                 "storageKey": null
               }
             ]
-          },
-          {
-            "kind": "LinkedField",
-            "alias": null,
-            "name": "stats",
-            "storageKey": null,
-            "args": null,
-            "concreteType": "HotelAvailabilityStats",
-            "plural": false,
-            "selections": [
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "maxPrice",
-                "args": null,
-                "storageKey": null
-              },
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "minPrice",
-                "args": null,
-                "storageKey": null
-              }
-            ]
           }
         ]
       },
diff --git a/app/hotels/src/allHotels/__generated__/RenderSearchResults.graphql.js b/app/hotels/src/allHotels/__generated__/RenderSearchResults.graphql.js
index 3f270342..200b44c2 100644
--- a/app/hotels/src/allHotels/__generated__/RenderSearchResults.graphql.js
+++ b/app/hotels/src/allHotels/__generated__/RenderSearchResults.graphql.js
@@ -8,12 +8,26 @@
 
 /*::
 import type { ConcreteFragment } from 'relay-runtime';
-type AllHotelsSearchList_data$ref = any;
+type AllHotelsSearchList$ref = any;
 type MapScreen$ref = any;
 import type { FragmentReference } from "relay-runtime";
 declare export opaque type RenderSearchResults$ref: FragmentReference;
 export type RenderSearchResults = {|
-  +$fragmentRefs: AllHotelsSearchList_data$ref & MapScreen$ref,
+  +allAvailableHotels: ?{|
+    +pageInfo: {|
+      +hasNextPage: boolean,
+      +hasPreviousPage: boolean,
+      +startCursor: ?string,
+      +endCursor: ?string,
+    |},
+    +stats: ?{|
+      +maxPrice: ?number,
+      +minPrice: ?number,
+    |},
+    +edges: ?$ReadOnlyArray<?{|
+      +$fragmentRefs: AllHotelsSearchList$ref & MapScreen$ref
+    |}>,
+  |},
   +$refType: RenderSearchResults$ref,
 |};
 */
@@ -23,21 +37,188 @@ const node/*: ConcreteFragment*/ = {
   "kind": "Fragment",
   "name": "RenderSearchResults",
   "type": "RootQuery",
-  "metadata": null,
-  "argumentDefinitions": [],
-  "selections": [
+  "metadata": {
+    "connection": [
+      {
+        "count": "first",
+        "cursor": "after",
+        "direction": "forward",
+        "path": [
+          "allAvailableHotels"
+        ]
+      }
+    ]
+  },
+  "argumentDefinitions": [
+    {
+      "kind": "RootArgument",
+      "name": "search",
+      "type": "HotelsSearchInput!"
+    },
+    {
+      "kind": "RootArgument",
+      "name": "filter",
+      "type": "HotelsFilterInput"
+    },
     {
-      "kind": "FragmentSpread",
-      "name": "AllHotelsSearchList_data",
-      "args": null
+      "kind": "RootArgument",
+      "name": "options",
+      "type": "AvailableHotelOptionsInput"
     },
     {
-      "kind": "FragmentSpread",
-      "name": "MapScreen",
-      "args": null
+      "kind": "RootArgument",
+      "name": "first",
+      "type": "Int"
+    },
+    {
+      "kind": "RootArgument",
+      "name": "after",
+      "type": "String"
+    }
+  ],
+  "selections": [
+    {
+      "kind": "LinkedField",
+      "alias": "allAvailableHotels",
+      "name": "__AllHotels_allAvailableHotels_connection",
+      "storageKey": null,
+      "args": [
+        {
+          "kind": "Variable",
+          "name": "filter",
+          "variableName": "filter",
+          "type": "HotelsFilterInput"
+        },
+        {
+          "kind": "Variable",
+          "name": "options",
+          "variableName": "options",
+          "type": "AvailableHotelOptionsInput"
+        },
+        {
+          "kind": "Variable",
+          "name": "search",
+          "variableName": "search",
+          "type": "HotelsSearchInput!"
+        }
+      ],
+      "concreteType": "HotelAvailabilityConnection",
+      "plural": false,
+      "selections": [
+        {
+          "kind": "LinkedField",
+          "alias": null,
+          "name": "pageInfo",
+          "storageKey": null,
+          "args": null,
+          "concreteType": "PageInfo",
+          "plural": false,
+          "selections": [
+            {
+              "kind": "ScalarField",
+              "alias": null,
+              "name": "hasNextPage",
+              "args": null,
+              "storageKey": null
+            },
+            {
+              "kind": "ScalarField",
+              "alias": null,
+              "name": "hasPreviousPage",
+              "args": null,
+              "storageKey": null
+            },
+            {
+              "kind": "ScalarField",
+              "alias": null,
+              "name": "startCursor",
+              "args": null,
+              "storageKey": null
+            },
+            {
+              "kind": "ScalarField",
+              "alias": null,
+              "name": "endCursor",
+              "args": null,
+              "storageKey": null
+            }
+          ]
+        },
+        {
+          "kind": "LinkedField",
+          "alias": null,
+          "name": "stats",
+          "storageKey": null,
+          "args": null,
+          "concreteType": "HotelAvailabilityStats",
+          "plural": false,
+          "selections": [
+            {
+              "kind": "ScalarField",
+              "alias": null,
+              "name": "maxPrice",
+              "args": null,
+              "storageKey": null
+            },
+            {
+              "kind": "ScalarField",
+              "alias": null,
+              "name": "minPrice",
+              "args": null,
+              "storageKey": null
+            }
+          ]
+        },
+        {
+          "kind": "LinkedField",
+          "alias": null,
+          "name": "edges",
+          "storageKey": null,
+          "args": null,
+          "concreteType": "HotelAvailabilityEdge",
+          "plural": true,
+          "selections": [
+            {
+              "kind": "FragmentSpread",
+              "name": "AllHotelsSearchList",
+              "args": null
+            },
+            {
+              "kind": "FragmentSpread",
+              "name": "MapScreen",
+              "args": null
+            },
+            {
+              "kind": "ScalarField",
+              "alias": null,
+              "name": "cursor",
+              "args": null,
+              "storageKey": null
+            },
+            {
+              "kind": "LinkedField",
+              "alias": null,
+              "name": "node",
+              "storageKey": null,
+              "args": null,
+              "concreteType": "HotelAvailability",
+              "plural": false,
+              "selections": [
+                {
+                  "kind": "ScalarField",
+                  "alias": null,
+                  "name": "__typename",
+                  "args": null,
+                  "storageKey": null
+                }
+              ]
+            }
+          ]
+        }
+      ]
     }
   ]
 };
 // prettier-ignore
-(node/*: any*/).hash = '4ff37e2c888ba651167975f92e09101d';
+(node/*: any*/).hash = '3b76842627de656b248f453f7cf1e605';
 module.exports = node;
diff --git a/app/hotels/src/map/allHotels/__generated__/NewAllHotelsMapQuery.graphql.js b/app/hotels/src/allHotels/__generated__/RenderSearchResultsQuery.graphql.js
similarity index 78%
rename from app/hotels/src/map/allHotels/__generated__/NewAllHotelsMapQuery.graphql.js
rename to app/hotels/src/allHotels/__generated__/RenderSearchResultsQuery.graphql.js
index ee1dcaf0..7c81582a 100644
--- a/app/hotels/src/map/allHotels/__generated__/NewAllHotelsMapQuery.graphql.js
+++ b/app/hotels/src/allHotels/__generated__/RenderSearchResultsQuery.graphql.js
@@ -1,6 +1,6 @@
 /**
  * @flow
- * @relayHash 71db383f66d5d77ab0a9bb91c82525ed
+ * @relayHash ab61e06e9fabc3857e18e082ec954f03
  */
 
 /* eslint-disable */
@@ -9,7 +9,7 @@
 
 /*::
 import type { ConcreteRequest } from 'relay-runtime';
-type MapScreen$ref = any;
+type RenderSearchResults$ref = any;
 export type Currency = "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BRL" | "BSD" | "BTC" | "BTN" | "BWP" | "BYN" | "BYR" | "BZD" | "CAD" | "CDF" | "CHF" | "CLF" | "CLP" | "CNY" | "COP" | "CRC" | "CUC" | "CUP" | "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EEK" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | "GBP" | "GEL" | "GGP" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | "IDR" | "ILS" | "IMP" | "INR" | "IQD" | "IRR" | "ISK" | "JEP" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LTL" | "LVL" | "LYD" | "MAD" | "MDL" | "MGA" | "MKD" | "MMK" | "MNT" | "MOP" | "MRO" | "MTL" | "MUR" | "MVR" | "MWK" | "MXN" | "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | "PKR" | "PLN" | "PYG" | "QAR" | "QUN" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | "SGD" | "SHP" | "SLL" | "SOS" | "SRD" | "STD" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "UYU" | "UZS" | "VEF" | "VND" | "VUV" | "WST" | "XAF" | "XAG" | "XAU" | "XCD" | "XDR" | "XOF" | "XPD" | "XPF" | "XPT" | "YER" | "ZAR" | "ZMK" | "ZMW" | "ZWL" | "%future added value";
 export type Language = "ar" | "bg" | "ca" | "cs" | "da" | "de" | "el" | "en" | "engb" | "enus" | "es" | "esar" | "et" | "fi" | "fr" | "he" | "hr" | "hu" | "id" | "is" | "it" | "ja" | "ko" | "lt" | "lv" | "ms" | "nl" | "no" | "pl" | "pt" | "ptbr" | "ptpt" | "ro" | "ru" | "sk" | "sl" | "sr" | "sv" | "th" | "tl" | "tr" | "uk" | "vi" | "zh" | "zhcn" | "zhtw" | "%future added value";
 export type HotelsSearchInput = {
@@ -52,35 +52,35 @@ export type HotelFacilitiesInput = {
 export type AvailableHotelOptionsInput = {
   currency?: ?Currency
 };
-export type NewAllHotelsMapQueryVariables = {|
+export type RenderSearchResultsQueryVariables = {|
   search: HotelsSearchInput,
-  filter?: ?HotelsFilterInput,
+  filter: HotelsFilterInput,
   options?: ?AvailableHotelOptionsInput,
-  first?: ?number,
   after?: ?string,
+  first?: ?number,
 |};
-export type NewAllHotelsMapQueryResponse = {|
-  +$fragmentRefs: MapScreen$ref
+export type RenderSearchResultsQueryResponse = {|
+  +$fragmentRefs: RenderSearchResults$ref
 |};
-export type NewAllHotelsMapQuery = {|
-  variables: NewAllHotelsMapQueryVariables,
-  response: NewAllHotelsMapQueryResponse,
+export type RenderSearchResultsQuery = {|
+  variables: RenderSearchResultsQueryVariables,
+  response: RenderSearchResultsQueryResponse,
 |};
 */
 
 
 /*
-query NewAllHotelsMapQuery(
+query RenderSearchResultsQuery(
   $search: HotelsSearchInput!
-  $filter: HotelsFilterInput
+  $filter: HotelsFilterInput!
   $options: AvailableHotelOptionsInput
-  $first: Int
   $after: String
+  $first: Int
 ) {
-  ...MapScreen
+  ...RenderSearchResults
 }
 
-fragment MapScreen on RootQuery {
+fragment RenderSearchResults on RootQuery {
   allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {
     pageInfo {
       hasNextPage
@@ -88,22 +88,38 @@ fragment MapScreen on RootQuery {
       startCursor
       endCursor
     }
+    stats {
+      maxPrice
+      minPrice
+    }
     edges {
+      ...AllHotelsSearchList
+      ...MapScreen
+      cursor
       node {
-        id
         __typename
+        id
       }
-      ...MapView
-      ...HotelSwipeList
-      cursor
-    }
-    stats {
-      maxPrice
-      minPrice
     }
   }
 }
 
+fragment AllHotelsSearchList on HotelAvailabilityEdge {
+  node {
+    id
+    ...AllHotelsSearchRow
+  }
+  ...MapView
+}
+
+fragment MapScreen on HotelAvailabilityEdge {
+  node {
+    id
+  }
+  ...MapView
+  ...HotelSwipeList
+}
+
 fragment MapView on HotelAvailabilityEdge {
   node {
     id
@@ -175,6 +191,37 @@ fragment PriceMarker on Price {
   amount
   currency
 }
+
+fragment AllHotelsSearchRow on HotelAvailability {
+  ...HotelTitle
+  hotel {
+    id
+    mainPhoto {
+      lowResUrl
+      id
+    }
+    ...HotelReviewScore_hotel
+  }
+}
+
+fragment HotelTitle on HotelAvailability {
+  price {
+    amount
+    currency
+  }
+  hotel {
+    ...HotelDistance_hotel
+    name
+    rating {
+      stars
+    }
+    id
+  }
+}
+
+fragment HotelDistance_hotel on Hotel {
+  distanceFromCenter
+}
 */
 
 const node/*: ConcreteRequest*/ = (function(){
@@ -188,7 +235,7 @@ var v0 = [
   {
     "kind": "LocalArgument",
     "name": "filter",
-    "type": "HotelsFilterInput",
+    "type": "HotelsFilterInput!",
     "defaultValue": null
   },
   {
@@ -199,14 +246,14 @@ var v0 = [
   },
   {
     "kind": "LocalArgument",
-    "name": "first",
-    "type": "Int",
+    "name": "after",
+    "type": "String",
     "defaultValue": null
   },
   {
     "kind": "LocalArgument",
-    "name": "after",
-    "type": "String",
+    "name": "first",
+    "type": "Int",
     "defaultValue": null
   }
 ],
@@ -252,27 +299,27 @@ v2 = {
 return {
   "kind": "Request",
   "operationKind": "query",
-  "name": "NewAllHotelsMapQuery",
+  "name": "RenderSearchResultsQuery",
   "id": null,
-  "text": "query NewAllHotelsMapQuery(\n  $search: HotelsSearchInput!\n  $filter: HotelsFilterInput\n  $options: AvailableHotelOptionsInput\n  $first: Int\n  $after: String\n) {\n  ...MapScreen\n}\n\nfragment MapScreen on RootQuery {\n  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {\n    pageInfo {\n      hasNextPage\n      hasPreviousPage\n      startCursor\n      endCursor\n    }\n    edges {\n      node {\n        id\n        __typename\n      }\n      ...MapView\n      ...HotelSwipeList\n      cursor\n    }\n    stats {\n      maxPrice\n      minPrice\n    }\n  }\n}\n\nfragment MapView on HotelAvailabilityEdge {\n  node {\n    id\n    price {\n      ...PriceMarker\n    }\n    hotel {\n      coordinates {\n        lat\n        lng\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeList on HotelAvailabilityEdge {\n  node {\n    id\n    ...HotelSwipeItem\n    hotel {\n      address {\n        ...Address_address\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeItem on HotelAvailability {\n  ...HotelDetailPreview_availability\n  hotel {\n    id\n  }\n}\n\nfragment Address_address on Address {\n  street\n  city\n  zip\n}\n\nfragment HotelDetailPreview_availability on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelReviewScore_hotel\n    id\n    name\n    mainPhoto {\n      thumbnailUrl\n      id\n    }\n    rating {\n      stars\n    }\n  }\n}\n\nfragment HotelReviewScore_hotel on Hotel {\n  review {\n    score\n  }\n}\n\nfragment PriceMarker on Price {\n  amount\n  currency\n}\n",
+  "text": "query RenderSearchResultsQuery(\n  $search: HotelsSearchInput!\n  $filter: HotelsFilterInput!\n  $options: AvailableHotelOptionsInput\n  $after: String\n  $first: Int\n) {\n  ...RenderSearchResults\n}\n\nfragment RenderSearchResults on RootQuery {\n  allAvailableHotels(search: $search, filter: $filter, options: $options, first: $first, after: $after) {\n    pageInfo {\n      hasNextPage\n      hasPreviousPage\n      startCursor\n      endCursor\n    }\n    stats {\n      maxPrice\n      minPrice\n    }\n    edges {\n      ...AllHotelsSearchList\n      ...MapScreen\n      cursor\n      node {\n        __typename\n        id\n      }\n    }\n  }\n}\n\nfragment AllHotelsSearchList on HotelAvailabilityEdge {\n  node {\n    id\n    ...AllHotelsSearchRow\n  }\n  ...MapView\n}\n\nfragment MapScreen on HotelAvailabilityEdge {\n  node {\n    id\n  }\n  ...MapView\n  ...HotelSwipeList\n}\n\nfragment MapView on HotelAvailabilityEdge {\n  node {\n    id\n    price {\n      ...PriceMarker\n    }\n    hotel {\n      coordinates {\n        lat\n        lng\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeList on HotelAvailabilityEdge {\n  node {\n    id\n    ...HotelSwipeItem\n    hotel {\n      address {\n        ...Address_address\n      }\n      id\n    }\n  }\n}\n\nfragment HotelSwipeItem on HotelAvailability {\n  ...HotelDetailPreview_availability\n  hotel {\n    id\n  }\n}\n\nfragment Address_address on Address {\n  street\n  city\n  zip\n}\n\nfragment HotelDetailPreview_availability on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelReviewScore_hotel\n    id\n    name\n    mainPhoto {\n      thumbnailUrl\n      id\n    }\n    rating {\n      stars\n    }\n  }\n}\n\nfragment HotelReviewScore_hotel on Hotel {\n  review {\n    score\n  }\n}\n\nfragment PriceMarker on Price {\n  amount\n  currency\n}\n\nfragment AllHotelsSearchRow on HotelAvailability {\n  ...HotelTitle\n  hotel {\n    id\n    mainPhoto {\n      lowResUrl\n      id\n    }\n    ...HotelReviewScore_hotel\n  }\n}\n\nfragment HotelTitle on HotelAvailability {\n  price {\n    amount\n    currency\n  }\n  hotel {\n    ...HotelDistance_hotel\n    name\n    rating {\n      stars\n    }\n    id\n  }\n}\n\nfragment HotelDistance_hotel on Hotel {\n  distanceFromCenter\n}\n",
   "metadata": {},
   "fragment": {
     "kind": "Fragment",
-    "name": "NewAllHotelsMapQuery",
+    "name": "RenderSearchResultsQuery",
     "type": "RootQuery",
     "metadata": null,
     "argumentDefinitions": v0,
     "selections": [
       {
         "kind": "FragmentSpread",
-        "name": "MapScreen",
+        "name": "RenderSearchResults",
         "args": null
       }
     ]
   },
   "operation": {
     "kind": "Operation",
-    "name": "NewAllHotelsMapQuery",
+    "name": "RenderSearchResultsQuery",
     "argumentDefinitions": v0,
     "selections": [
       {
@@ -323,6 +370,31 @@ return {
               }
             ]
           },
+          {
+            "kind": "LinkedField",
+            "alias": null,
+            "name": "stats",
+            "storageKey": null,
+            "args": null,
+            "concreteType": "HotelAvailabilityStats",
+            "plural": false,
+            "selections": [
+              {
+                "kind": "ScalarField",
+                "alias": null,
+                "name": "maxPrice",
+                "args": null,
+                "storageKey": null
+              },
+              {
+                "kind": "ScalarField",
+                "alias": null,
+                "name": "minPrice",
+                "args": null,
+                "storageKey": null
+              }
+            ]
+          },
           {
             "kind": "LinkedField",
             "alias": null,
@@ -376,26 +448,33 @@ return {
                     "concreteType": "Hotel",
                     "plural": false,
                     "selections": [
+                      {
+                        "kind": "ScalarField",
+                        "alias": null,
+                        "name": "distanceFromCenter",
+                        "args": null,
+                        "storageKey": null
+                      },
+                      {
+                        "kind": "ScalarField",
+                        "alias": null,
+                        "name": "name",
+                        "args": null,
+                        "storageKey": null
+                      },
                       {
                         "kind": "LinkedField",
                         "alias": null,
-                        "name": "coordinates",
+                        "name": "rating",
                         "storageKey": null,
                         "args": null,
-                        "concreteType": "Coordinates",
+                        "concreteType": "HotelRating",
                         "plural": false,
                         "selections": [
                           {
                             "kind": "ScalarField",
                             "alias": null,
-                            "name": "lat",
-                            "args": null,
-                            "storageKey": null
-                          },
-                          {
-                            "kind": "ScalarField",
-                            "alias": null,
-                            "name": "lng",
+                            "name": "stars",
                             "args": null,
                             "storageKey": null
                           }
@@ -405,60 +484,67 @@ return {
                       {
                         "kind": "LinkedField",
                         "alias": null,
-                        "name": "review",
+                        "name": "mainPhoto",
                         "storageKey": null,
                         "args": null,
-                        "concreteType": "HotelReview",
+                        "concreteType": "HotelPhoto",
                         "plural": false,
                         "selections": [
                           {
                             "kind": "ScalarField",
                             "alias": null,
-                            "name": "score",
+                            "name": "lowResUrl",
+                            "args": null,
+                            "storageKey": null
+                          },
+                          v2,
+                          {
+                            "kind": "ScalarField",
+                            "alias": null,
+                            "name": "thumbnailUrl",
                             "args": null,
                             "storageKey": null
                           }
                         ]
                       },
-                      {
-                        "kind": "ScalarField",
-                        "alias": null,
-                        "name": "name",
-                        "args": null,
-                        "storageKey": null
-                      },
                       {
                         "kind": "LinkedField",
                         "alias": null,
-                        "name": "mainPhoto",
+                        "name": "review",
                         "storageKey": null,
                         "args": null,
-                        "concreteType": "HotelPhoto",
+                        "concreteType": "HotelReview",
                         "plural": false,
                         "selections": [
                           {
                             "kind": "ScalarField",
                             "alias": null,
-                            "name": "thumbnailUrl",
+                            "name": "score",
                             "args": null,
                             "storageKey": null
-                          },
-                          v2
+                          }
                         ]
                       },
                       {
                         "kind": "LinkedField",
                         "alias": null,
-                        "name": "rating",
+                        "name": "coordinates",
                         "storageKey": null,
                         "args": null,
-                        "concreteType": "HotelRating",
+                        "concreteType": "Coordinates",
                         "plural": false,
                         "selections": [
                           {
                             "kind": "ScalarField",
                             "alias": null,
-                            "name": "stars",
+                            "name": "lat",
+                            "args": null,
+                            "storageKey": null
+                          },
+                          {
+                            "kind": "ScalarField",
+                            "alias": null,
+                            "name": "lng",
                             "args": null,
                             "storageKey": null
                           }
@@ -515,31 +601,6 @@ return {
                 "storageKey": null
               }
             ]
-          },
-          {
-            "kind": "LinkedField",
-            "alias": null,
-            "name": "stats",
-            "storageKey": null,
-            "args": null,
-            "concreteType": "HotelAvailabilityStats",
-            "plural": false,
-            "selections": [
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "maxPrice",
-                "args": null,
-                "storageKey": null
-              },
-              {
-                "kind": "ScalarField",
-                "alias": null,
-                "name": "minPrice",
-                "args": null,
-                "storageKey": null
-              }
-            ]
           }
         ]
       },
@@ -561,5 +622,5 @@ return {
 };
 })();
 // prettier-ignore
-(node/*: any*/).hash = 'a35f3bd14a79f1e482e2fbba8600f0b9';
+(node/*: any*/).hash = '3a9e23378de48e0a14e479a64e1cc4bd';
 module.exports = node;
diff --git a/app/hotels/src/map/allHotels/MapScreen.js b/app/hotels/src/map/allHotels/MapScreen.js
index caefeef1..ed70e778 100644
--- a/app/hotels/src/map/allHotels/MapScreen.js
+++ b/app/hotels/src/map/allHotels/MapScreen.js
@@ -24,9 +24,7 @@ class MapScreen extends React.Component<Props, State> {
     selectedHotelIndex: 0,
   };
 
-  getHotels = () => {
-    return idx(this.props, _ => _.data.allAvailableHotels.edges) || [];
-  };
+  getHotels = () => this.props.data || [];
 
   selectMarker = (selectedHotelIndex: number) => {
     if (this.state.selectedHotelIndex === selectedHotelIndex) {
@@ -85,32 +83,12 @@ const styles = StyleSheet.create({
 export default createFragmentContainer(
   MapScreen,
   graphql`
-    fragment MapScreen on RootQuery {
-      allAvailableHotels(
-        search: $search
-        filter: $filter
-        options: $options
-        first: $first
-        after: $after
-      ) @connection(key: "AllHotels_allAvailableHotels") {
-        pageInfo {
-          hasNextPage
-          hasPreviousPage
-          startCursor
-          endCursor
-        }
-        edges {
-          node {
-            id
-          }
-          ...MapView
-          ...HotelSwipeList
-        }
-        stats {
-          maxPrice
-          minPrice
-        }
+    fragment MapScreen on HotelAvailabilityEdge @relay(plural: true) {
+      node {
+        id
       }
+      ...MapView
+      ...HotelSwipeList
     }
   `,
 );
diff --git a/app/hotels/src/map/allHotels/NewAllHotelsMap.js b/app/hotels/src/map/allHotels/NewAllHotelsMap.js
deleted file mode 100644
index 349c63e9..00000000
--- a/app/hotels/src/map/allHotels/NewAllHotelsMap.js
+++ /dev/null
@@ -1,117 +0,0 @@
-// @flow strict
-
-import * as React from 'react';
-import { View } from 'react-native';
-import { graphql, PublicApiRenderer } from '@kiwicom/mobile-relay';
-import { DateFormatter } from '@kiwicom/mobile-localization';
-import { StyleSheet, AdaptableLayout } from '@kiwicom/mobile-shared';
-import {
-  type NavigationType,
-  withNavigation,
-} from '@kiwicom/mobile-navigation';
-
-import FilterStripe from '../../filter/FilterStripe';
-import {
-  withHotelsContext,
-  type RoomConfigurationType,
-} from '../../HotelsContext';
-import HotelsFilterContext from '../../HotelsFilterContext';
-import MapScreen from './MapScreen';
-import { sanitizeHotelFacilities } from '../../GraphQLSanitizers';
-import type { NewAllHotelsMapQueryResponse } from './__generated__/NewAllHotelsMapQuery.graphql';
-
-type Props = {|
-  +cityId: string,
-  +checkin: Date | null,
-  +checkout: Date | null,
-  +currency: string,
-  +roomsConfiguration: RoomConfigurationType,
-  +navigation: NavigationType,
-|};
-
-class NewAllHotelsMap extends React.Component<Props> {
-  openSingleHotel = (hotelId: string) => {
-    this.props.navigation.navigate('SingleHotel', {
-      hotelId,
-      checkin: this.props.checkin,
-      checkout: this.props.checkout,
-      roomsConfiguration: this.props.roomsConfiguration,
-    });
-  };
-
-  renderInnerComponent = (props: NewAllHotelsMapQueryResponse) => (
-    <MapScreen data={props} onOpenSingleHotel={this.openSingleHotel} />
-  );
-
-  render = () => {
-    const {
-      checkin,
-      checkout,
-      cityId,
-      currency,
-      roomsConfiguration,
-    } = this.props;
-    if (checkin === null || checkout === null) {
-      return null;
-    }
-    return (
-      <HotelsFilterContext.Consumer>
-        {({ filterParams }) => (
-          <View style={styles.container}>
-            <AdaptableLayout renderOnNarrow={<FilterStripe />} />
-            <PublicApiRenderer
-              query={graphql`
-                query NewAllHotelsMapQuery(
-                  $search: HotelsSearchInput!
-                  $filter: HotelsFilterInput
-                  $options: AvailableHotelOptionsInput
-                  $first: Int
-                  $after: String
-                ) {
-                  ...MapScreen
-                }
-              `}
-              variables={{
-                search: {
-                  cityId,
-                  roomsConfiguration,
-                  checkin: DateFormatter(checkin).formatForMachine(),
-                  checkout: DateFormatter(checkout).formatForMachine(),
-                },
-                filter: {
-                  ...filterParams,
-                  hotelFacilities: sanitizeHotelFacilities(
-                    filterParams.hotelFacilities,
-                  ),
-                },
-                first: 50,
-                options: {
-                  currency,
-                },
-              }}
-              render={this.renderInnerComponent}
-            />
-          </View>
-        )}
-      </HotelsFilterContext.Consumer>
-    );
-  };
-}
-
-const styles = StyleSheet.create({
-  container: {
-    ...StyleSheet.absoluteFillObject,
-  },
-});
-
-export default withNavigation(
-  withHotelsContext(
-    ({ checkin, checkout, cityId, currency, roomsConfiguration }) => ({
-      checkin,
-      checkout,
-      cityId,
-      currency,
-      roomsConfiguration,
-    }),
-  )(NewAllHotelsMap),
-);
diff --git a/app/hotels/src/map/allHotels/__generated__/MapScreen.graphql.js b/app/hotels/src/map/allHotels/__generated__/MapScreen.graphql.js
index 55a385da..5018dade 100644
--- a/app/hotels/src/map/allHotels/__generated__/MapScreen.graphql.js
+++ b/app/hotels/src/map/allHotels/__generated__/MapScreen.graphql.js
@@ -12,223 +12,55 @@ type HotelSwipeList$ref = any;
 type MapView$ref = any;
 import type { FragmentReference } from "relay-runtime";
 declare export opaque type MapScreen$ref: FragmentReference;
-export type MapScreen = {|
-  +allAvailableHotels: ?{|
-    +pageInfo: {|
-      +hasNextPage: boolean,
-      +hasPreviousPage: boolean,
-      +startCursor: ?string,
-      +endCursor: ?string,
-    |},
-    +edges: ?$ReadOnlyArray<?{|
-      +node: ?{|
-        +id: string
-      |},
-      +$fragmentRefs: MapView$ref & HotelSwipeList$ref,
-    |}>,
-    +stats: ?{|
-      +maxPrice: ?number,
-      +minPrice: ?number,
-    |},
+export type MapScreen = $ReadOnlyArray<{|
+  +node: ?{|
+    +id: string
   |},
+  +$fragmentRefs: MapView$ref & HotelSwipeList$ref,
   +$refType: MapScreen$ref,
-|};
+|}>;
 */
 
 
 const node/*: ConcreteFragment*/ = {
   "kind": "Fragment",
   "name": "MapScreen",
-  "type": "RootQuery",
+  "type": "HotelAvailabilityEdge",
   "metadata": {
-    "connection": [
-      {
-        "count": "first",
-        "cursor": "after",
-        "direction": "forward",
-        "path": [
-          "allAvailableHotels"
-        ]
-      }
-    ]
+    "plural": true
   },
-  "argumentDefinitions": [
-    {
-      "kind": "RootArgument",
-      "name": "search",
-      "type": "HotelsSearchInput!"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "filter",
-      "type": "HotelsFilterInput"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "options",
-      "type": "AvailableHotelOptionsInput"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "first",
-      "type": "Int"
-    },
-    {
-      "kind": "RootArgument",
-      "name": "after",
-      "type": "String"
-    }
-  ],
+  "argumentDefinitions": [],
   "selections": [
     {
       "kind": "LinkedField",
-      "alias": "allAvailableHotels",
-      "name": "__AllHotels_allAvailableHotels_connection",
+      "alias": null,
+      "name": "node",
       "storageKey": null,
-      "args": [
-        {
-          "kind": "Variable",
-          "name": "filter",
-          "variableName": "filter",
-          "type": "HotelsFilterInput"
-        },
-        {
-          "kind": "Variable",
-          "name": "options",
-          "variableName": "options",
-          "type": "AvailableHotelOptionsInput"
-        },
-        {
-          "kind": "Variable",
-          "name": "search",
-          "variableName": "search",
-          "type": "HotelsSearchInput!"
-        }
-      ],
-      "concreteType": "HotelAvailabilityConnection",
+      "args": null,
+      "concreteType": "HotelAvailability",
       "plural": false,
       "selections": [
         {
-          "kind": "LinkedField",
-          "alias": null,
-          "name": "pageInfo",
-          "storageKey": null,
-          "args": null,
-          "concreteType": "PageInfo",
-          "plural": false,
-          "selections": [
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "hasNextPage",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "hasPreviousPage",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "startCursor",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "endCursor",
-              "args": null,
-              "storageKey": null
-            }
-          ]
-        },
-        {
-          "kind": "LinkedField",
-          "alias": null,
-          "name": "edges",
-          "storageKey": null,
-          "args": null,
-          "concreteType": "HotelAvailabilityEdge",
-          "plural": true,
-          "selections": [
-            {
-              "kind": "LinkedField",
-              "alias": null,
-              "name": "node",
-              "storageKey": null,
-              "args": null,
-              "concreteType": "HotelAvailability",
-              "plural": false,
-              "selections": [
-                {
-                  "kind": "ScalarField",
-                  "alias": null,
-                  "name": "id",
-                  "args": null,
-                  "storageKey": null
-                },
-                {
-                  "kind": "ScalarField",
-                  "alias": null,
-                  "name": "__typename",
-                  "args": null,
-                  "storageKey": null
-                }
-              ]
-            },
-            {
-              "kind": "FragmentSpread",
-              "name": "MapView",
-              "args": null
-            },
-            {
-              "kind": "FragmentSpread",
-              "name": "HotelSwipeList",
-              "args": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "cursor",
-              "args": null,
-              "storageKey": null
-            }
-          ]
-        },
-        {
-          "kind": "LinkedField",
+          "kind": "ScalarField",
           "alias": null,
-          "name": "stats",
-          "storageKey": null,
+          "name": "id",
           "args": null,
-          "concreteType": "HotelAvailabilityStats",
-          "plural": false,
-          "selections": [
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "maxPrice",
-              "args": null,
-              "storageKey": null
-            },
-            {
-              "kind": "ScalarField",
-              "alias": null,
-              "name": "minPrice",
-              "args": null,
-              "storageKey": null
-            }
-          ]
+          "storageKey": null
         }
       ]
+    },
+    {
+      "kind": "FragmentSpread",
+      "name": "MapView",
+      "args": null
+    },
+    {
+      "kind": "FragmentSpread",
+      "name": "HotelSwipeList",
+      "args": null
     }
   ]
 };
 // prettier-ignore
-(node/*: any*/).hash = '784e78cbe86098d5ca9d79e58e7ff1bd';
+(node/*: any*/).hash = '2126f43c3311a7ac2f147083c81044c5';
 module.exports = node;
diff --git a/app/hotels/src/navigation/HotelsNavigationStack.js b/app/hotels/src/navigation/HotelsNavigationStack.js
index 3a0f864d..f038323e 100644
--- a/app/hotels/src/navigation/HotelsNavigationStack.js
+++ b/app/hotels/src/navigation/HotelsNavigationStack.js
@@ -14,7 +14,6 @@ import { Translation } from '@kiwicom/mobile-localization';
 
 import SingleHotel from './singleHotel/SingleHotelNavigationScreen';
 import SearchResults from './allHotels/SearchResultsScreen';
-import NewAllHotelsMap from './allHotelsMap/NewAllHotelsMapNavigationScreen';
 import AdditionalPropsInjector from './singleHotel/AdditionalPropsInjector';
 import SingleHotelMapNavigationScreen from './singleHotel/SingleHotelMapNavigationScreen';
 import Payment from '../singleHotel/PaymentScreen';
@@ -39,16 +38,6 @@ export default StackNavigator(
         ...createTransparentHeaderStyle(RNDimensions.get('screen')),
       },
     },
-    AllHotelsMap: {
-      screen: withMappedProps(NewAllHotelsMap),
-      navigationOptions: {
-        headerTitle: (
-          <HeaderTitle>
-            <Translation id="hotels.navigation.title.all_hotels_map" />
-          </HeaderTitle>
-        ),
-      },
-    },
     GalleryGrid: {
       screen: withMappedProps(GalleryGrid, AdditionalPropsInjector),
     },
diff --git a/app/hotels/src/navigation/allHotelsMap/NewAllHotelsMapNavigationScreen.js b/app/hotels/src/navigation/allHotelsMap/NewAllHotelsMapNavigationScreen.js
deleted file mode 100644
index 3eb35718..00000000
--- a/app/hotels/src/navigation/allHotelsMap/NewAllHotelsMapNavigationScreen.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// @flow strict
-
-import * as React from 'react';
-import { type NavigationType } from '@kiwicom/mobile-navigation';
-
-import NewAllHotelsMap from '../../map/allHotels/NewAllHotelsMap';
-import HotelsNavigationOptions from '../HotelsNavigationOptions';
-import { withHotelsContext } from '../../HotelsContext';
-
-type Props = {|
-  +navigation: NavigationType,
-  +cityName: string,
-  +checkin: string,
-  +checkout: string,
-|};
-
-class NewAllHotelsMapNavigationScreen extends React.Component<Props> {
-  static navigationOptions = ({ checkin, checkout, cityName }: Props) => {
-    return {
-      ...HotelsNavigationOptions({
-        checkin,
-        checkout,
-        cityName,
-      }),
-    };
-  };
-
-  render = () => <NewAllHotelsMap />;
-}
-
-export default withHotelsContext(({ checkin, checkout, cityName }) => ({
-  checkin,
-  checkout,
-  cityName,
-}))(NewAllHotelsMapNavigationScreen);


Test patch:
diff --git a/app/hotels/src/allHotels/__tests__/AllHotelsSearchList.test.js b/app/hotels/src/allHotels/__tests__/AllHotelsSearchList.test.js
index 98936cf2..81b7e457 100644
--- a/app/hotels/src/allHotels/__tests__/AllHotelsSearchList.test.js
+++ b/app/hotels/src/allHotels/__tests__/AllHotelsSearchList.test.js
@@ -7,86 +7,50 @@ import { AllHotelsSearchList } from '../AllHotelsSearchList';
 
 const renderer = new ShallowRenderer();
 const voidCallback = () => {};
-const setLocation = jest.fn();
-const relay = {
-  hasMore: jest.fn(),
-  loadMore: jest.fn(),
-  isLoading: jest.fn(),
-  refetchConnection: jest.fn(),
-};
 
+const $fragmentRefs: any = null;
+const $refType: any = null;
 it('renders found hotels', () => {
-  const data = {
-    allAvailableHotels: {
-      edges: [
-        {
-          node: {
-            id: 'hotel1',
-          },
-        },
-        {
-          node: {
-            id: 'hotel2',
-          },
-        },
-      ],
-      stats: {
-        priceMax: 9000,
-        priceMin: 200,
+  const data = [
+    {
+      node: {
+        id: 'hotel1',
+        $fragmentRefs,
       },
+      $fragmentRefs,
+      $refType,
     },
-  };
+    {
+      node: {
+        id: 'hotel2',
+        $fragmentRefs,
+      },
+      $fragmentRefs,
+      $refType,
+    },
+  ];
 
   renderer.render(
-    <AllHotelsSearchList
-      data={data}
-      openSingleHotel={voidCallback}
-      setCurrentSearchStats={jest.fn()}
-      relay={relay}
-      setLocation={setLocation}
-    />,
+    <AllHotelsSearchList data={data} openSingleHotel={voidCallback} />,
   );
   expect(renderer.getRenderOutput()).toMatchSnapshot();
 });
 
 it('renders a "not found" message when no hotel is found', () => {
-  const data = {
-    edges: [],
-    stats: {
-      priceMax: 0,
-      priceMin: 0,
-    },
-  };
+  const data = [];
 
   renderer.render(
-    <AllHotelsSearchList
-      data={data}
-      openSingleHotel={voidCallback}
-      setCurrentSearchStats={jest.fn()}
-      relay={relay}
-      setLocation={setLocation}
-    />,
+    <AllHotelsSearchList data={data} openSingleHotel={voidCallback} />,
   );
   expect(renderer.getRenderOutput()).toMatchSnapshot();
 });
 
 it('renders a "not found" message when data is missing', () => {
-  const data = {
-    edges: null,
-    stats: {
-      priceMax: 9000,
-      priceMin: 200,
-    },
-  };
+  const data = null;
 
   renderer.render(
-    <AllHotelsSearchList
-      data={data}
-      openSingleHotel={voidCallback}
-      setCurrentSearchStats={jest.fn()}
-      relay={relay}
-      setLocation={setLocation}
-    />,
+    // $FlowExpectedError: Testing bad input
+    <AllHotelsSearchList data={data} openSingleHotel={voidCallback} />,
   );
   expect(renderer.getRenderOutput()).toMatchSnapshot();
 });
diff --git a/app/hotels/src/allHotels/__tests__/RenderSearchResults.test.js b/app/hotels/src/allHotels/__tests__/RenderSearchResults.test.js
new file mode 100644
index 00000000..d2e56870
--- /dev/null
+++ b/app/hotels/src/allHotels/__tests__/RenderSearchResults.test.js
@@ -0,0 +1,74 @@
+// @flow
+
+import { Logger } from '@kiwicom/mobile-shared';
+import { Animated } from 'react-native';
+
+import {
+  RenderSearchResults,
+  topValue,
+  lowValue,
+} from '../RenderSearchResults';
+
+const defaultProps = (stats: Object = { maxPrice: 100, minPrice: 50 }) => ({
+  show: 'list',
+  setCurrentSearchStats: jest.fn(),
+  data: {
+    allAvailableHotels: {
+      stats,
+    },
+  },
+});
+
+it('it initiales correctly when it should show list', () => {
+  // $FlowExpectedError: Passing only props needed for this test
+  const Component = new RenderSearchResults(defaultProps());
+  expect(Component.mapAnimation).toEqual(new Animated.Value(topValue));
+  expect(Component.listAnimation).toEqual(new Animated.Value(0));
+});
+
+it('it initiales correctly when it should show list', () => {
+  // $FlowExpectedError: Passing only props needed for this test
+  const Component = new RenderSearchResults({ show: 'map' });
+  expect(Component.mapAnimation).toEqual(new Animated.Value(0));
+  expect(Component.listAnimation).toEqual(new Animated.Value(lowValue));
+});
+
+it('calls Logger when mounted', () => {
+  const spy = jest.spyOn(Logger, 'ancillaryDisplayed');
+  // $FlowExpectedError: Passing only props needed for this test
+  const Component = new RenderSearchResults(defaultProps());
+  Component.componentDidMount();
+  expect(spy).toHaveBeenCalled();
+});
+
+it('calls setCurrentSearchStats when minPrice and maxPrice are defined', () => {
+  const props = defaultProps();
+  // $FlowExpectedError: Passing only props needed for this test
+  const Component = new RenderSearchResults(props);
+  Component.componentDidMount();
+  expect(props.setCurrentSearchStats).toHaveBeenCalled();
+});
+
+it('calls setCurrentSearchStats when minPrice and maxPrice are 0', () => {
+  const props = defaultProps({ minPrice: 0, maxPrice: 0 });
+  // $FlowExpectedError: Passing only props needed for this test
+  const Component = new RenderSearchResults(props);
+  Component.componentDidMount();
+  expect(props.setCurrentSearchStats).toHaveBeenCalled();
+});
+
+it('calls does not call setCurrentSearchStats when minPrice is null', () => {
+  const props = defaultProps({ minPrice: null, maxPrice: 10 });
+  // $FlowExpectedError: Passing only props needed for this test
+  const Component = new RenderSearchResults(props);
+  Component.componentDidMount();
+  expect(props.setCurrentSearchStats).not.toHaveBeenCalled();
+});
+
+it('calls does not call setCurrentSearchStats when maxPrice is null', () => {
+  const props = defaultProps({ minPrice: 3, maxPrice: null });
+  // $FlowExpectedError: Passing only props needed for this test
+  const Component = new RenderSearchResults(props);
+  Component.componentDidMount();
+  expect(props.setCurrentSearchStats).not.toHaveBeenCalled();
+});
diff --git a/app/hotels/src/allHotels/__tests__/__snapshots__/AllHotelsSearchList.test.js.snap b/app/hotels/src/allHotels/__tests__/__snapshots__/AllHotelsSearchList.test.js.snap
index 36294378..7d25a2be 100644
--- a/app/hotels/src/allHotels/__tests__/__snapshots__/AllHotelsSearchList.test.js.snap
+++ b/app/hotels/src/allHotels/__tests__/__snapshots__/AllHotelsSearchList.test.js.snap
@@ -21,16 +21,11 @@ exports[`renders a "not found" message when no hotel is found 1`] = `
 `;
 
 exports[`renders found hotels 1`] = `
-<ScrollView
-  contentContainerStyle={
-    Object {
-      "paddingBottom": 44,
-    }
-  }
->
+<React.Fragment>
   <ForwardRef(Relay(AllHotelsSearchRowWithContext))
     data={
       Object {
+        "$fragmentRefs": null,
         "id": "hotel1",
       }
     }
@@ -39,10 +34,11 @@ exports[`renders found hotels 1`] = `
   <ForwardRef(Relay(AllHotelsSearchRowWithContext))
     data={
       Object {
+        "$fragmentRefs": null,
         "id": "hotel2",
       }
     }
     openSingleHotel={[Function]}
   />
-</ScrollView>
+</React.Fragment>
 `;