Question: If I have a bottom tab navigator and I the screens within that navigator to navigate to a modal which will be truly full-screen (covering `SafeAreaView`), how do i I do that? From what i understand, `AppContainer` has to be rendered within `SafeAreaView`, if I'm using `SafeAreaView`. So that makes it tricky to use a modal outside of `SafeAreaView`. 

```
const Tabs = createBottomTabNavigator(
  {
    Home,
    ScreenA,
    ScreenB,
    ScreenC,
  },
  {
    tabBarOptions: {
      safeAreaInset: { bottom: 'never' },
    },
  }
);

const TabsAndModal = createStackNavigator(
  {
    Tabs,
    Modal,
  },
  {
    mode: 'modal',
    headerMode: 'none',
    initialRouteName: 'Tabs',
  },
);

const AppContainer = createAppContainer(TabsAndModal);

const App = () => {
  return (
    <SafeAreaView style={{ flex: 1, backgroundColor: 'blue' }}>
      <AppContainer />
    </SafeAreaView>
  );
};

```

This causes the modal to slide up from the bottom, but it starts at the `SafeAreaView` on an iphone X, so the blue background is visible just below. What is the right way to do this, so that the modal slides up from the very bottom of an an iphone x and the tabs are still rendered within `SafeAreaView`?

Answer: 
You could also use events and make the whole flow async. In this scenario microservice1 creates an event representing the user request and then return a requested created response immediately to the user. You can then notify the user later when the request is finished processing.

I recommend the book *Designing Event-Driven Systems* written by Ben Stopford.
I asked a similar question to Chris Richardson ([www.microservices.io](http://www.microservices.io)). The result was:

#### Option 1

You use something like websockets, so the microservice1 can send the response, when it's done.

#### Option 2

microservice1 responds immediately (OK - request accepted). The client pulls from the server repeatedly until the state changed. Important is that microservice1 stores some state about the request (ie. initial state "accepted", so the client can show the spinner) which is modified, when you finally receive the response (ie. update state to "complete").