import React from 'react'; import { View } from 'react-native'; import { createAppContainer, createSwitchNavigator } from 'react-navigation'; import { AppearanceProvider } from 'react-native-appearance'; import { createStackNavigator } from 'react-navigation-stack'; import { Provider } from 'react-redux'; import RNUserDefaults from 'rn-user-defaults'; import { defaultTheme, newThemeState, subscribeTheme, unsubscribeTheme } from './utils/theme'; import Navigation from './lib/ShareNavigation'; import store from './lib/createStore'; import sharedStyles from './views/Styles'; import { hasNotch, supportSystemTheme } from './utils/deviceInfo'; import { defaultHeader, onNavigationStateChange, cardStyle } from './utils/navigation'; import RocketChat, { THEME_PREFERENCES_KEY } from './lib/rocketchat'; import { ThemeContext } from './theme'; const InsideNavigator = createStackNavigator({ ShareListView: { getScreen: () => require('./views/ShareListView').default }, ShareView: { getScreen: () => require('./views/ShareView').default }, SelectServerView: { getScreen: () => require('./views/SelectServerView').default } }, { initialRouteName: 'ShareListView', defaultNavigationOptions: defaultHeader, cardStyle }); const OutsideNavigator = createStackNavigator({ WithoutServersView: { getScreen: () => require('./views/WithoutServersView').default } }, { initialRouteName: 'WithoutServersView', defaultNavigationOptions: defaultHeader, cardStyle }); const AppContainer = createAppContainer(createSwitchNavigator({ OutsideStack: OutsideNavigator, InsideStack: InsideNavigator, AuthLoading: { getScreen: () => require('./views/AuthLoadingView').default } }, { initialRouteName: 'AuthLoading' })); class Root extends React.Component { constructor(props) { super(props); this.state = { isLandscape: false, theme: defaultTheme(), themePreferences: { currentTheme: supportSystemTheme() ? 'automatic' : 'light', darkLevel: 'dark' } }; this.init(); } componentWillUnmount() { RocketChat.closeShareExtension(); unsubscribeTheme(); } init = async() => { RNUserDefaults.objectForKey(THEME_PREFERENCES_KEY).then(this.setTheme); const currentServer = await RNUserDefaults.get('currentServer'); const token = await RNUserDefaults.get(RocketChat.TOKEN_KEY); if (currentServer && token) { await Navigation.navigate('InsideStack'); await RocketChat.shareExtensionInit(currentServer); } else { await Navigation.navigate('OutsideStack'); } } setTheme = (newTheme = {}) => { // change theme state this.setState(prevState => newThemeState(prevState, newTheme), () => { const { themePreferences } = this.state; // subscribe to Appearance changes subscribeTheme(themePreferences, this.setTheme); }); } handleLayout = (event) => { const { width, height } = event.nativeEvent.layout; this.setState({ isLandscape: width > height }); } render() { const { isLandscape, theme } = this.state; return ( { Navigation.setTopLevelNavigator(navigatorRef); }} onNavigationStateChange={onNavigationStateChange} screenProps={{ theme }} /> ); } } export default Root;