const React = require('react'); const Component = React.Component; const { connect } = require('react-redux'); const { NotesScreen } = require('lib/components/screens/notes.js'); const { SearchScreen } = require('lib/components/screens/search.js'); const { KeyboardAvoidingView, Keyboard, Platform, View } = require('react-native'); const { _ } = require('lib/locale.js'); const { themeStyle } = require('lib/components/global-style.js'); class AppNavComponent extends Component { constructor() { super(); this.previousRouteName_ = null; this.state = { autoCompletionBarExtraHeight: 0, // Extra padding for the auto completion bar at the top of the keyboard } } UNSAFE_componentWillMount() { if (Platform.OS === 'ios') { this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this.keyboardDidShow.bind(this)); this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this.keyboardDidHide.bind(this)); } } componentWillUnmount() { if (this.keyboardDidShowListener) this.keyboardDidShowListener.remove(); if (this.keyboardDidHideListener) this.keyboardDidHideListener.remove(); this.keyboardDidShowListener = null; this.keyboardDidHideListener = null; } keyboardDidShow () { this.setState({ autoCompletionBarExtraHeight: 30 }) } keyboardDidHide () { this.setState({ autoCompletionBarExtraHeight:0 }) } render() { if (!this.props.route) throw new Error('Route must not be null'); // Note: certain screens are kept into memory, in particular Notes and Search // so that the scroll position is not lost when the user navigate away from them. let route = this.props.route; let Screen = null; let notesScreenVisible = false; let searchScreenVisible = false; if (route.routeName == 'Notes') { notesScreenVisible = true; } else if (route.routeName == 'Search') { searchScreenVisible = true; } else { Screen = this.props.screens[route.routeName].screen; } // Keep the search screen loaded if the user is viewing a note from that search screen // so that if the back button is pressed, the screen is still loaded. However, unload // it if navigating away. let searchScreenLoaded = searchScreenVisible || (this.previousRouteName_ == 'Search' && route.routeName == 'Note'); this.previousRouteName_ = route.routeName; const theme = themeStyle(this.props.theme); const style = { flex: 1, backgroundColor: theme.backgroundColor } return ( { searchScreenLoaded && } { (!notesScreenVisible && !searchScreenVisible) && } ); } } const AppNav = connect( (state) => { return { route: state.route, theme: state.settings.theme, }; } )(AppNavComponent) module.exports = { AppNav };