# Technologies Used

The components of the App are built using the core components of [React Native](https://github.com/facebook/react-native). The theme also constantly incorporates various other latest technologies.

* [React Native](/olo-full-app/customer-app/technologies-used.md#react-native)
* [Expo](/olo-full-app/customer-app/technologies-used.md#nativebase)
* [React Navigation](/olo-full-app/customer-app/technologies-used.md#nativebase-1)
* [Apollo GraphQL](/olo-full-app/customer-app/technologies-used.md#nativebase-2)

### [React Native](https://github.com/facebook/react-native) <a href="#react-native" id="react-native"></a>

React Native helps in making the development work easier and allowing the developers to focus on the core app features in every new release. It is the fastest-developing mobile app development that essentially permits you to create an isolated product with often outcomes. The hymn of React Native — **learn once, write anywhere**. React Native takes charge of the view controllers and programatically generates native views using javascript. This means that you can have all the speed and power of a native application, with the ease of development that comes with React.

### [Expo](https://expo.io/) <a href="#nativebase" id="nativebase"></a>

[Expo](https://expo.io/) is used to make react native applications. It provides a set of tools that simplify the development and testing of React Native app and arms you with the components of users interface and services that are usually available in third-party native React Native components. With Expo you can find all of them in Expo SDK.

OLO is build using [Expo](https://expo.io/) it is powered with  [Expo SDK](https://docs.expo.io/versions/latest/sdk/overview/) to give you access to your device capabilities and the Expo services to handle the heavy lifting of building your app binary and uploading it to the store, all without you touching Xcode or Android Studio. With the "bare" workflow, we also speed up your development with the [Expo SDK](https://docs.expo.io/versions/latest/sdk/overview/) and React Native, and you have full control over your iOS and Android projects.

### [React Navigation](https://reactnavigation.org/) <a href="#nativebase" id="nativebase"></a>

React Navigation is used for routing and navigation in React Native apps. Navigator has some common elements which Enatega uses.

* **Drawer Navigator** \
  It is used to make a drawer when a user swipes from left to right or presses the drawer icon<br>
* **Stack Navigator**\
  Stack Navigator stacks screens on top of each other and only one screen is shown at a time<br>
* **Switch Navigator**\
  Switch Navigator is used for the authentication flow inside application. Currently no authentication happens in Enatega but for good practice all routing related to authentication is made using this

### [Apollo GraphQL](https://www.apollographql.com/) <a href="#nativebase" id="nativebase"></a>

[GraphQL](https://graphql.org) is a substitute for [REST](https://restfulapi.net/rest-architectural-constraints/) architecture modern applications aren't fit for [REST](https://restfulapi.net/rest-architectural-constraints/). The reason is the point-to-point nature of [REST](https://restfulapi.net/rest-architectural-constraints/), a procedural API technology, forces the authors of services and clients to coordinate each use case ahead of time. When frontend teams must constantly ask backend teams for new endpoints, often with each new screen in an app, development is dramatically slowed down. Both teams need to move fast independently.

For Application level state management conventionally [Redux](https://redux.js.org/) is used but in our app we have used [Apollo's](https://www.apollographql.com/) built in state management. The problem with [Redux](https://redux.js.org/) is too much boiler code which bloats code and has a strong learning curve for new user. Since we are already using [Apollo](https://www.apollographql.com/) for replacement to [REST](https://restfulapi.net/rest-architectural-constraints/) without using any third party state management libraries we have used it's built in State management provided by Apollo Client. Our application is a medium size application and works very well with it.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://listing-nb.gitbook.io/olo-full-app/customer-app/technologies-used.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
