StacksOverTopTabs.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * @flow
  3. */
  4. import React from 'react';
  5. import { View, ScrollView, StatusBar, StyleSheet } from 'react-native';
  6. import {
  7. SafeAreaView,
  8. createStackNavigator,
  9. createMaterialTopTabNavigator,
  10. } from 'react-navigation';
  11. import { Constants } from 'expo';
  12. import { MaterialTopTabBar } from 'react-navigation-tabs';
  13. import SampleText from './SampleText';
  14. import { Button } from './commonComponents/ButtonWithMargin';
  15. const HEADER_HEIGHT = 64;
  16. const MyNavScreen = ({ navigation, banner, statusBarStyle }) => (
  17. <ScrollView>
  18. <SafeAreaView forceInset={{ horizontal: 'always' }}>
  19. <SampleText>{banner}</SampleText>
  20. <Button
  21. onPress={() => navigation.navigate('Profile', { name: 'Jordan' })}
  22. title="Open profile screen"
  23. />
  24. <Button
  25. onPress={() => navigation.navigate('NotifSettings')}
  26. title="Open notifications screen"
  27. />
  28. <Button
  29. onPress={() => navigation.navigate('SettingsTab')}
  30. title="Go to settings tab"
  31. />
  32. <Button onPress={() => navigation.goBack(null)} title="Go back" />
  33. </SafeAreaView>
  34. <StatusBar barStyle={statusBarStyle || 'default'} />
  35. </ScrollView>
  36. );
  37. const MyHomeScreen = ({ navigation }) => (
  38. <MyNavScreen
  39. banner="Home Screen"
  40. navigation={navigation}
  41. statusBarStyle="light-content"
  42. />
  43. );
  44. const MyProfileScreen = ({ navigation }) => (
  45. <MyNavScreen
  46. banner={`${navigation.state.params.name}s Profile`}
  47. navigation={navigation}
  48. />
  49. );
  50. const MyNotificationsSettingsScreen = ({ navigation }) => (
  51. <MyNavScreen banner="Notifications Screen" navigation={navigation} />
  52. );
  53. const MySettingsScreen = ({ navigation }) => (
  54. <MyNavScreen
  55. banner="Settings Screen"
  56. navigation={navigation}
  57. statusBarStyle="light-content"
  58. />
  59. );
  60. const styles = StyleSheet.create({
  61. stackHeader: {
  62. height: HEADER_HEIGHT,
  63. },
  64. tab: {
  65. height: HEADER_HEIGHT,
  66. },
  67. });
  68. function MaterialTopTabBarWithStatusBar(props) {
  69. return (
  70. <View
  71. style={{
  72. paddingTop: Constants.statusBarHeight,
  73. backgroundColor: '#2196f3',
  74. }}
  75. >
  76. <MaterialTopTabBar {...props} jumpToIndex={() => {}} />
  77. </View>
  78. );
  79. }
  80. const TabNavigator = createMaterialTopTabNavigator(
  81. {
  82. MainTab: {
  83. screen: MyHomeScreen,
  84. navigationOptions: {
  85. title: 'Welcome',
  86. },
  87. },
  88. SettingsTab: {
  89. screen: MySettingsScreen,
  90. navigationOptions: {
  91. title: 'Settings',
  92. },
  93. },
  94. },
  95. {
  96. tabBarComponent: MaterialTopTabBarWithStatusBar,
  97. tabBarOptions: {
  98. tabStyle: styles.tab,
  99. },
  100. }
  101. );
  102. const StackNavigator = createStackNavigator(
  103. {
  104. Root: {
  105. screen: TabNavigator,
  106. navigationOptions: {
  107. header: null,
  108. },
  109. },
  110. NotifSettings: {
  111. screen: MyNotificationsSettingsScreen,
  112. navigationOptions: {
  113. title: 'Notifications',
  114. },
  115. },
  116. Profile: {
  117. screen: MyProfileScreen,
  118. navigationOptions: ({ navigation }) => ({
  119. title: `${navigation.state.params.name}'s Profile!`,
  120. }),
  121. },
  122. },
  123. {
  124. navigationOptions: {
  125. headerStyle: styles.stackHeader,
  126. },
  127. }
  128. );
  129. export default StackNavigator;