/* @flow */
import { KeepAwake, Util } from 'expo';
import * as React from 'react';
import { StatusBar, I18nManager, AsyncStorage, Platform } from 'react-native';
import {
Provider as PaperProvider,
DarkTheme,
DefaultTheme,
} from 'react-native-paper';
import createReactContext from 'create-react-context';
import { createDrawerNavigator } from 'react-navigation';
import RootNavigator from './src/RootNavigator';
import DrawerItems from './DrawerItems';
import type { Theme } from 'react-native-paper/types';
type State = {
theme: Theme,
rtl: boolean,
};
const PreferencesContext: any = createReactContext();
const App = createDrawerNavigator(
{ Home: { screen: RootNavigator } },
{
contentComponent: () => (
{preferences => (
)}
),
// set drawerPosition to support rtl toggle on android
drawerPosition:
Platform.OS === 'android' && (I18nManager.isRTL ? 'right' : 'left'),
}
);
export default class PaperExample extends React.Component<{}, State> {
state = {
theme: DefaultTheme,
rtl: I18nManager.isRTL,
};
async componentDidMount() {
StatusBar.setBarStyle('light-content');
try {
const prefString = await AsyncStorage.getItem('preferences');
const preferences = JSON.parse(prefString);
if (preferences) {
// eslint-disable-next-line react/no-did-mount-set-state
this.setState(state => ({
theme: preferences.theme === 'dark' ? DarkTheme : DefaultTheme,
rtl:
typeof preferences.rtl === 'boolean' ? preferences.rtl : state.rtl,
}));
}
} catch (e) {
// ignore error
}
}
_savePreferences = async () => {
try {
AsyncStorage.setItem(
'preferences',
JSON.stringify({
theme: this.state.theme === DarkTheme ? 'dark' : 'light',
rtl: this.state.rtl,
})
);
} catch (e) {
// ignore error
}
};
_toggleTheme = () =>
this.setState(
state => ({
theme: state.theme === DarkTheme ? DefaultTheme : DarkTheme,
}),
this._savePreferences
);
_toggleRTL = () =>
this.setState(
state => ({
rtl: !state.rtl,
}),
async () => {
await this._savePreferences();
I18nManager.forceRTL(this.state.rtl);
Util.reload();
}
);
render() {
return (
);
}
}