Rocket.Chat.ReactNative/app/share.js

173 lines
4.1 KiB
JavaScript
Raw Normal View History

2020-05-28 19:24:18 +00:00
import React, { useContext } from 'react';
2020-05-27 21:18:14 +00:00
import PropTypes from 'prop-types';
2020-05-21 14:08:53 +00:00
import { NavigationContainer } from '@react-navigation/native';
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';
2020-05-27 21:18:14 +00:00
import { isIOS, supportSystemTheme } from './utils/deviceInfo';
2020-05-21 14:08:53 +00:00
import { defaultHeader, onNavigationStateChange, themedHeader } from './utils/navigation';
import RocketChat, { THEME_PREFERENCES_KEY } from './lib/rocketchat';
import { ThemeContext } from './theme';
// Outside Stack
import WithoutServersView from './views/WithoutServersView';
// Inside Stack
import ShareListView from './views/ShareListView';
import ShareView from './views/ShareView';
import SelectServerView from './views/SelectServerView';
const Inside = createStackNavigator();
const InsideStack = () => {
const { theme } = useContext(ThemeContext);
2020-05-27 21:18:14 +00:00
const screenOptions = {
...defaultHeader,
...themedHeader(theme)
};
screenOptions.headerStyle = {
...screenOptions.headerStyle,
// TODO: fix on multiple files PR :)
height: 57
};
2020-05-21 14:08:53 +00:00
return (
2020-05-27 21:18:14 +00:00
<Inside.Navigator screenOptions={screenOptions}>
2020-05-21 14:08:53 +00:00
<Inside.Screen
name='ShareListView'
component={ShareListView}
/>
<Inside.Screen
name='ShareView'
component={ShareView}
/>
<Inside.Screen
name='SelectServerView'
component={SelectServerView}
options={SelectServerView.navigationOptions}
/>
</Inside.Navigator>
);
};
const Outside = createStackNavigator();
const OutsideStack = () => {
const { theme } = useContext(ThemeContext);
return (
<Outside.Navigator screenOptions={{ ...defaultHeader, ...themedHeader(theme) }}>
<Outside.Screen
name='WithoutServersView'
component={WithoutServersView}
options={WithoutServersView.navigationOptions}
/>
</Outside.Navigator>
);
};
// App
const Stack = createStackNavigator();
2020-05-27 21:18:14 +00:00
export const App = ({ root }) => {
if (!root) {
return null;
}
2020-05-21 14:08:53 +00:00
return (
2020-05-27 21:18:14 +00:00
<Stack.Navigator screenOptions={{ headerShown: false }}>
<>
{root === 'outside' ? (
<Stack.Screen
name='OutsideStack'
component={OutsideStack}
/>
) : null}
{root === 'inside' ? (
2020-05-21 14:08:53 +00:00
<Stack.Screen
2020-05-27 21:18:14 +00:00
name='InsideStack'
component={InsideStack}
2020-05-21 14:08:53 +00:00
/>
2020-05-27 21:18:14 +00:00
) : null}
</>
</Stack.Navigator>
2020-05-21 14:08:53 +00:00
);
};
2020-05-27 21:18:14 +00:00
App.propTypes = {
root: PropTypes.string
};
2020-05-21 14:08:53 +00:00
class Root extends React.Component {
constructor(props) {
super(props);
this.state = {
theme: defaultTheme(),
themePreferences: {
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
darkLevel: 'dark'
2020-05-27 21:18:14 +00:00
},
root: ''
2020-05-21 14:08:53 +00:00
};
this.init();
}
componentWillUnmount() {
RocketChat.closeShareExtension();
unsubscribeTheme();
}
init = async() => {
if (isIOS) {
await RNUserDefaults.setName('group.ios.chat.rocket');
}
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) {
2020-05-27 21:18:14 +00:00
this.setState({ root: 'inside' });
2020-05-21 14:08:53 +00:00
await RocketChat.shareExtensionInit(currentServer);
} else {
2020-05-27 21:18:14 +00:00
this.setState({ root: 'outside' });
2020-05-21 14:08: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);
});
}
render() {
2020-05-27 21:18:14 +00:00
const { theme, root } = this.state;
2020-05-21 14:08:53 +00:00
return (
<AppearanceProvider>
2020-05-27 21:18:14 +00:00
<Provider store={store}>
<ThemeContext.Provider value={{ theme }}>
<NavigationContainer
ref={Navigation.navigationRef}
onNavigationStateChange={onNavigationStateChange}
>
<App root={root} />
</NavigationContainer>
</ThemeContext.Provider>
</Provider>
2020-05-21 14:08:53 +00:00
</AppearanceProvider>
);
}
}
export default Root;