Browse Source

Moved navigation to bottom tabs, replaced react navigation drawer by native-base-side-menu

keplyx 2 years ago
parent
commit
f5c3f27f14

+ 6
- 1
App.js View File

@@ -15,6 +15,8 @@ import AppIntroSlider from 'react-native-app-intro-slider';
15 15
 import {clearThemeCache} from 'native-base-shoutem-theme';
16 16
 import AsyncStorageManager from "./utils/AsyncStorageManager";
17 17
 import CustomMaterialIcon from "./components/CustomMaterialIcon";
18
+import SideBar from "./components/Sidebar";
19
+import SideMenu from "react-native-side-menu";
18 20
 
19 21
 const styles = StyleSheet.create({
20 22
     mainContent: {
@@ -175,10 +177,13 @@ export default class App extends React.Component<Props, State> {
175 177
             return (
176 178
                 <Root>
177 179
                     <StyleProvider style={this.state.currentTheme}>
178
-                        <AppNavigator/>
180
+
181
+                            <AppNavigator/>
179 182
                     </StyleProvider>
180 183
                 </Root>
181 184
             );
182 185
         }
183 186
     }
187
+
188
+    menu = <View/>;
184 189
 }

+ 70
- 0
components/BaseContainer.js View File

@@ -0,0 +1,70 @@
1
+// @flow
2
+
3
+import * as React from 'react';
4
+import {Container, Right} from "native-base";
5
+import CustomHeader from "./CustomHeader";
6
+import CustomSideMenu from "./CustomSideMenu";
7
+import CustomMaterialIcon from "./CustomMaterialIcon";
8
+import {Platform, View} from "react-native";
9
+import ThemeManager from "../utils/ThemeManager";
10
+import Touchable from "react-native-platform-touchable";
11
+
12
+
13
+type Props = {
14
+    navigation: Object,
15
+    headerTitle: string,
16
+    headerRightMenu: React.Node,
17
+    children: React.Node
18
+}
19
+
20
+type State = {
21
+    isOpen: boolean
22
+}
23
+
24
+
25
+export default class BaseContainer extends React.Component<Props, State> {
26
+
27
+    static defaultProps = {
28
+        headerRightMenu: <Right/>
29
+    };
30
+
31
+
32
+    state = {
33
+        isOpen: false,
34
+    };
35
+
36
+    toggle() {
37
+        console.log('coucou');
38
+        this.setState({
39
+            isOpen: !this.state.isOpen,
40
+        });
41
+    }
42
+
43
+    updateMenuState(isOpen: boolean) {
44
+
45
+        this.setState({isOpen});
46
+    }
47
+
48
+    render() {
49
+        console.log(this.state.isOpen);
50
+        return (
51
+            <CustomSideMenu navigation={this.props.navigation} isOpen={this.state.isOpen}
52
+                            onChange={(isOpen) => this.updateMenuState(isOpen)}>
53
+                <Container>
54
+                    <CustomHeader navigation={this.props.navigation} title={this.props.headerTitle}
55
+                                  leftButton={
56
+                                      <Touchable
57
+                                          style={{padding: 6}}
58
+                                          onPress={() => this.toggle()}>
59
+                                          <CustomMaterialIcon
60
+                                              color={Platform.OS === 'ios' ? ThemeManager.getCurrentThemeVariables().brandPrimary : "#fff"}
61
+                                              icon="menu"/>
62
+                                      </Touchable>
63
+                                  }
64
+                    rightMenu={this.props.headerRightMenu}/>
65
+                    {this.props.children}
66
+                </Container>
67
+            </CustomSideMenu>
68
+        );
69
+    }
70
+}

+ 8
- 13
components/CustomHeader.js View File

@@ -2,14 +2,15 @@
2 2
 
3 3
 import * as React from "react";
4 4
 import {Body, Header, Left, Right, Title} from "native-base";
5
-import {Platform, StyleSheet} from "react-native";
5
+import {Platform, StyleSheet, View} from "react-native";
6 6
 import {getStatusBarHeight} from "react-native-status-bar-height";
7 7
 import Touchable from 'react-native-platform-touchable';
8 8
 import ThemeManager from "../utils/ThemeManager";
9 9
 import CustomMaterialIcon from "./CustomMaterialIcon";
10 10
 
11 11
 type Props = {
12
-    backButton: boolean,
12
+    hasBackButton: boolean,
13
+    leftButton: React.Node,
13 14
     rightMenu: React.Node,
14 15
     title: string,
15 16
     navigation: Object,
@@ -19,7 +20,7 @@ type Props = {
19 20
 /**
20 21
  * Custom component defining a header using native base
21 22
  *
22
- * @prop backButton {boolean} Whether to show a back button or a burger menu. Use burger if unspecified
23
+ * @prop hasBackButton {boolean} Whether to show a back button or a burger menu. Use burger if unspecified
23 24
  * @prop rightMenu {React.Node} Element to place at the right of the header. Use nothing if unspecified
24 25
  * @prop title {string} This header title
25 26
  * @prop navigation {Object} The navigation object from react navigation
@@ -27,7 +28,8 @@ type Props = {
27 28
 export default class CustomHeader extends React.Component<Props> {
28 29
 
29 30
     static defaultProps = {
30
-        backButton: false,
31
+        hasBackButton: false,
32
+        leftButton: <View/>,
31 33
         rightMenu: <Right/>,
32 34
         hasTabs: false,
33 35
     };
@@ -35,7 +37,7 @@ export default class CustomHeader extends React.Component<Props> {
35 37
     render() {
36 38
         let button;
37 39
         // Does the app have a back button or a burger menu ?
38
-        if (this.props.backButton)
40
+        if (this.props.hasBackButton)
39 41
             button =
40 42
                 <Touchable
41 43
                     style={{padding: 6}}
@@ -45,14 +47,7 @@ export default class CustomHeader extends React.Component<Props> {
45 47
                         icon="arrow-left"/>
46 48
                 </Touchable>;
47 49
         else
48
-            button =
49
-                <Touchable
50
-                    style={{padding: 6}}
51
-                    onPress={() => this.props.navigation.toggleDrawer()}>
52
-                    <CustomMaterialIcon
53
-                        color={Platform.OS === 'ios' ? ThemeManager.getCurrentThemeVariables().brandPrimary : "#fff"}
54
-                        icon="menu"/>
55
-                </Touchable>;
50
+            button = this.props.leftButton;
56 51
 
57 52
         return (
58 53
             <Header style={styles.header}>

+ 26
- 0
components/CustomSideMenu.js View File

@@ -0,0 +1,26 @@
1
+// @flow
2
+
3
+import * as React from 'react';
4
+import SideMenu from "react-native-side-menu";
5
+import SideBar from "./Sidebar";
6
+
7
+
8
+type Props = {
9
+    navigation: Object,
10
+    children: React.Node,
11
+    isOpen: boolean,
12
+    onChange: Function
13
+}
14
+
15
+export default class CustomSideMenu extends React.Component<Props> {
16
+    render() {
17
+        console.log(this.props.isOpen);
18
+        return (
19
+            <SideMenu menu={<SideBar navigation={this.props.navigation}/>}
20
+                      isOpen={this.props.isOpen}
21
+                      onChange={this.props.onChange}>
22
+                {this.props.children}
23
+            </SideMenu>
24
+        );
25
+    }
26
+}

+ 4
- 5
components/FetchedDataSectionList.js View File

@@ -2,12 +2,12 @@
2 2
 
3 3
 import * as React from 'react';
4 4
 import WebDataManager from "../utils/WebDataManager";
5
-import {Container, H3, Spinner, Tab, TabHeading, Tabs, Text} from "native-base";
6
-import CustomHeader from "./CustomHeader";
5
+import {H3, Spinner, Tab, TabHeading, Tabs, Text} from "native-base";
7 6
 import {RefreshControl, SectionList, View} from "react-native";
8 7
 import CustomMaterialIcon from "./CustomMaterialIcon";
9 8
 import i18n from 'i18n-js';
10 9
 import ThemeManager from "../utils/ThemeManager";
10
+import BaseContainer from "./BaseContainer";
11 11
 
12 12
 type Props = {
13 13
     navigation: Object,
@@ -312,8 +312,7 @@ export default class FetchedDataSectionList extends React.Component<Props, State
312 312
         const nav = this.props.navigation;
313 313
         const dataset = this.createDataset(this.state.fetchedData);
314 314
         return (
315
-            <Container>
316
-                <CustomHeader navigation={nav} title={this.getHeaderTranslation()}/>
315
+            <BaseContainer navigation={nav} headerTitle={this.getHeaderTranslation()}>
317 316
                 {this.hasTabs() ?
318 317
                     <Tabs>
319 318
                         {this.getTabbedView(dataset)}
@@ -321,7 +320,7 @@ export default class FetchedDataSectionList extends React.Component<Props, State
321 320
                     :
322 321
                     this.getSectionList(dataset)
323 322
                 }
324
-            </Container>
323
+            </BaseContainer>
325 324
         );
326 325
     }
327 326
 

components/SideMenu.js → components/Sidebar.js View File

@@ -43,31 +43,6 @@ export default class SideBar extends React.Component<Props, State> {
43 43
         // If the link field is defined, clicking on the item will open the link
44 44
         this.dataSet = [
45 45
             {
46
-                name: i18n.t('screens.home'),
47
-                route: "Home",
48
-                icon: "home",
49
-            },
50
-            {
51
-                name: i18n.t('screens.planning'),
52
-                route: "Planning",
53
-                icon: "calendar-range",
54
-            },
55
-            {
56
-                name: "Proxiwash",
57
-                route: "Proxiwash",
58
-                icon: "washing-machine",
59
-            },
60
-            {
61
-                name: "Proximo",
62
-                route: "Proximo",
63
-                icon: "shopping",
64
-            },
65
-            {
66
-                name: 'Planex',
67
-                route: "Planex",
68
-                icon: "timetable",
69
-            },
70
-            {
71 46
                 name: "Amicale",
72 47
                 route: "amicale",
73 48
                 icon: "web",
@@ -79,16 +54,16 @@ export default class SideBar extends React.Component<Props, State> {
79 54
                 icon: "wikipedia",
80 55
                 link: WIKETUD_LINK
81 56
             },
82
-            {
83
-                name: i18n.t('screens.settings'),
84
-                route: "Settings",
85
-                icon: "settings",
86
-            },
87
-            {
88
-                name: i18n.t('screens.about'),
89
-                route: "About",
90
-                icon: "information",
91
-            },
57
+            // {
58
+            //     name: i18n.t('screens.settings'),
59
+            //     route: "Settings",
60
+            //     icon: "settings",
61
+            // },
62
+            // {
63
+            //     name: i18n.t('screens.about'),
64
+            //     route: "About",
65
+            //     icon: "information",
66
+            // },
92 67
         ];
93 68
     }
94 69
 
@@ -99,7 +74,6 @@ export default class SideBar extends React.Component<Props, State> {
99 74
     navigateToScreen(route: string) {
100 75
         this.props.navigation.navigate(route);
101 76
         this.props.navigation.closeDrawer();
102
-        this.setState({active: route});
103 77
     };
104 78
 
105 79
     render() {
@@ -118,7 +92,7 @@ export default class SideBar extends React.Component<Props, State> {
118 92
                         renderItem={({item}) =>
119 93
                             <ListItem
120 94
                                 button
121
-                                noBorder={item.name !== 'Wiketud' && item.name !== 'Planex'} // Display a separator before settings and Amicale
95
+                                noBorder
122 96
                                 selected={this.state.active === item.route}
123 97
                                 onPress={() => {
124 98
                                     if (item.link !== undefined)

+ 4
- 2
navigation/AppNavigator.js View File

@@ -3,6 +3,7 @@
3 3
 import {createAppContainer, createStackNavigator} from 'react-navigation';
4 4
 
5 5
 import MainDrawerNavigator from './MainDrawerNavigator';
6
+import MainTabNavigator from './MainTabNavigator';
6 7
 import ProximoListScreen from '../screens/Proximo/ProximoListScreen';
7 8
 import AboutDependenciesScreen from '../screens/About/AboutDependenciesScreen';
8 9
 
@@ -11,12 +12,13 @@ import AboutDependenciesScreen from '../screens/About/AboutDependenciesScreen';
11 12
  */
12 13
 export default createAppContainer(
13 14
     createStackNavigator({
14
-            Main: MainDrawerNavigator,
15
+            Tabs: MainTabNavigator,
16
+            // Drawer: MainDrawerNavigator,
15 17
             ProximoListScreen: {screen: ProximoListScreen},
16 18
             AboutDependenciesScreen: {screen: AboutDependenciesScreen},
17 19
         },
18 20
         {
19
-            initialRouteName: "Main",
21
+            initialRouteName: "Tabs",
20 22
             mode: 'card',
21 23
             headerMode: "none"
22 24
         })

+ 2
- 2
navigation/MainDrawerNavigator.js View File

@@ -10,7 +10,7 @@ import ProximoMainScreen from '../screens/Proximo/ProximoMainScreen';
10 10
 import PlanexScreen from '../screens/PlanexScreen';
11 11
 import SettingsScreen from '../screens/SettingsScreen';
12 12
 import AboutScreen from '../screens/About/AboutScreen';
13
-import SideMenu from "../components/SideMenu";
13
+import Sidebar from "../components/Sidebar";
14 14
 
15 15
 /**
16 16
  * Creates the drawer navigation stack
@@ -24,7 +24,7 @@ export default createDrawerNavigator({
24 24
         Settings: {screen: SettingsScreen,},
25 25
         About: {screen: AboutScreen,},
26 26
     }, {
27
-        contentComponent: SideMenu,
27
+        contentComponent: Sidebar,
28 28
         initialRouteName: 'Home',
29 29
         backBehavior: 'initialRoute',
30 30
         drawerType: 'front',

+ 40
- 0
navigation/MainTabNavigator.js View File

@@ -0,0 +1,40 @@
1
+import * as React from 'react';
2
+import {createMaterialBottomTabNavigator} from "react-navigation-material-bottom-tabs";
3
+
4
+import HomeScreen from '../screens/HomeScreen';
5
+import PlanningScreen from '../screens/PlanningScreen';
6
+import ProxiwashScreen from '../screens/ProxiwashScreen';
7
+import ProximoMainScreen from '../screens/Proximo/ProximoMainScreen';
8
+import PlanexScreen from '../screens/PlanexScreen';
9
+import CustomMaterialIcon from "../components/CustomMaterialIcon";
10
+
11
+const TAB_ICONS = {
12
+    Home: 'home',
13
+    Planning: 'calendar-range',
14
+    Proxiwash: 'washing-machine',
15
+    Proximo: 'shopping',
16
+    Planex: 'timetable',
17
+};
18
+
19
+
20
+export default createMaterialBottomTabNavigator({
21
+    Home: {screen: HomeScreen},
22
+    Planning: {screen: PlanningScreen,},
23
+    Proxiwash: {screen: ProxiwashScreen,},
24
+    Proximo: {screen: ProximoMainScreen,},
25
+    Planex: {screen: PlanexScreen},
26
+}, {
27
+    defaultNavigationOptions: ({navigation}) => ({
28
+        tabBarIcon: ({focused, horizontal, tintColor}) => {
29
+            let icon = TAB_ICONS[navigation.state.routeName];
30
+
31
+            return <CustomMaterialIcon icon={icon} color={tintColor}/>;
32
+        }
33
+    }),
34
+    order: ['Proximo', 'Planning', 'Home', 'Proxiwash', 'Planex'],
35
+    initialRouteName: 'Home',
36
+    activeColor: '#f0edf6',
37
+    inactiveColor: '#7f150a',
38
+    backBehavior: 'initialRoute',
39
+    barStyle: {backgroundColor: '#e42612'},
40
+});

+ 599
- 0
package-lock.json View File

@@ -925,6 +925,18 @@
925 925
         "to-fast-properties": "^2.0.0"
926 926
       }
927 927
     },
928
+    "@callstack/react-theme-provider": {
929
+      "version": "1.0.7",
930
+      "resolved": "https://registry.npmjs.org/@callstack/react-theme-provider/-/react-theme-provider-1.0.7.tgz",
931
+      "integrity": "sha512-NTjvHadSLja5KruFXThC6rwLrewzbPSZFefgl5hTWXVZ40BsIDn3744AgregeuGTM3249K1cE9uN7UKua87pKQ==",
932
+      "requires": {
933
+        "create-react-context": "^0.2.1",
934
+        "deepmerge": "^2.1.1",
935
+        "flow-copy-source": "^1.3.0",
936
+        "hoist-non-react-statics": "^2.5.0",
937
+        "prop-types": "^15.6.0"
938
+      }
939
+    },
928 940
     "@expo/vector-icons": {
929 941
       "version": "10.0.2",
930 942
       "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-10.0.2.tgz",
@@ -1594,6 +1606,11 @@
1594 1606
         "lodash": "^4.17.11"
1595 1607
       }
1596 1608
     },
1609
+    "async-each": {
1610
+      "version": "1.0.3",
1611
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
1612
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
1613
+    },
1597 1614
     "async-limiter": {
1598 1615
       "version": "1.0.0",
1599 1616
       "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
@@ -1786,6 +1803,11 @@
1786 1803
       "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.44.tgz",
1787 1804
       "integrity": "sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ=="
1788 1805
     },
1806
+    "binary-extensions": {
1807
+      "version": "1.13.1",
1808
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
1809
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
1810
+    },
1789 1811
     "blueimp-md5": {
1790 1812
       "version": "2.10.0",
1791 1813
       "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.10.0.tgz",
@@ -1965,6 +1987,118 @@
1965 1987
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
1966 1988
       "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
1967 1989
     },
1990
+    "chokidar": {
1991
+      "version": "2.1.6",
1992
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
1993
+      "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
1994
+      "requires": {
1995
+        "anymatch": "^2.0.0",
1996
+        "async-each": "^1.0.1",
1997
+        "braces": "^2.3.2",
1998
+        "fsevents": "^1.2.7",
1999
+        "glob-parent": "^3.1.0",
2000
+        "inherits": "^2.0.3",
2001
+        "is-binary-path": "^1.0.0",
2002
+        "is-glob": "^4.0.0",
2003
+        "normalize-path": "^3.0.0",
2004
+        "path-is-absolute": "^1.0.0",
2005
+        "readdirp": "^2.2.1",
2006
+        "upath": "^1.1.1"
2007
+      },
2008
+      "dependencies": {
2009
+        "array-unique": {
2010
+          "version": "0.3.2",
2011
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
2012
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
2013
+        },
2014
+        "braces": {
2015
+          "version": "2.3.2",
2016
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
2017
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
2018
+          "requires": {
2019
+            "arr-flatten": "^1.1.0",
2020
+            "array-unique": "^0.3.2",
2021
+            "extend-shallow": "^2.0.1",
2022
+            "fill-range": "^4.0.0",
2023
+            "isobject": "^3.0.1",
2024
+            "repeat-element": "^1.1.2",
2025
+            "snapdragon": "^0.8.1",
2026
+            "snapdragon-node": "^2.0.1",
2027
+            "split-string": "^3.0.2",
2028
+            "to-regex": "^3.0.1"
2029
+          }
2030
+        },
2031
+        "extend-shallow": {
2032
+          "version": "2.0.1",
2033
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2034
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2035
+          "requires": {
2036
+            "is-extendable": "^0.1.0"
2037
+          }
2038
+        },
2039
+        "fill-range": {
2040
+          "version": "4.0.0",
2041
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
2042
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
2043
+          "requires": {
2044
+            "extend-shallow": "^2.0.1",
2045
+            "is-number": "^3.0.0",
2046
+            "repeat-string": "^1.6.1",
2047
+            "to-regex-range": "^2.1.0"
2048
+          }
2049
+        },
2050
+        "glob-parent": {
2051
+          "version": "3.1.0",
2052
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
2053
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
2054
+          "requires": {
2055
+            "is-glob": "^3.1.0",
2056
+            "path-dirname": "^1.0.0"
2057
+          },
2058
+          "dependencies": {
2059
+            "is-glob": {
2060
+              "version": "3.1.0",
2061
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
2062
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
2063
+              "requires": {
2064
+                "is-extglob": "^2.1.0"
2065
+              }
2066
+            }
2067
+          }
2068
+        },
2069
+        "is-extglob": {
2070
+          "version": "2.1.1",
2071
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2072
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
2073
+        },
2074
+        "is-glob": {
2075
+          "version": "4.0.1",
2076
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
2077
+          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
2078
+          "requires": {
2079
+            "is-extglob": "^2.1.1"
2080
+          }
2081
+        },
2082
+        "is-number": {
2083
+          "version": "3.0.0",
2084
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
2085
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
2086
+          "requires": {
2087
+            "kind-of": "^3.0.2"
2088
+          }
2089
+        },
2090
+        "isobject": {
2091
+          "version": "3.0.1",
2092
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
2093
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
2094
+        },
2095
+        "normalize-path": {
2096
+          "version": "3.0.0",
2097
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2098
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
2099
+        }
2100
+      }
2101
+    },
1968 2102
     "clamp": {
1969 2103
       "version": "1.0.1",
1970 2104
       "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
@@ -2254,6 +2388,15 @@
2254 2388
         "object-assign": "^4.1.1"
2255 2389
       }
2256 2390
     },
2391
+    "create-react-context": {
2392
+      "version": "0.2.3",
2393
+      "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz",
2394
+      "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==",
2395
+      "requires": {
2396
+        "fbjs": "^0.8.0",
2397
+        "gud": "^1.0.0"
2398
+      }
2399
+    },
2257 2400
     "cross-spawn": {
2258 2401
       "version": "6.0.5",
2259 2402
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -2289,6 +2432,11 @@
2289 2432
       "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz",
2290 2433
       "integrity": "sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s="
2291 2434
     },
2435
+    "deepmerge": {
2436
+      "version": "2.2.1",
2437
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
2438
+      "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="
2439
+    },
2292 2440
     "define-property": {
2293 2441
       "version": "2.0.2",
2294 2442
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
@@ -3130,6 +3278,75 @@
3130 3278
         "locate-path": "^2.0.0"
3131 3279
       }
3132 3280
     },
3281
+    "flow-copy-source": {
3282
+      "version": "1.3.0",
3283
+      "resolved": "https://registry.npmjs.org/flow-copy-source/-/flow-copy-source-1.3.0.tgz",
3284
+      "integrity": "sha512-F8aRmNmtB5l+RFG7LAWj6IYU22K37BrhIXXCcQyxSsYWm0pNubnhBSEk+eoyGCou3+4aI4tReOfLFtgd5wnnYQ==",
3285
+      "requires": {
3286
+        "chokidar": "^2.0.0",
3287
+        "fs-extra": "^5.0.0",
3288
+        "glob": "^7.0.0",
3289
+        "kefir": "^3.7.3",
3290
+        "yargs": "^11.0.0"
3291
+      },
3292
+      "dependencies": {
3293
+        "cliui": {
3294
+          "version": "4.1.0",
3295
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
3296
+          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
3297
+          "requires": {
3298
+            "string-width": "^2.1.1",
3299
+            "strip-ansi": "^4.0.0",
3300
+            "wrap-ansi": "^2.0.0"
3301
+          }
3302
+        },
3303
+        "fs-extra": {
3304
+          "version": "5.0.0",
3305
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
3306
+          "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
3307
+          "requires": {
3308
+            "graceful-fs": "^4.1.2",
3309
+            "jsonfile": "^4.0.0",
3310
+            "universalify": "^0.1.0"
3311
+          }
3312
+        },
3313
+        "strip-ansi": {
3314
+          "version": "4.0.0",
3315
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
3316
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
3317
+          "requires": {
3318
+            "ansi-regex": "^3.0.0"
3319
+          }
3320
+        },
3321
+        "yargs": {
3322
+          "version": "11.1.0",
3323
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz",
3324
+          "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==",
3325
+          "requires": {
3326
+            "cliui": "^4.0.0",
3327
+            "decamelize": "^1.1.1",
3328
+            "find-up": "^2.1.0",
3329
+            "get-caller-file": "^1.0.1",
3330
+            "os-locale": "^2.0.0",
3331
+            "require-directory": "^2.1.1",
3332
+            "require-main-filename": "^1.0.1",
3333
+            "set-blocking": "^2.0.0",
3334
+            "string-width": "^2.0.0",
3335
+            "which-module": "^2.0.0",
3336
+            "y18n": "^3.2.1",
3337
+            "yargs-parser": "^9.0.2"
3338
+          }
3339
+        },
3340
+        "yargs-parser": {
3341
+          "version": "9.0.2",
3342
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
3343
+          "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
3344
+          "requires": {
3345
+            "camelcase": "^4.1.0"
3346
+          }
3347
+        }
3348
+      }
3349
+    },
3133 3350
     "fontfaceobserver": {
3134 3351
       "version": "2.1.0",
3135 3352
       "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.1.0.tgz",
@@ -3756,6 +3973,11 @@
3756 3973
       "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
3757 3974
       "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
3758 3975
     },
3976
+    "gud": {
3977
+      "version": "1.0.0",
3978
+      "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
3979
+      "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
3980
+    },
3759 3981
     "has-ansi": {
3760 3982
       "version": "2.0.0",
3761 3983
       "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
@@ -3965,6 +4187,14 @@
3965 4187
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
3966 4188
       "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
3967 4189
     },
4190
+    "is-binary-path": {
4191
+      "version": "1.0.1",
4192
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
4193
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
4194
+      "requires": {
4195
+        "binary-extensions": "^1.0.0"
4196
+      }
4197
+    },
3968 4198
     "is-buffer": {
3969 4199
       "version": "1.1.6",
3970 4200
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
@@ -4206,6 +4436,21 @@
4206 4436
       "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
4207 4437
       "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
4208 4438
     },
4439
+    "kefir": {
4440
+      "version": "3.8.6",
4441
+      "resolved": "https://registry.npmjs.org/kefir/-/kefir-3.8.6.tgz",
4442
+      "integrity": "sha512-H/8ZTjmEEme2YL388rgy5fFlz2NM4ZImNI2rJrTsR8og454kpY3lPVv53W9lfevNELfNeYD33gMdIKHL25z7WA==",
4443
+      "requires": {
4444
+        "symbol-observable": "1.0.4"
4445
+      },
4446
+      "dependencies": {
4447
+        "symbol-observable": {
4448
+          "version": "1.0.4",
4449
+          "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz",
4450
+          "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0="
4451
+        }
4452
+      }
4453
+    },
4209 4454
     "kind-of": {
4210 4455
       "version": "3.2.2",
4211 4456
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
@@ -5326,6 +5571,11 @@
5326 5571
       "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.0.tgz",
5327 5572
       "integrity": "sha512-Hkavx/nY4/plImrZPHRk2CL9vpOymZLgEbMNX1U0bjcBL7QN9wODxyx0yaMZURSQaUtSEvDrfAvxa9oPb0at9g=="
5328 5573
     },
5574
+    "path-dirname": {
5575
+      "version": "1.0.2",
5576
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
5577
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
5578
+    },
5329 5579
     "path-exists": {
5330 5580
       "version": "3.0.0",
5331 5581
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
@@ -5928,6 +6178,38 @@
5928 6178
         "prop-types": "^15.6.0"
5929 6179
       }
5930 6180
     },
6181
+    "react-native-paper": {
6182
+      "version": "2.16.0",
6183
+      "resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-2.16.0.tgz",
6184
+      "integrity": "sha512-dNHbVZNi9cfKr5sd/5pPGSJSo7ctnl61wLmRxWwvQ2VyEhDN+YxflvZ/vDZrnyivVWPcFS1nmiGCxABARISsuw==",
6185
+      "requires": {
6186
+        "@callstack/react-theme-provider": "^1.0.7",
6187
+        "color": "^2.0.1",
6188
+        "create-react-context": "^0.2.3",
6189
+        "hoist-non-react-statics": "^3.1.0",
6190
+        "react-lifecycles-compat": "^3.0.4",
6191
+        "react-native-safe-area-view": "^0.12.0"
6192
+      },
6193
+      "dependencies": {
6194
+        "color": {
6195
+          "version": "2.0.1",
6196
+          "resolved": "https://registry.npmjs.org/color/-/color-2.0.1.tgz",
6197
+          "integrity": "sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==",
6198
+          "requires": {
6199
+            "color-convert": "^1.9.1",
6200
+            "color-string": "^1.5.2"
6201
+          }
6202
+        },
6203
+        "hoist-non-react-statics": {
6204
+          "version": "3.3.0",
6205
+          "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz",
6206
+          "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==",
6207
+          "requires": {
6208
+            "react-is": "^16.7.0"
6209
+          }
6210
+        }
6211
+      }
6212
+    },
5931 6213
     "react-native-platform-touchable": {
5932 6214
       "version": "1.1.1",
5933 6215
       "resolved": "https://registry.npmjs.org/react-native-platform-touchable/-/react-native-platform-touchable-1.1.1.tgz",
@@ -5938,6 +6220,14 @@
5938 6220
       "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.0.1.tgz",
5939 6221
       "integrity": "sha512-RENoo6/sJc3FApP7vJ1Js7WyDuTVh97bbr5aMjJyw3kqpR2/JDHyL/dQFfOvSSAc+VjitpR9/CfPPad7tLRiIA=="
5940 6222
     },
6223
+    "react-native-safe-area-view": {
6224
+      "version": "0.12.0",
6225
+      "resolved": "https://registry.npmjs.org/react-native-safe-area-view/-/react-native-safe-area-view-0.12.0.tgz",
6226
+      "integrity": "sha512-UrAXmBC4KNR5K2eczIDZgqceWyKsgG9gmWFerHCvoyApfei8ceBB9u/c//PWCpS5Gt8MRLTmX5jPtzdXo2yNqg==",
6227
+      "requires": {
6228
+        "hoist-non-react-statics": "^2.3.1"
6229
+      }
6230
+    },
5941 6231
     "react-native-safe-module": {
5942 6232
       "version": "1.2.0",
5943 6233
       "resolved": "https://registry.npmjs.org/react-native-safe-module/-/react-native-safe-module-1.2.0.tgz",
@@ -5951,6 +6241,14 @@
5951 6241
       "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-1.0.0-alpha.22.tgz",
5952 6242
       "integrity": "sha512-kSyAt0AeVU6N7ZonfV6dP6iZF8B7Bce+tk3eujXhzBGsLg0VSLnU7uE9VqJF0xdQrHR91ZjGgVMieo/8df9KTA=="
5953 6243
     },
6244
+    "react-native-side-menu": {
6245
+      "version": "1.1.3",
6246
+      "resolved": "https://registry.npmjs.org/react-native-side-menu/-/react-native-side-menu-1.1.3.tgz",
6247
+      "integrity": "sha1-bvXSIy7PcYMS32zt7wGRSLrDBzo=",
6248
+      "requires": {
6249
+        "prop-types": "^15.5.10"
6250
+      }
6251
+    },
5954 6252
     "react-native-status-bar-height": {
5955 6253
       "version": "2.3.1",
5956 6254
       "resolved": "https://registry.npmjs.org/react-native-status-bar-height/-/react-native-status-bar-height-2.3.1.tgz",
@@ -6035,6 +6333,29 @@
6035 6333
         "react-native-tab-view": "^1.2.0"
6036 6334
       }
6037 6335
     },
6336
+    "react-navigation-material-bottom-tabs": {
6337
+      "version": "1.0.0",
6338
+      "resolved": "https://registry.npmjs.org/react-navigation-material-bottom-tabs/-/react-navigation-material-bottom-tabs-1.0.0.tgz",
6339
+      "integrity": "sha512-fmPOt82xYpNYWh7gDdk38ce2TDmKuGnVaC7Pd67Ss62bjZ2CwmX9kOXExThtdY039zDGIcABDq9h65c8TQeTUA==",
6340
+      "requires": {
6341
+        "hoist-non-react-statics": "^2.5.0",
6342
+        "prop-types": "^15.6.0",
6343
+        "react-navigation-tabs": "1.0.0"
6344
+      },
6345
+      "dependencies": {
6346
+        "react-navigation-tabs": {
6347
+          "version": "1.0.0",
6348
+          "resolved": "https://registry.npmjs.org/react-navigation-tabs/-/react-navigation-tabs-1.0.0.tgz",
6349
+          "integrity": "sha512-2oWPk+XfwHihgdOBhuAuzzU94NPhwdvuzseL30R3VsggunfVB4cUtNiQjRP4rVVpdGgJygQtws1eRbUsQ9cECA==",
6350
+          "requires": {
6351
+            "hoist-non-react-statics": "^2.5.0",
6352
+            "prop-types": "^15.6.1",
6353
+            "react-lifecycles-compat": "^3.0.4",
6354
+            "react-native-tab-view": "^1.0.0"
6355
+          }
6356
+        }
6357
+      }
6358
+    },
6038 6359
     "react-navigation-stack": {
6039 6360
       "version": "1.4.0",
6040 6361
       "resolved": "https://registry.npmjs.org/react-navigation-stack/-/react-navigation-stack-1.4.0.tgz",
@@ -6116,6 +6437,279 @@
6116 6437
         "util-deprecate": "~1.0.1"
6117 6438
       }
6118 6439
     },
6440
+    "readdirp": {
6441
+      "version": "2.2.1",
6442
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
6443
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
6444
+      "requires": {
6445
+        "graceful-fs": "^4.1.11",
6446
+        "micromatch": "^3.1.10",
6447
+        "readable-stream": "^2.0.2"
6448
+      },
6449
+      "dependencies": {
6450
+        "arr-diff": {
6451
+          "version": "4.0.0",
6452
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
6453
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
6454
+        },
6455
+        "array-unique": {
6456
+          "version": "0.3.2",
6457
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
6458
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
6459
+        },
6460
+        "braces": {
6461
+          "version": "2.3.2",
6462
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
6463
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
6464
+          "requires": {
6465
+            "arr-flatten": "^1.1.0",
6466
+            "array-unique": "^0.3.2",
6467
+            "extend-shallow": "^2.0.1",
6468
+            "fill-range": "^4.0.0",
6469
+            "isobject": "^3.0.1",
6470
+            "repeat-element": "^1.1.2",
6471
+            "snapdragon": "^0.8.1",
6472
+            "snapdragon-node": "^2.0.1",
6473
+            "split-string": "^3.0.2",
6474
+            "to-regex": "^3.0.1"
6475
+          },
6476
+          "dependencies": {
6477
+            "extend-shallow": {
6478
+              "version": "2.0.1",
6479
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6480
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6481
+              "requires": {
6482
+                "is-extendable": "^0.1.0"
6483
+              }
6484
+            }
6485
+          }
6486
+        },
6487
+        "debug": {
6488
+          "version": "2.6.9",
6489
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
6490
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
6491
+          "requires": {
6492
+            "ms": "2.0.0"
6493
+          }
6494
+        },
6495
+        "expand-brackets": {
6496
+          "version": "2.1.4",
6497
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
6498
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
6499
+          "requires": {
6500
+            "debug": "^2.3.3",
6501
+            "define-property": "^0.2.5",
6502
+            "extend-shallow": "^2.0.1",
6503
+            "posix-character-classes": "^0.1.0",
6504
+            "regex-not": "^1.0.0",
6505
+            "snapdragon": "^0.8.1",
6506
+            "to-regex": "^3.0.1"
6507
+          },
6508
+          "dependencies": {
6509
+            "define-property": {
6510
+              "version": "0.2.5",
6511
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
6512
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
6513
+              "requires": {
6514
+                "is-descriptor": "^0.1.0"
6515
+              }
6516
+            },
6517
+            "extend-shallow": {
6518
+              "version": "2.0.1",
6519
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6520
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6521
+              "requires": {
6522
+                "is-extendable": "^0.1.0"
6523
+              }
6524
+            },
6525
+            "is-accessor-descriptor": {
6526
+              "version": "0.1.6",
6527
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
6528
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
6529
+              "requires": {
6530
+                "kind-of": "^3.0.2"
6531
+              },
6532
+              "dependencies": {
6533
+                "kind-of": {
6534
+                  "version": "3.2.2",
6535
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
6536
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
6537
+                  "requires": {
6538
+                    "is-buffer": "^1.1.5"
6539
+                  }
6540
+                }
6541
+              }
6542
+            },
6543
+            "is-data-descriptor": {
6544
+              "version": "0.1.4",
6545
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
6546
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
6547
+              "requires": {
6548
+                "kind-of": "^3.0.2"
6549
+              },
6550
+              "dependencies": {
6551
+                "kind-of": {
6552
+                  "version": "3.2.2",
6553
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
6554
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
6555
+                  "requires": {
6556
+                    "is-buffer": "^1.1.5"
6557
+                  }
6558
+                }
6559
+              }
6560
+            },
6561
+            "is-descriptor": {
6562
+              "version": "0.1.6",
6563
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
6564
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
6565
+              "requires": {
6566
+                "is-accessor-descriptor": "^0.1.6",
6567
+                "is-data-descriptor": "^0.1.4",
6568
+                "kind-of": "^5.0.0"
6569
+              }
6570
+            },
6571
+            "kind-of": {
6572
+              "version": "5.1.0",
6573
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
6574
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
6575
+            }
6576
+          }
6577
+        },
6578
+        "extglob": {
6579
+          "version": "2.0.4",
6580
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
6581
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
6582
+          "requires": {
6583
+            "array-unique": "^0.3.2",
6584
+            "define-property": "^1.0.0",
6585
+            "expand-brackets": "^2.1.4",
6586
+            "extend-shallow": "^2.0.1",
6587
+            "fragment-cache": "^0.2.1",
6588
+            "regex-not": "^1.0.0",
6589
+            "snapdragon": "^0.8.1",
6590
+            "to-regex": "^3.0.1"
6591
+          },
6592
+          "dependencies": {
6593
+            "define-property": {
6594
+              "version": "1.0.0",
6595
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
6596
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
6597
+              "requires": {
6598
+                "is-descriptor": "^1.0.0"
6599
+              }
6600
+            },
6601
+            "extend-shallow": {
6602
+              "version": "2.0.1",
6603
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6604
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6605
+              "requires": {
6606
+                "is-extendable": "^0.1.0"
6607
+              }
6608
+            }
6609
+          }
6610
+        },
6611
+        "fill-range": {
6612
+          "version": "4.0.0",
6613
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
6614
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
6615
+          "requires": {
6616
+            "extend-shallow": "^2.0.1",
6617
+            "is-number": "^3.0.0",
6618
+            "repeat-string": "^1.6.1",
6619
+            "to-regex-range": "^2.1.0"
6620
+          },
6621
+          "dependencies": {
6622
+            "extend-shallow": {
6623
+              "version": "2.0.1",
6624
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6625
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6626
+              "requires": {
6627
+                "is-extendable": "^0.1.0"
6628
+              }
6629
+            }
6630
+          }
6631
+        },
6632
+        "is-accessor-descriptor": {
6633
+          "version": "1.0.0",
6634
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
6635
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
6636
+          "requires": {
6637
+            "kind-of": "^6.0.0"
6638
+          }
6639
+        },
6640
+        "is-data-descriptor": {
6641
+          "version": "1.0.0",
6642
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
6643
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
6644
+          "requires": {
6645
+            "kind-of": "^6.0.0"
6646
+          }
6647
+        },
6648
+        "is-descriptor": {
6649
+          "version": "1.0.2",
6650
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
6651
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
6652
+          "requires": {
6653
+            "is-accessor-descriptor": "^1.0.0",
6654
+            "is-data-descriptor": "^1.0.0",
6655
+            "kind-of": "^6.0.2"
6656
+          }
6657
+        },
6658
+        "is-number": {
6659
+          "version": "3.0.0",
6660
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
6661
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
6662
+          "requires": {
6663
+            "kind-of": "^3.0.2"
6664
+          },
6665
+          "dependencies": {
6666
+            "kind-of": {
6667
+              "version": "3.2.2",
6668
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
6669
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
6670
+              "requires": {
6671
+                "is-buffer": "^1.1.5"
6672
+              }
6673
+            }
6674
+          }
6675
+        },
6676
+        "isobject": {
6677
+          "version": "3.0.1",
6678
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
6679
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
6680
+        },
6681
+        "kind-of": {
6682
+          "version": "6.0.2",
6683
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
6684
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
6685
+        },
6686
+        "micromatch": {
6687
+          "version": "3.1.10",
6688
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
6689
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
6690
+          "requires": {
6691
+            "arr-diff": "^4.0.0",
6692
+            "array-unique": "^0.3.2",
6693
+            "braces": "^2.3.1",
6694
+            "define-property": "^2.0.2",
6695
+            "extend-shallow": "^3.0.2",
6696
+            "extglob": "^2.0.4",
6697
+            "fragment-cache": "^0.2.1",
6698
+            "kind-of": "^6.0.2",
6699
+            "nanomatch": "^1.2.9",
6700
+            "object.pick": "^1.3.0",
6701
+            "regex-not": "^1.0.0",
6702
+            "snapdragon": "^0.8.1",
6703
+            "to-regex": "^3.0.2"
6704
+          }
6705
+        },
6706
+        "ms": {
6707
+          "version": "2.0.0",
6708
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
6709
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
6710
+        }
6711
+      }
6712
+    },
6119 6713
     "recompose": {
6120 6714
       "version": "0.26.0",
6121 6715
       "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz",
@@ -7419,6 +8013,11 @@
7419 8013
         }
7420 8014
       }
7421 8015
     },
8016
+    "upath": {
8017
+      "version": "1.1.2",
8018
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
8019
+      "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q=="
8020
+    },
7422 8021
     "urix": {
7423 8022
       "version": "0.1.0",
7424 8023
       "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",

+ 4
- 1
package.json View File

@@ -23,10 +23,13 @@
23 23
     "react-native": "^0.59.9",
24 24
     "react-native-app-intro-slider": "^3.0.0",
25 25
     "react-native-autolink": "^1.8.1",
26
+    "react-native-paper": "^2.16.0",
26 27
     "react-native-platform-touchable": "^1.1.1",
28
+    "react-native-side-menu": "^1.1.3",
27 29
     "react-native-status-bar-height": "^2.3.1",
28 30
     "react-native-webview": "^5.8.1",
29
-    "react-navigation": "^3.11.0"
31
+    "react-navigation": "^3.11.0",
32
+    "react-navigation-material-bottom-tabs": "^1.0.0"
30 33
   },
31 34
   "devDependencies": {
32 35
     "babel-preset-expo": "^5.1.1",

+ 1
- 1
screens/About/AboutDependenciesScreen.js View File

@@ -30,7 +30,7 @@ export default class AboutDependenciesScreen extends React.Component<Props> {
30 30
         const data = generateListFromObject(nav.getParam('data', {}));
31 31
         return (
32 32
             <Container>
33
-                <CustomHeader backButton={true} navigation={nav} title={i18n.t('aboutScreen.libs')}/>
33
+                <CustomHeader hasBackButton={true} navigation={nav} title={i18n.t('aboutScreen.libs')}/>
34 34
                 <Content>
35 35
                     <FlatList
36 36
                         data={data}

+ 6
- 4
screens/PlanexScreen.js View File

@@ -8,6 +8,7 @@ import WebView from "react-native-webview";
8 8
 import Touchable from "react-native-platform-touchable";
9 9
 import CustomMaterialIcon from "../components/CustomMaterialIcon";
10 10
 import ThemeManager from "../utils/ThemeManager";
11
+import BaseContainer from "../components/BaseContainer";
11 12
 
12 13
 type Props = {
13 14
     navigation: Object,
@@ -17,7 +18,9 @@ type State = {
17 18
     isFinishedLoading: boolean
18 19
 }
19 20
 
20
-const PLANEX_URL = 'http://planex.insa-toulouse.fr/';
21
+// const PLANEX_URL = 'http://planex.insa-toulouse.fr/';
22
+// TODO use real url in prod
23
+const PLANEX_URL = 'https://srv-falcon.etud.insa-toulouse.fr/~vergnet/planex/planex.insa-toulouse.fr.html';
21 24
 
22 25
 /**
23 26
  * Class defining the app's planex screen.
@@ -53,8 +56,7 @@ export default class PlanningScreen extends React.Component<Props, State> {
53 56
     render() {
54 57
         const nav = this.props.navigation;
55 58
         return (
56
-            <Container>
57
-                <CustomHeader navigation={nav} title={'Planex'} rightMenu={this.getRefreshButton()}/>
59
+            <BaseContainer navigation={nav} headerTitle={'Planex'} headerRightMenu={this.getRefreshButton()}>
58 60
                 <WebView
59 61
                     ref={ref => (this.webview = ref)}
60 62
                     source={{uri: PLANEX_URL}}
@@ -76,7 +78,7 @@ export default class PlanningScreen extends React.Component<Props, State> {
76 78
                         </View>
77 79
                     }
78 80
                 />
79
-            </Container>
81
+            </BaseContainer>
80 82
         );
81 83
     }
82 84
 }

+ 4
- 5
screens/PlanningScreen.js View File

@@ -1,13 +1,13 @@
1 1
 // @flow
2 2
 
3 3
 import * as React from 'react';
4
-import {Button, Container, H3, Text} from 'native-base';
5
-import CustomHeader from "../components/CustomHeader";
4
+import {Button, H3, Text} from 'native-base';
6 5
 import i18n from "i18n-js";
7 6
 import {Platform, View} from "react-native";
8 7
 import CustomMaterialIcon from "../components/CustomMaterialIcon";
9 8
 import ThemeManager from "../utils/ThemeManager";
10 9
 import {Linking} from "expo";
10
+import BaseContainer from "../components/BaseContainer";
11 11
 
12 12
 type Props = {
13 13
     navigation: Object,
@@ -28,8 +28,7 @@ export default class PlanningScreen extends React.Component<Props> {
28 28
     render() {
29 29
         const nav = this.props.navigation;
30 30
         return (
31
-            <Container>
32
-                <CustomHeader navigation={nav} title={i18n.t('screens.planning')}/>
31
+            <BaseContainer navigation={nav} headerTitle={i18n.t('screens.planning')}>
33 32
                 <View style={{
34 33
                     flexGrow: 1,
35 34
                     justifyContent: 'center',
@@ -70,7 +69,7 @@ export default class PlanningScreen extends React.Component<Props> {
70 69
                         </Button>
71 70
                         : <View/>}
72 71
                 </View>
73
-            </Container>
72
+            </BaseContainer>
74 73
         );
75 74
     }
76 75
 }

+ 1
- 1
screens/Proximo/ProximoListScreen.js View File

@@ -188,7 +188,7 @@ export default class ProximoListScreen extends React.Component<Props, State> {
188 188
 
189 189
         return (
190 190
             <Container>
191
-                <CustomHeader backButton={true} navigation={nav} title={navType} rightMenu={
191
+                <CustomHeader hasBackButton={true} navigation={nav} title={navType} rightMenu={
192 192
                     <Right>
193 193
                         <Menu
194 194
                             ref={this.setMenuRef}

Loading…
Cancel
Save