import React, {Component, PropTypes} from 'react'; import { Text, View, ScrollView, TouchableOpacity, StyleSheet, TextInput, Alert } from 'react-native'; import {connect} from 'react-redux'; import * as counterActions from '../reducers/counter/actions'; const leftButtons = ['back', 'cancel', 'accept', 'sideMenu']; let bottomTabsVisible = true; // this is a traditional React component connected to the redux store class PushedScreen extends Component { static navigatorStyle = { statusBarColor: '#303F9F', toolBarColor: '#3F51B5', navigationBarColor: '#303F9F', tabSelectedTextColor: '#FFA000', tabNormalTextColor: '#FFC107', tabIndicatorColor: '#FF4081' }; static navigatorButtons = { leftButton: { id: 'back', color: '#00ff00' } }; constructor(props) { super(props); this.bgColor = this.getRandomColor(); console.log(`constructor ${this.bgColor}`); this.props.navigator.setOnNavigatorEvent(this.onNavigatorEvent.bind(this)); this.currentBackButton = 0; } componentWillUnmount() { console.log(`componentWillUnmount ${this.bgColor}`); } getRandomColor() { var letters = '0123456789ABCDEF'.split(''); var color = '#'; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; } onNavigatorEvent(event) { switch (event.id) { case 'cancel': Alert.alert('NavBar', 'Cancel button pressed'); break; case 'accept': Alert.alert('NavBar', 'Accept button pressed'); break; } } render() { return ( Counter: {this.props.counter.count} Increment Counter Push Another Pop Screen Modal Screen Dismiss modal Dismiss all modals Pop to root New Stack Change Left Button Toggle BottomTabs String prop: {this.props.str} Number prop: {this.props.num} {this.props.obj ? Object prop: {this.props.obj.str} : false} {this.props.obj && this.props.obj.arr ? Array prop: {this.props.obj.arr[0].str} : false} ); } onIncrementPress() { this.props.dispatch(counterActions.increment()); } onPushPress() { this.props.navigator.push({ title: "List", screen: "example.ListScreen", passProps: { passed: 'This is a prop passed in \'navigator.push()\'!', obj: { str: 'This is a prop passed in an object!', arr: [ { str: 'This is a prop in an object in an array in an object!' } ] }, num: 1234 } }); } onPopPress() { this.props.navigator.pop(); } onShowModalPress() { this.props.navigator.showModal({ title: "Modal Screen", screen: "example.PushedScreen", passProps: { passed: 'This is a prop passed in \'navigator.showModal()\'!', obj: { str: 'This is a prop passed in an object!', arr: [ { str: 'This is a prop in an object in an array in an object!' } ] }, num: 1234 } }); } onDismissAllModalsPress() { this.props.navigator.dismissAllModals(); } onDismissModal() { this.props.navigator.dismissModal(); } onPopToRootPress() { this.props.navigator.popToRoot(); } onNewStackPress() { this.props.navigator.resetTo({ title: "NEW STACK", screen: "example.PushedScreen", passProps: { passed: 'This is a prop passed in \'navigator.push()\'!', obj: { str: 'This is a prop passed in an object!', arr: [ { str: 'This is a prop in an object in an array in an object!' } ] }, num: 1234 } }); } onChangeLeftButtonPress() { this.props.navigator.setButtons({ leftButton: { id: leftButtons[this.currentBackButton] } }); this.currentBackButton += 1; this.currentBackButton = this.currentBackButton % 4; } onToggleBottomTabsPress() { this.props.navigator.toggleTabs({ to: bottomTabsVisible ? 'shown' : 'hidden', animated: true }); bottomTabsVisible = !bottomTabsVisible; } } const styles = StyleSheet.create({ text: { textAlign: 'center', fontSize: 18, marginBottom: 10, marginTop: 10 }, button: { textAlign: 'center', fontSize: 18, marginBottom: 10, marginTop: 10, color: 'blue' } }); // which props do we want to inject, given the global state? function mapStateToProps(state) { return { counter: state.counter }; } export default connect(mapStateToProps)(PushedScreen);