mirror of
https://github.com/status-im/react-navigation.git
synced 2025-02-25 09:35:19 +00:00
* add NavigationEvents * expose TabsWithNavigationEvents in lib entrypoints * Add NavigationEvents example in playground * Add NavigationEvents example in playground * Add NavigationEvents tests * Add NavigationEvents Flow declarations * remove useless NavigationEvents constructor * NavigationEvents => make tests more readable by avoiding beforeEach callback * fix flow test error by adding <any, any> to React.Component
128 lines
3.1 KiB
JavaScript
128 lines
3.1 KiB
JavaScript
/**
|
|
* @flow
|
|
*/
|
|
|
|
import React from 'react';
|
|
import { FlatList, SafeAreaView, StatusBar, Text, View } from 'react-native';
|
|
import { NavigationEvents } from 'react-navigation';
|
|
import { createMaterialBottomTabNavigator } from 'react-navigation-material-bottom-tabs';
|
|
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
|
|
|
|
const Event = ({ event }) => (
|
|
<View
|
|
style={{
|
|
borderColor: 'grey',
|
|
borderWidth: 1,
|
|
borderRadius: 3,
|
|
padding: 5,
|
|
flexDirection: 'row',
|
|
alignItems: 'center',
|
|
justifyContent: 'space-between',
|
|
}}
|
|
>
|
|
<Text>{event.type}</Text>
|
|
<Text>
|
|
{event.action.type.replace('Navigation/', '')}
|
|
{event.action.routeName ? '=>' + event.action.routeName : ''}
|
|
</Text>
|
|
</View>
|
|
);
|
|
|
|
const createTabScreen = (name, icon, focusedIcon) => {
|
|
class TabScreen extends React.Component<any, any> {
|
|
static navigationOptions = {
|
|
tabBarLabel: name,
|
|
tabBarIcon: ({ tintColor, focused }) => (
|
|
<MaterialCommunityIcons
|
|
name={focused ? focusedIcon : icon}
|
|
size={26}
|
|
style={{ color: focused ? tintColor : '#ccc' }}
|
|
/>
|
|
),
|
|
};
|
|
|
|
state = { eventLog: [] };
|
|
|
|
append = navigationEvent => {
|
|
this.setState(({ eventLog }) => ({
|
|
eventLog: eventLog.concat(navigationEvent),
|
|
}));
|
|
};
|
|
|
|
render() {
|
|
return (
|
|
<SafeAreaView
|
|
forceInset={{ horizontal: 'always', top: 'always' }}
|
|
style={{
|
|
flex: 1,
|
|
}}
|
|
>
|
|
<Text
|
|
style={{
|
|
margin: 10,
|
|
marginTop: 30,
|
|
fontSize: 30,
|
|
fontWeight: 'bold',
|
|
}}
|
|
>
|
|
Events for tab {name}
|
|
</Text>
|
|
|
|
<View style={{ flex: 1, width: '100%', marginTop: 10 }}>
|
|
<FlatList
|
|
data={this.state.eventLog}
|
|
keyExtractor={item => `${this.state.eventLog.indexOf(item)}`}
|
|
renderItem={({ item }) => (
|
|
<View
|
|
style={{
|
|
marginVertical: 5,
|
|
marginHorizontal: 10,
|
|
backgroundColor: '#e4e4e4',
|
|
}}
|
|
>
|
|
<Event event={item} />
|
|
</View>
|
|
)}
|
|
/>
|
|
</View>
|
|
|
|
<NavigationEvents
|
|
onWillFocus={this.append}
|
|
onDidFocus={this.append}
|
|
onWillBlur={this.append}
|
|
onDidBlur={this.append}
|
|
/>
|
|
|
|
<StatusBar barStyle="default" />
|
|
</SafeAreaView>
|
|
);
|
|
}
|
|
}
|
|
|
|
return TabScreen;
|
|
};
|
|
|
|
const TabsWithNavigationEvents = createMaterialBottomTabNavigator(
|
|
{
|
|
One: {
|
|
screen: createTabScreen('One', 'numeric-1-box-outline', 'numeric-1-box'),
|
|
},
|
|
Two: {
|
|
screen: createTabScreen('Two', 'numeric-2-box-outline', 'numeric-2-box'),
|
|
},
|
|
Three: {
|
|
screen: createTabScreen(
|
|
'Three',
|
|
'numeric-3-box-outline',
|
|
'numeric-3-box'
|
|
),
|
|
},
|
|
},
|
|
{
|
|
shifting: false,
|
|
activeTintColor: '#F44336',
|
|
}
|
|
);
|
|
|
|
export default TabsWithNavigationEvents;
|