forked from vergnet/application-amicale
Improved flow typing and moved tab related options in component file
This commit is contained in:
parent
759c369c93
commit
8c7ceb84fc
5 changed files with 195 additions and 197 deletions
111
App.js
111
App.js
|
@ -11,7 +11,7 @@ import {NavigationContainer} from '@react-navigation/native';
|
||||||
import {createStackNavigator} from '@react-navigation/stack';
|
import {createStackNavigator} from '@react-navigation/stack';
|
||||||
import DrawerNavigator from './src/navigation/DrawerNavigator';
|
import DrawerNavigator from './src/navigation/DrawerNavigator';
|
||||||
import {initExpoToken} from "./src/utils/Notifications";
|
import {initExpoToken} from "./src/utils/Notifications";
|
||||||
import {Provider as PaperProvider} from 'react-native-paper';
|
import {Provider as PaperProvider, Theme} from 'react-native-paper';
|
||||||
import AprilFoolsManager from "./src/managers/AprilFoolsManager";
|
import AprilFoolsManager from "./src/managers/AprilFoolsManager";
|
||||||
import Update from "./src/constants/Update";
|
import Update from "./src/constants/Update";
|
||||||
import ConnectionManager from "./src/managers/ConnectionManager";
|
import ConnectionManager from "./src/managers/ConnectionManager";
|
||||||
|
@ -29,7 +29,7 @@ type State = {
|
||||||
showIntro: boolean,
|
showIntro: boolean,
|
||||||
showUpdate: boolean,
|
showUpdate: boolean,
|
||||||
showAprilFools: boolean,
|
showAprilFools: boolean,
|
||||||
currentTheme: ?Object,
|
currentTheme: Theme | null,
|
||||||
};
|
};
|
||||||
|
|
||||||
const Stack = createStackNavigator();
|
const Stack = createStackNavigator();
|
||||||
|
@ -44,42 +44,58 @@ export default class App extends React.Component<Props, State> {
|
||||||
currentTheme: null,
|
currentTheme: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
navigatorRef: Object;
|
navigatorRef: { current: null | NavigationContainer };
|
||||||
|
|
||||||
defaultRoute: string | null;
|
defaultHomeRoute: string | null;
|
||||||
defaultData: Object;
|
defaultHomeData: { [key: string]: any }
|
||||||
|
|
||||||
createDrawerNavigator: Function;
|
createDrawerNavigator: () => React.Node;
|
||||||
|
|
||||||
urlHandler: URLHandler;
|
urlHandler: URLHandler;
|
||||||
|
storageManager: AsyncStorageManager;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
LocaleManager.initTranslations();
|
LocaleManager.initTranslations();
|
||||||
SplashScreen.preventAutoHide();
|
SplashScreen.preventAutoHide();
|
||||||
this.navigatorRef = React.createRef();
|
this.navigatorRef = React.createRef();
|
||||||
this.defaultRoute = null;
|
this.defaultHomeRoute = null;
|
||||||
this.defaultData = {};
|
this.defaultHomeData = {};
|
||||||
|
this.storageManager = AsyncStorageManager.getInstance();
|
||||||
this.urlHandler = new URLHandler(this.onInitialURLParsed, this.onDetectURL);
|
this.urlHandler = new URLHandler(this.onInitialURLParsed, this.onDetectURL);
|
||||||
this.urlHandler.listen();
|
this.urlHandler.listen();
|
||||||
setSafeBounceHeight(Platform.OS === 'ios' ? 100 : 20);
|
setSafeBounceHeight(Platform.OS === 'ios' ? 100 : 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
onInitialURLParsed = ({route, data}: Object) => {
|
/**
|
||||||
this.defaultRoute = route;
|
* THe app has been started by an url, and it has been parsed.
|
||||||
this.defaultData = data;
|
* Set a new default start route based on the data parsed.
|
||||||
};
|
*
|
||||||
|
* @param parsedData The data parsed from the url
|
||||||
onDetectURL = ({route, data}: Object) => {
|
*/
|
||||||
// Navigate to nested navigator and pass data to the index screen
|
onInitialURLParsed = (parsedData: { route: string, data: { [key: string]: any } }) => {
|
||||||
this.navigatorRef.current.navigate('home', {
|
this.defaultHomeRoute = parsedData.route;
|
||||||
screen: 'index',
|
this.defaultHomeData = parsedData.data;
|
||||||
params: {nextScreen: route, data: data}
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the theme
|
* An url has been opened and parsed while the app was active.
|
||||||
|
* Redirect the user to the screen according to parsed data.
|
||||||
|
*
|
||||||
|
* @param parsedData The data parsed from the url
|
||||||
|
*/
|
||||||
|
onDetectURL = (parsedData: { route: string, data: { [key: string]: any } }) => {
|
||||||
|
// Navigate to nested navigator and pass data to the index screen
|
||||||
|
if (this.navigatorRef.current != null) {
|
||||||
|
this.navigatorRef.current.navigate('home', {
|
||||||
|
screen: 'index',
|
||||||
|
params: {nextScreen: parsedData.route, data: parsedData.data}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the current theme
|
||||||
*/
|
*/
|
||||||
onUpdateTheme = () => {
|
onUpdateTheme = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -88,6 +104,10 @@ export default class App extends React.Component<Props, State> {
|
||||||
this.setupStatusBar();
|
this.setupStatusBar();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates status bar content color if on iOS only,
|
||||||
|
* as the android status bar is always set to black.
|
||||||
|
*/
|
||||||
setupStatusBar() {
|
setupStatusBar() {
|
||||||
if (Platform.OS === 'ios') {
|
if (Platform.OS === 'ios') {
|
||||||
if (ThemeManager.getNightMode()) {
|
if (ThemeManager.getNightMode()) {
|
||||||
|
@ -96,12 +116,10 @@ export default class App extends React.Component<Props, State> {
|
||||||
StatusBar.setBarStyle('dark-content', true);
|
StatusBar.setBarStyle('dark-content', true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// StatusBar.setTranslucent(false);
|
|
||||||
// StatusBar.setBackgroundColor(ThemeManager.getCurrentTheme().colors.surface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback when user ends the intro. Save in preferences to avaoid showing back the introSlides
|
* Callback when user ends the intro. Save in preferences to avoid showing back the introSlides
|
||||||
*/
|
*/
|
||||||
onIntroDone = () => {
|
onIntroDone = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -109,45 +127,52 @@ export default class App extends React.Component<Props, State> {
|
||||||
showUpdate: false,
|
showUpdate: false,
|
||||||
showAprilFools: false,
|
showAprilFools: false,
|
||||||
});
|
});
|
||||||
AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showIntro.key, '0');
|
this.storageManager.savePref(this.storageManager.preferences.showIntro.key, '0');
|
||||||
AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.updateNumber.key, Update.number.toString());
|
this.storageManager.savePref(this.storageManager.preferences.updateNumber.key, Update.number.toString());
|
||||||
AsyncStorageManager.getInstance().savePref(AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.key, '0');
|
this.storageManager.savePref(this.storageManager.preferences.showAprilFoolsStart.key, '0');
|
||||||
};
|
};
|
||||||
|
|
||||||
async componentDidMount() {
|
componentDidMount() {
|
||||||
await this.loadAssetsAsync();
|
this.loadAssetsAsync().then(() => {
|
||||||
|
this.onLoadFinished();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads every async data
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async loadAssetsAsync() {
|
async loadAssetsAsync() {
|
||||||
// Wait for custom fonts to be loaded before showing the app
|
await this.storageManager.loadPreferences();
|
||||||
await AsyncStorageManager.getInstance().loadPreferences();
|
|
||||||
ThemeManager.getInstance().setUpdateThemeCallback(this.onUpdateTheme);
|
|
||||||
await initExpoToken();
|
await initExpoToken();
|
||||||
try {
|
try {
|
||||||
await ConnectionManager.getInstance().recoverLogin();
|
await ConnectionManager.getInstance().recoverLogin();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.createDrawerNavigator = () => <DrawerNavigator defaultRoute={this.defaultRoute}
|
|
||||||
defaultData={this.defaultData}/>;
|
|
||||||
this.onLoadFinished();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Async loading is done, finish processing startup data
|
||||||
|
*/
|
||||||
onLoadFinished() {
|
onLoadFinished() {
|
||||||
// console.log("finished");
|
|
||||||
// Only show intro if this is the first time starting the app
|
// Only show intro if this is the first time starting the app
|
||||||
this.setState({
|
this.createDrawerNavigator = () => <DrawerNavigator
|
||||||
isLoading: false,
|
defaultHomeRoute={this.defaultHomeRoute}
|
||||||
currentTheme: ThemeManager.getCurrentTheme(),
|
defaultHomeData={this.defaultHomeData}/>;
|
||||||
showIntro: AsyncStorageManager.getInstance().preferences.showIntro.current === '1',
|
ThemeManager.getInstance().setUpdateThemeCallback(this.onUpdateTheme);
|
||||||
showUpdate: AsyncStorageManager.getInstance().preferences.updateNumber.current !== Update.number.toString(),
|
|
||||||
showAprilFools: AprilFoolsManager.getInstance().isAprilFoolsEnabled() && AsyncStorageManager.getInstance().preferences.showAprilFoolsStart.current === '1',
|
|
||||||
});
|
|
||||||
// Status bar goes dark if set too fast on ios
|
// Status bar goes dark if set too fast on ios
|
||||||
if (Platform.OS === 'ios')
|
if (Platform.OS === 'ios')
|
||||||
setTimeout(this.setupStatusBar, 1000);
|
setTimeout(this.setupStatusBar, 1000);
|
||||||
else
|
else
|
||||||
this.setupStatusBar();
|
this.setupStatusBar();
|
||||||
|
this.setState({
|
||||||
|
isLoading: false,
|
||||||
|
currentTheme: ThemeManager.getCurrentTheme(),
|
||||||
|
showIntro: this.storageManager.preferences.showIntro.current === '1',
|
||||||
|
showUpdate: this.storageManager.preferences.updateNumber.current !== Update.number.toString(),
|
||||||
|
showAprilFools: AprilFoolsManager.getInstance().isAprilFoolsEnabled() && this.storageManager.preferences.showAprilFoolsStart.current === '1',
|
||||||
|
});
|
||||||
SplashScreen.hide();
|
SplashScreen.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,7 @@ const deviceWidth = Dimensions.get("window").width;
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
navigation: Object,
|
navigation: Object,
|
||||||
state: Object,
|
theme?: Object,
|
||||||
theme: Object,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type State = {
|
type State = {
|
||||||
|
|
|
@ -2,7 +2,6 @@ import * as React from 'react';
|
||||||
import {withTheme} from 'react-native-paper';
|
import {withTheme} from 'react-native-paper';
|
||||||
import TabIcon from "./TabIcon";
|
import TabIcon from "./TabIcon";
|
||||||
import TabHomeIcon from "./TabHomeIcon";
|
import TabHomeIcon from "./TabHomeIcon";
|
||||||
import {AnimatedValue} from "react-native-reanimated";
|
|
||||||
import {Animated} from 'react-native';
|
import {Animated} from 'react-native';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
@ -17,6 +16,13 @@ type State = {
|
||||||
translateY: AnimatedValue,
|
translateY: AnimatedValue,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TAB_ICONS = {
|
||||||
|
planning: 'calendar-range',
|
||||||
|
proxiwash: 'tshirt-crew',
|
||||||
|
proximo: 'cart',
|
||||||
|
planex: 'clock',
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstraction layer for Agenda component, using custom configuration
|
* Abstraction layer for Agenda component, using custom configuration
|
||||||
*/
|
*/
|
||||||
|
@ -25,6 +31,8 @@ class CustomTabBar extends React.Component<Props, State> {
|
||||||
static TAB_BAR_HEIGHT = 48;
|
static TAB_BAR_HEIGHT = 48;
|
||||||
|
|
||||||
barSynced: boolean; // Is the bar synced with the header for animations?
|
barSynced: boolean; // Is the bar synced with the header for animations?
|
||||||
|
activeColor: string;
|
||||||
|
inactiveColor: string;
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
translateY: new Animated.Value(0),
|
translateY: new Animated.Value(0),
|
||||||
|
@ -37,10 +45,12 @@ class CustomTabBar extends React.Component<Props, State> {
|
||||||
|
|
||||||
tabRef: Object;
|
tabRef: Object;
|
||||||
|
|
||||||
constructor() {
|
constructor(props) {
|
||||||
super();
|
super(props);
|
||||||
this.tabRef = React.createRef();
|
this.tabRef = React.createRef();
|
||||||
this.barSynced = false;
|
this.barSynced = false;
|
||||||
|
this.activeColor = props.theme.colors.primary;
|
||||||
|
this.inactiveColor = props.theme.colors.tabIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
onItemPress(route: Object, currentIndex: number, destIndex: number) {
|
onItemPress(route: Object, currentIndex: number, destIndex: number) {
|
||||||
|
@ -58,14 +68,73 @@ class CustomTabBar extends React.Component<Props, State> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tabBarIcon = (route, focused) => {
|
||||||
|
let icon = TAB_ICONS[route.name];
|
||||||
|
icon = focused ? icon : icon + ('-outline');
|
||||||
|
if (route.name !== "home")
|
||||||
|
return icon;
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
onRouteChange = () => {
|
onRouteChange = () => {
|
||||||
this.barSynced = false;
|
this.barSynced = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
renderIcon = (route, index) => {
|
||||||
const state = this.props.state;
|
const state = this.props.state;
|
||||||
const descriptors = this.props.descriptors;
|
const {options} = this.props.descriptors[route.key];
|
||||||
const navigation = this.props.navigation;
|
const label =
|
||||||
|
options.tabBarLabel !== undefined
|
||||||
|
? options.tabBarLabel
|
||||||
|
: options.title !== undefined
|
||||||
|
? options.title
|
||||||
|
: route.name;
|
||||||
|
|
||||||
|
const isFocused = state.index === index;
|
||||||
|
|
||||||
|
const onPress = () => this.onItemPress(route, state.index, index);
|
||||||
|
|
||||||
|
const onLongPress = () => {
|
||||||
|
this.props.navigation.emit({
|
||||||
|
type: 'tabLongPress',
|
||||||
|
target: route.key,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (isFocused) {
|
||||||
|
const stackState = route.state;
|
||||||
|
const stackRoute = route.state ? stackState.routes[stackState.index] : undefined;
|
||||||
|
const params = stackRoute ? stackRoute.params : undefined;
|
||||||
|
const collapsible = params ? params.collapsible : undefined;
|
||||||
|
if (collapsible && !this.barSynced) {
|
||||||
|
this.barSynced = true;
|
||||||
|
this.setState({translateY: Animated.multiply(-1.5, collapsible.translateY)});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const color = isFocused ? this.activeColor : this.inactiveColor;
|
||||||
|
if (route.name !== "home") {
|
||||||
|
return <TabIcon
|
||||||
|
onPress={onPress}
|
||||||
|
onLongPress={onLongPress}
|
||||||
|
icon={this.tabBarIcon(route, isFocused)}
|
||||||
|
color={color}
|
||||||
|
label={label}
|
||||||
|
focused={isFocused}
|
||||||
|
extraData={state.index > index}
|
||||||
|
key={route.key}
|
||||||
|
/>
|
||||||
|
} else
|
||||||
|
return <TabHomeIcon
|
||||||
|
onPress={onPress}
|
||||||
|
onLongPress={onLongPress}
|
||||||
|
focused={isFocused}
|
||||||
|
key={route.key}
|
||||||
|
/>
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
this.props.navigation.addListener('state', this.onRouteChange);
|
this.props.navigation.addListener('state', this.onRouteChange);
|
||||||
return (
|
return (
|
||||||
<Animated.View
|
<Animated.View
|
||||||
|
@ -84,57 +153,7 @@ class CustomTabBar extends React.Component<Props, State> {
|
||||||
transform: [{translateY: this.state.translateY}]
|
transform: [{translateY: this.state.translateY}]
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{state.routes.map((route, index) => {
|
{this.props.state.routes.map(this.renderIcon)}
|
||||||
const {options} = descriptors[route.key];
|
|
||||||
const label =
|
|
||||||
options.tabBarLabel !== undefined
|
|
||||||
? options.tabBarLabel
|
|
||||||
: options.title !== undefined
|
|
||||||
? options.title
|
|
||||||
: route.name;
|
|
||||||
|
|
||||||
const isFocused = state.index === index;
|
|
||||||
|
|
||||||
const onPress = () => this.onItemPress(route, state.index, index);
|
|
||||||
|
|
||||||
const onLongPress = () => {
|
|
||||||
navigation.emit({
|
|
||||||
type: 'tabLongPress',
|
|
||||||
target: route.key,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
if (isFocused) {
|
|
||||||
const stackState = route.state;
|
|
||||||
const stackRoute = route.state ? stackState.routes[stackState.index] : undefined;
|
|
||||||
const params = stackRoute ? stackRoute.params : undefined;
|
|
||||||
const collapsible = params ? params.collapsible : undefined;
|
|
||||||
if (collapsible && !this.barSynced) {
|
|
||||||
this.barSynced = true;
|
|
||||||
this.setState({translateY: Animated.multiply(-1.5, collapsible.translateY)});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const color = isFocused ? options.activeColor : options.inactiveColor;
|
|
||||||
const iconData = {focused: isFocused, color: color};
|
|
||||||
if (route.name !== "home") {
|
|
||||||
return <TabIcon
|
|
||||||
onPress={onPress}
|
|
||||||
onLongPress={onLongPress}
|
|
||||||
icon={options.tabBarIcon(iconData)}
|
|
||||||
color={color}
|
|
||||||
label={label}
|
|
||||||
focused={isFocused}
|
|
||||||
extraData={state.index > index}
|
|
||||||
key={route.key}
|
|
||||||
/>
|
|
||||||
} else
|
|
||||||
return <TabHomeIcon
|
|
||||||
onPress={onPress}
|
|
||||||
onLongPress={onLongPress}
|
|
||||||
focused={isFocused}
|
|
||||||
key={route.key}
|
|
||||||
/>
|
|
||||||
})}
|
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import {createDrawerNavigator} from '@react-navigation/drawer';
|
import {createDrawerNavigator, DrawerNavigationProp} from '@react-navigation/drawer';
|
||||||
import TabNavigator from './MainTabNavigator';
|
import TabNavigator from './MainTabNavigator';
|
||||||
import SettingsScreen from '../screens/Other/SettingsScreen';
|
import SettingsScreen from '../screens/Other/SettingsScreen';
|
||||||
import AboutScreen from '../screens/About/AboutScreen';
|
import AboutScreen from '../screens/About/AboutScreen';
|
||||||
|
@ -35,7 +35,7 @@ const defaultScreenOptions = {
|
||||||
...TransitionPresets.SlideFromRightIOS,
|
...TransitionPresets.SlideFromRightIOS,
|
||||||
};
|
};
|
||||||
|
|
||||||
function getDrawerButton(navigation: Object) {
|
function getDrawerButton(navigation: DrawerNavigationProp) {
|
||||||
return (
|
return (
|
||||||
<MaterialHeaderButtons left={true}>
|
<MaterialHeaderButtons left={true}>
|
||||||
<Item title="menu" iconName="menu" onPress={navigation.openDrawer}/>
|
<Item title="menu" iconName="menu" onPress={navigation.openDrawer}/>
|
||||||
|
@ -415,11 +415,9 @@ function ProfileStackComponent() {
|
||||||
<ClubStack.Screen
|
<ClubStack.Screen
|
||||||
name="club-information"
|
name="club-information"
|
||||||
component={ClubDisplayScreen}
|
component={ClubDisplayScreen}
|
||||||
options={({navigation}) => {
|
options={{
|
||||||
return {
|
title: i18n.t('screens.clubDisplayScreen'),
|
||||||
title: i18n.t('screens.clubDisplayScreen'),
|
...TransitionPresets.ModalSlideFromBottomIOS,
|
||||||
...TransitionPresets.ModalSlideFromBottomIOS,
|
|
||||||
};
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</ProfileStack.Navigator>
|
</ProfileStack.Navigator>
|
||||||
|
@ -509,21 +507,17 @@ function ClubStackComponent() {
|
||||||
<ClubStack.Screen
|
<ClubStack.Screen
|
||||||
name="club-information"
|
name="club-information"
|
||||||
component={ClubDisplayScreen}
|
component={ClubDisplayScreen}
|
||||||
options={({navigation}) => {
|
options={{
|
||||||
return {
|
title: i18n.t('screens.clubDisplayScreen'),
|
||||||
title: i18n.t('screens.clubDisplayScreen'),
|
...TransitionPresets.ModalSlideFromBottomIOS,
|
||||||
...TransitionPresets.ModalSlideFromBottomIOS,
|
|
||||||
};
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<ClubStack.Screen
|
<ClubStack.Screen
|
||||||
name="club-about"
|
name="club-about"
|
||||||
component={ClubAboutScreen}
|
component={ClubAboutScreen}
|
||||||
options={({navigation}) => {
|
options={{
|
||||||
return {
|
title: i18n.t('screens.clubsAbout'),
|
||||||
title: i18n.t('screens.clubsAbout'),
|
...TransitionPresets.ModalSlideFromBottomIOS,
|
||||||
...TransitionPresets.ModalSlideFromBottomIOS,
|
|
||||||
};
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</ClubStack.Navigator>
|
</ClubStack.Navigator>
|
||||||
|
@ -533,27 +527,22 @@ function ClubStackComponent() {
|
||||||
|
|
||||||
const Drawer = createDrawerNavigator();
|
const Drawer = createDrawerNavigator();
|
||||||
|
|
||||||
function getDrawerContent(props) {
|
|
||||||
return <Sidebar {...props}/>
|
|
||||||
}
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
defaultRoute: string | null,
|
defaultHomeRoute: string | null,
|
||||||
defaultData: Object
|
defaultHomeData: { [key: string]: any }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export default class DrawerNavigator extends React.Component<Props> {
|
export default class DrawerNavigator extends React.Component<Props> {
|
||||||
|
|
||||||
createTabNavigator: Object;
|
createTabNavigator: () => React.Element<TabNavigator>;
|
||||||
|
|
||||||
constructor(props: Object) {
|
constructor(props: Props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
this.createTabNavigator = () => <TabNavigator {...props}/>
|
||||||
this.createTabNavigator = () => <TabNavigator defaultRoute={props.defaultRoute}
|
|
||||||
defaultData={props.defaultData}/>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getDrawerContent = (props: { navigation: DrawerNavigationProp }) => <Sidebar {...props}/>
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<Drawer.Navigator
|
<Drawer.Navigator
|
||||||
|
@ -561,7 +550,7 @@ export default class DrawerNavigator extends React.Component<Props> {
|
||||||
headerMode={'float'}
|
headerMode={'float'}
|
||||||
backBehavior={'initialRoute'}
|
backBehavior={'initialRoute'}
|
||||||
drawerType={'front'}
|
drawerType={'front'}
|
||||||
drawerContent={(props) => getDrawerContent(props)}
|
drawerContent={this.getDrawerContent}
|
||||||
screenOptions={defaultScreenOptions}
|
screenOptions={defaultScreenOptions}
|
||||||
>
|
>
|
||||||
<Drawer.Screen
|
<Drawer.Screen
|
||||||
|
|
|
@ -12,7 +12,7 @@ import ProximoListScreen from "../screens/Proximo/ProximoListScreen";
|
||||||
import ProximoAboutScreen from "../screens/Proximo/ProximoAboutScreen";
|
import ProximoAboutScreen from "../screens/Proximo/ProximoAboutScreen";
|
||||||
import PlanexScreen from '../screens/Planex/PlanexScreen';
|
import PlanexScreen from '../screens/Planex/PlanexScreen';
|
||||||
import AsyncStorageManager from "../managers/AsyncStorageManager";
|
import AsyncStorageManager from "../managers/AsyncStorageManager";
|
||||||
import {useTheme, withTheme} from 'react-native-paper';
|
import {useTheme} from 'react-native-paper';
|
||||||
import i18n from "i18n-js";
|
import i18n from "i18n-js";
|
||||||
import ClubDisplayScreen from "../screens/Amicale/Clubs/ClubDisplayScreen";
|
import ClubDisplayScreen from "../screens/Amicale/Clubs/ClubDisplayScreen";
|
||||||
import ScannerScreen from "../screens/Home/ScannerScreen";
|
import ScannerScreen from "../screens/Home/ScannerScreen";
|
||||||
|
@ -21,14 +21,7 @@ import FeedItemScreen from "../screens/Home/FeedItemScreen";
|
||||||
import {createCollapsibleStack} from "react-navigation-collapsible";
|
import {createCollapsibleStack} from "react-navigation-collapsible";
|
||||||
import GroupSelectionScreen from "../screens/Planex/GroupSelectionScreen";
|
import GroupSelectionScreen from "../screens/Planex/GroupSelectionScreen";
|
||||||
import CustomTabBar from "../components/Tabbar/CustomTabBar";
|
import CustomTabBar from "../components/Tabbar/CustomTabBar";
|
||||||
|
import {DrawerNavigationProp} from "@react-navigation/drawer";
|
||||||
const TAB_ICONS = {
|
|
||||||
home: 'triangle',
|
|
||||||
planning: 'calendar-range',
|
|
||||||
proxiwash: 'tshirt-crew',
|
|
||||||
proximo: 'cart',
|
|
||||||
planex: 'clock',
|
|
||||||
};
|
|
||||||
|
|
||||||
const defaultScreenOptions = {
|
const defaultScreenOptions = {
|
||||||
gestureEnabled: true,
|
gestureEnabled: true,
|
||||||
|
@ -36,7 +29,7 @@ const defaultScreenOptions = {
|
||||||
...TransitionPresets.SlideFromRightIOS,
|
...TransitionPresets.SlideFromRightIOS,
|
||||||
};
|
};
|
||||||
|
|
||||||
function getDrawerButton(navigation: Object) {
|
function getDrawerButton(navigation: DrawerNavigationProp) {
|
||||||
return (
|
return (
|
||||||
<MaterialHeaderButtons left={true}>
|
<MaterialHeaderButtons left={true}>
|
||||||
<Item title="menu" iconName="menu" onPress={navigation.openDrawer}/>
|
<Item title="menu" iconName="menu" onPress={navigation.openDrawer}/>
|
||||||
|
@ -147,7 +140,6 @@ function ProxiwashStackComponent() {
|
||||||
const PlanningStack = createStackNavigator();
|
const PlanningStack = createStackNavigator();
|
||||||
|
|
||||||
function PlanningStackComponent() {
|
function PlanningStackComponent() {
|
||||||
const {colors} = useTheme();
|
|
||||||
return (
|
return (
|
||||||
<PlanningStack.Navigator
|
<PlanningStack.Navigator
|
||||||
initialRouteName="index"
|
initialRouteName="index"
|
||||||
|
@ -179,10 +171,10 @@ function PlanningStackComponent() {
|
||||||
|
|
||||||
const HomeStack = createStackNavigator();
|
const HomeStack = createStackNavigator();
|
||||||
|
|
||||||
function HomeStackComponent(initialRoute: string | null, defaultData: Object) {
|
function HomeStackComponent(initialRoute: string | null, defaultData: { [key: string]: any }) {
|
||||||
let data;
|
let params = undefined;
|
||||||
if (initialRoute !== null)
|
if (initialRoute != null)
|
||||||
data = {data: defaultData, nextScreen: initialRoute, shouldOpen: true};
|
params = {data: defaultData, nextScreen: initialRoute, shouldOpen: true};
|
||||||
const {colors} = useTheme();
|
const {colors} = useTheme();
|
||||||
return (
|
return (
|
||||||
<HomeStack.Navigator
|
<HomeStack.Navigator
|
||||||
|
@ -204,7 +196,7 @@ function HomeStackComponent(initialRoute: string | null, defaultData: Object) {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
initialParams={data}
|
initialParams={params}
|
||||||
/>,
|
/>,
|
||||||
{
|
{
|
||||||
collapsedColor: 'transparent',
|
collapsedColor: 'transparent',
|
||||||
|
@ -222,31 +214,25 @@ function HomeStackComponent(initialRoute: string | null, defaultData: Object) {
|
||||||
<HomeStack.Screen
|
<HomeStack.Screen
|
||||||
name="home-club-information"
|
name="home-club-information"
|
||||||
component={ClubDisplayScreen}
|
component={ClubDisplayScreen}
|
||||||
options={({navigation}) => {
|
options={{
|
||||||
return {
|
title: i18n.t('screens.clubDisplayScreen'),
|
||||||
title: i18n.t('screens.clubDisplayScreen'),
|
...TransitionPresets.ModalSlideFromBottomIOS,
|
||||||
...TransitionPresets.ModalSlideFromBottomIOS,
|
|
||||||
};
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<HomeStack.Screen
|
<HomeStack.Screen
|
||||||
name="feed-information"
|
name="feed-information"
|
||||||
component={FeedItemScreen}
|
component={FeedItemScreen}
|
||||||
options={({navigation}) => {
|
options={{
|
||||||
return {
|
title: i18n.t('screens.feedDisplayScreen'),
|
||||||
title: i18n.t('screens.feedDisplayScreen'),
|
...TransitionPresets.ModalSlideFromBottomIOS,
|
||||||
...TransitionPresets.ModalSlideFromBottomIOS,
|
|
||||||
};
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<HomeStack.Screen
|
<HomeStack.Screen
|
||||||
name="scanner"
|
name="scanner"
|
||||||
component={ScannerScreen}
|
component={ScannerScreen}
|
||||||
options={({navigation}) => {
|
options={{
|
||||||
return {
|
title: i18n.t('screens.scanner'),
|
||||||
title: i18n.t('screens.scanner'),
|
...TransitionPresets.ModalSlideFromBottomIOS,
|
||||||
...TransitionPresets.ModalSlideFromBottomIOS,
|
|
||||||
};
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</HomeStack.Navigator>
|
</HomeStack.Navigator>
|
||||||
|
@ -287,14 +273,12 @@ function PlanexStackComponent() {
|
||||||
<PlanexStack.Screen
|
<PlanexStack.Screen
|
||||||
name="group-select"
|
name="group-select"
|
||||||
component={GroupSelectionScreen}
|
component={GroupSelectionScreen}
|
||||||
options={({navigation}) => {
|
options={{
|
||||||
return {
|
title: 'GroupSelectionScreen',
|
||||||
title: 'GroupSelectionScreen',
|
headerStyle: {
|
||||||
headerStyle: {
|
backgroundColor: colors.surface,
|
||||||
backgroundColor: colors.surface,
|
},
|
||||||
},
|
...TransitionPresets.ModalSlideFromBottomIOS,
|
||||||
...TransitionPresets.ModalSlideFromBottomIOS,
|
|
||||||
};
|
|
||||||
}}
|
}}
|
||||||
/>,
|
/>,
|
||||||
{
|
{
|
||||||
|
@ -309,44 +293,28 @@ function PlanexStackComponent() {
|
||||||
const Tab = createBottomTabNavigator();
|
const Tab = createBottomTabNavigator();
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
defaultRoute: string | null,
|
defaultHomeRoute: string | null,
|
||||||
defaultData: Object
|
defaultHomeData: { [key: string]: any }
|
||||||
}
|
}
|
||||||
|
|
||||||
class TabNavigator extends React.Component<Props> {
|
export default class TabNavigator extends React.Component<Props> {
|
||||||
|
|
||||||
createHomeStackComponent: Object;
|
|
||||||
|
|
||||||
|
createHomeStackComponent: () => HomeStackComponent;
|
||||||
defaultRoute: string;
|
defaultRoute: string;
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.defaultRoute = AsyncStorageManager.getInstance().preferences.defaultStartScreen.current.toLowerCase();
|
if (props.defaultHomeRoute != null)
|
||||||
|
|
||||||
if (props.defaultRoute !== null)
|
|
||||||
this.defaultRoute = 'home';
|
this.defaultRoute = 'home';
|
||||||
|
else
|
||||||
this.createHomeStackComponent = () => HomeStackComponent(props.defaultRoute, props.defaultData);
|
this.defaultRoute = AsyncStorageManager.getInstance().preferences.defaultStartScreen.current.toLowerCase();
|
||||||
|
this.createHomeStackComponent = () => HomeStackComponent(props.defaultHomeRoute, props.defaultHomeData);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<Tab.Navigator
|
<Tab.Navigator
|
||||||
initialRouteName={this.defaultRoute}
|
initialRouteName={this.defaultRoute}
|
||||||
barStyle={{backgroundColor: this.props.theme.colors.surface, overflow: 'visible'}}
|
|
||||||
screenOptions={({route}) => ({
|
|
||||||
tabBarIcon: ({focused, color}) => {
|
|
||||||
let icon = TAB_ICONS[route.name];
|
|
||||||
icon = focused ? icon : icon + ('-outline');
|
|
||||||
if (route.name !== "home")
|
|
||||||
return icon;
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
tabBarLabel: route.name !== 'home' ? undefined : '',
|
|
||||||
activeColor: this.props.theme.colors.primary,
|
|
||||||
inactiveColor: this.props.theme.colors.tabIcon,
|
|
||||||
})}
|
|
||||||
tabBar={props => <CustomTabBar {...props} />}
|
tabBar={props => <CustomTabBar {...props} />}
|
||||||
>
|
>
|
||||||
<Tab.Screen
|
<Tab.Screen
|
||||||
|
@ -379,5 +347,3 @@ class TabNavigator extends React.Component<Props> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default withTheme(TabNavigator);
|
|
||||||
|
|
Loading…
Reference in a new issue