2019-07-18 17:44:02 +00:00
|
|
|
import React from 'react';
|
2019-10-02 12:18:08 +00:00
|
|
|
import { View } from 'react-native';
|
2019-09-17 19:24:47 +00:00
|
|
|
import { createAppContainer, createSwitchNavigator } from 'react-navigation';
|
2019-12-04 16:39:53 +00:00
|
|
|
import { AppearanceProvider } from 'react-native-appearance';
|
2019-09-17 19:24:47 +00:00
|
|
|
import { createStackNavigator } from 'react-navigation-stack';
|
2019-07-18 17:44:02 +00:00
|
|
|
import { Provider } from 'react-redux';
|
2019-07-29 16:33:28 +00:00
|
|
|
import RNUserDefaults from 'rn-user-defaults';
|
2019-07-18 17:44:02 +00:00
|
|
|
|
2019-12-04 16:39:53 +00:00
|
|
|
import {
|
|
|
|
defaultTheme,
|
|
|
|
newThemeState,
|
|
|
|
subscribeTheme,
|
|
|
|
unsubscribeTheme
|
|
|
|
} from './utils/theme';
|
2019-07-29 16:33:28 +00:00
|
|
|
import Navigation from './lib/ShareNavigation';
|
2019-07-18 17:44:02 +00:00
|
|
|
import store from './lib/createStore';
|
2019-10-02 12:18:08 +00:00
|
|
|
import sharedStyles from './views/Styles';
|
2019-12-04 16:39:53 +00:00
|
|
|
import { isNotch, isIOS, supportSystemTheme } from './utils/deviceInfo';
|
|
|
|
import { defaultHeader, onNavigationStateChange, cardStyle } from './utils/navigation';
|
|
|
|
import RocketChat, { THEME_PREFERENCES_KEY } from './lib/rocketchat';
|
|
|
|
import { ThemeContext } from './theme';
|
2019-07-18 17:44:02 +00:00
|
|
|
|
|
|
|
const InsideNavigator = createStackNavigator({
|
2019-07-29 16:33:28 +00:00
|
|
|
ShareListView: {
|
|
|
|
getScreen: () => require('./views/ShareListView').default
|
|
|
|
},
|
|
|
|
ShareView: {
|
|
|
|
getScreen: () => require('./views/ShareView').default
|
|
|
|
},
|
|
|
|
SelectServerView: {
|
|
|
|
getScreen: () => require('./views/SelectServerView').default
|
|
|
|
}
|
2019-07-18 17:44:02 +00:00
|
|
|
}, {
|
|
|
|
initialRouteName: 'ShareListView',
|
2019-12-04 16:39:53 +00:00
|
|
|
defaultNavigationOptions: defaultHeader,
|
|
|
|
cardStyle
|
2019-07-18 17:44:02 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
const OutsideNavigator = createStackNavigator({
|
2019-07-29 16:33:28 +00:00
|
|
|
WithoutServersView: {
|
|
|
|
getScreen: () => require('./views/WithoutServersView').default
|
|
|
|
}
|
2019-07-18 17:44:02 +00:00
|
|
|
}, {
|
|
|
|
initialRouteName: 'WithoutServersView',
|
2019-12-04 16:39:53 +00:00
|
|
|
defaultNavigationOptions: defaultHeader,
|
|
|
|
cardStyle
|
2019-07-18 17:44:02 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
const AppContainer = createAppContainer(createSwitchNavigator({
|
|
|
|
OutsideStack: OutsideNavigator,
|
|
|
|
InsideStack: InsideNavigator,
|
2019-07-29 16:33:28 +00:00
|
|
|
AuthLoading: {
|
|
|
|
getScreen: () => require('./views/AuthLoadingView').default
|
|
|
|
}
|
2019-07-18 17:44:02 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
initialRouteName: 'AuthLoading'
|
|
|
|
}));
|
|
|
|
|
|
|
|
class Root extends React.Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
2019-10-02 12:18:08 +00:00
|
|
|
this.state = {
|
2019-12-04 16:39:53 +00:00
|
|
|
isLandscape: false,
|
|
|
|
theme: defaultTheme(),
|
|
|
|
themePreferences: {
|
|
|
|
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
|
|
|
|
darkLevel: 'dark'
|
|
|
|
}
|
2019-10-02 12:18:08 +00:00
|
|
|
};
|
2019-07-29 16:33:28 +00:00
|
|
|
this.init();
|
|
|
|
}
|
|
|
|
|
2019-12-04 16:39:53 +00:00
|
|
|
componentWillUnmount() {
|
2019-12-04 16:41:37 +00:00
|
|
|
RocketChat.closeShareExtension();
|
2019-12-04 16:39:53 +00:00
|
|
|
unsubscribeTheme();
|
|
|
|
}
|
|
|
|
|
2019-07-29 16:33:28 +00:00
|
|
|
init = async() => {
|
|
|
|
if (isIOS) {
|
|
|
|
await RNUserDefaults.setName('group.ios.chat.rocket');
|
|
|
|
}
|
2019-12-04 16:39:53 +00:00
|
|
|
RNUserDefaults.objectForKey(THEME_PREFERENCES_KEY).then(this.setTheme);
|
2019-07-29 16:33:28 +00:00
|
|
|
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');
|
|
|
|
}
|
2019-07-18 17:44:02 +00:00
|
|
|
}
|
|
|
|
|
2019-12-04 16:39:53 +00:00
|
|
|
setTheme = (newTheme = {}) => {
|
|
|
|
// change theme state
|
|
|
|
this.setState(prevState => newThemeState(prevState, newTheme), () => {
|
|
|
|
const { themePreferences } = this.state;
|
|
|
|
// subscribe to Appearance changes
|
|
|
|
subscribeTheme(themePreferences, this.setTheme);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-10-02 12:18:08 +00:00
|
|
|
handleLayout = (event) => {
|
|
|
|
const { width, height } = event.nativeEvent.layout;
|
|
|
|
this.setState({ isLandscape: width > height });
|
|
|
|
}
|
|
|
|
|
2019-07-18 17:44:02 +00:00
|
|
|
render() {
|
2019-12-04 16:39:53 +00:00
|
|
|
const { isLandscape, theme } = this.state;
|
2019-07-18 17:44:02 +00:00
|
|
|
return (
|
2019-12-04 16:39:53 +00:00
|
|
|
<AppearanceProvider>
|
|
|
|
<View
|
|
|
|
style={[sharedStyles.container, isLandscape && isNotch ? sharedStyles.notchLandscapeContainer : {}]}
|
|
|
|
onLayout={this.handleLayout}
|
|
|
|
>
|
|
|
|
<Provider store={store}>
|
|
|
|
<ThemeContext.Provider value={{ theme }}>
|
|
|
|
<AppContainer
|
|
|
|
ref={(navigatorRef) => {
|
|
|
|
Navigation.setTopLevelNavigator(navigatorRef);
|
|
|
|
}}
|
|
|
|
onNavigationStateChange={onNavigationStateChange}
|
|
|
|
screenProps={{ theme }}
|
|
|
|
/>
|
|
|
|
</ThemeContext.Provider>
|
|
|
|
</Provider>
|
|
|
|
</View>
|
|
|
|
</AppearanceProvider>
|
2019-07-18 17:44:02 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default Root;
|