Browse Source

Use external library to render header buttons

Arnaud Vergnet 4 years ago
parent
commit
f3b7bafdca

+ 3
- 2
package.json View File

28
     "@react-navigation/native": "^5.0.9",
28
     "@react-navigation/native": "^5.0.9",
29
     "@react-navigation/stack": "^5.1.1",
29
     "@react-navigation/stack": "^5.1.1",
30
     "expo": "^37.0.0",
30
     "expo": "^37.0.0",
31
+    "expo-barcode-scanner": "~8.1.0",
32
+    "expo-camera": "latest",
31
     "expo-linear-gradient": "~8.1.0",
33
     "expo-linear-gradient": "~8.1.0",
32
     "expo-localization": "~8.1.0",
34
     "expo-localization": "~8.1.0",
33
     "expo-permissions": "~8.1.0",
35
     "expo-permissions": "~8.1.0",
50
     "react-native-safe-area-context": "0.7.3",
52
     "react-native-safe-area-context": "0.7.3",
51
     "react-native-screens": "~2.2.0",
53
     "react-native-screens": "~2.2.0",
52
     "react-native-webview": "8.1.1",
54
     "react-native-webview": "8.1.1",
53
-    "expo-barcode-scanner": "~8.1.0",
54
-    "expo-camera": "latest"
55
+    "react-navigation-header-buttons": "^3.0.5"
55
   },
56
   },
56
   "devDependencies": {
57
   "devDependencies": {
57
     "@babel/cli": "^7.8.4",
58
     "@babel/cli": "^7.8.4",

+ 31
- 16
src/components/Custom/HeaderButton.js View File

1
+// @flow
2
+
1
 import * as React from 'react';
3
 import * as React from 'react';
2
-import {IconButton, withTheme} from 'react-native-paper';
4
+import {MaterialCommunityIcons} from "@expo/vector-icons";
5
+import {HeaderButton, HeaderButtons} from 'react-navigation-header-buttons';
6
+import {withTheme} from "react-native-paper";
7
+import * as Touchable from "react-native/Libraries/Components/Touchable/TouchableNativeFeedback.android";
8
+
9
+const MaterialHeaderButton = (props: Object) => (
10
+    <HeaderButton
11
+        {...props}
12
+        IconComponent={MaterialCommunityIcons}
13
+        iconSize={26}
14
+        color={props.theme.colors.text}
15
+        background={Touchable.Ripple(props.theme.colors.ripple, true)}
16
+    />
17
+);
3
 
18
 
4
-/**
5
- * Component used to display a header button
6
- *
7
- * @param props Props to pass to the component
8
- * @return {*}
9
- */
10
-function HeaderButton(props) {
11
-    const {colors} = props.theme;
19
+const MaterialHeaderButtons = (props: Object) => {
12
     return (
20
     return (
13
-        <IconButton
14
-            icon={props.icon}
15
-            size={26}
16
-            color={props.color !== undefined ? props.color : colors.text}
17
-            onPress={props.onPress}
21
+        <HeaderButtons
22
+            {...props}
23
+            HeaderButtonComponent={withTheme(MaterialHeaderButton)}
24
+            OverflowIcon={
25
+                <MaterialCommunityIcons
26
+                    name="dots-vertical"
27
+                    size={26}
28
+                    color={props.theme.colors.text}
29
+                />
30
+            }
18
         />
31
         />
19
     );
32
     );
20
-}
33
+};
34
+
35
+export default withTheme(MaterialHeaderButtons);
21
 
36
 
22
-export default withTheme(HeaderButton);
37
+export {Item} from 'react-navigation-header-buttons';

+ 7
- 3
src/components/Screens/WebViewScreen.js View File

2
 
2
 
3
 import * as React from 'react';
3
 import * as React from 'react';
4
 import WebView from "react-native-webview";
4
 import WebView from "react-native-webview";
5
-import HeaderButton from "../Custom/HeaderButton";
6
 import BasicLoadingScreen from "../Custom/BasicLoadingScreen";
5
 import BasicLoadingScreen from "../Custom/BasicLoadingScreen";
7
 import ErrorView from "../Custom/ErrorView";
6
 import ErrorView from "../Custom/ErrorView";
8
-import {ERROR_TYPE} from "../../managers/ConnectionManager";
7
+import {ERROR_TYPE} from "../../utils/WebData";
8
+import MaterialHeaderButtons, {Item} from '../Custom/HeaderButton';
9
 
9
 
10
 type Props = {
10
 type Props = {
11
     navigation: Object,
11
     navigation: Object,
55
      * @return {*}
55
      * @return {*}
56
      */
56
      */
57
     getRefreshButton() {
57
     getRefreshButton() {
58
-        return <HeaderButton icon={'refresh'} onPress={this.onRefreshClicked}/>
58
+        return (
59
+            <MaterialHeaderButtons>
60
+                <Item title="refresh" iconName="refresh" onPress={this.onRefreshClicked}/>
61
+            </MaterialHeaderButtons>
62
+        );
59
     };
63
     };
60
 
64
 
61
     /**
65
     /**

+ 2
- 0
src/managers/ThemeManager.js View File

34
                 tabIcon: "#929292",
34
                 tabIcon: "#929292",
35
                 card: "rgb(255, 255, 255)",
35
                 card: "rgb(255, 255, 255)",
36
                 dividerBackground: '#e2e2e2',
36
                 dividerBackground: '#e2e2e2',
37
+                ripple: "rgba(0,0,0,0.2)",
37
                 textDisabled: '#c1c1c1',
38
                 textDisabled: '#c1c1c1',
38
                 icon: '#5d5d5d',
39
                 icon: '#5d5d5d',
39
                 subtitle: '#707070',
40
                 subtitle: '#707070',
91
                 tabIcon: "#6d6d6d",
92
                 tabIcon: "#6d6d6d",
92
                 card: "rgb(18, 18, 18)",
93
                 card: "rgb(18, 18, 18)",
93
                 dividerBackground: '#222222',
94
                 dividerBackground: '#222222',
95
+                ripple: "rgba(255,255,255,0.2)",
94
                 textDisabled: '#5b5b5b',
96
                 textDisabled: '#5b5b5b',
95
                 icon: '#b3b3b3',
97
                 icon: '#b3b3b3',
96
                 subtitle: '#aaaaaa',
98
                 subtitle: '#aaaaaa',

+ 6
- 3
src/navigation/DrawerNavigator.js View File

13
 import DebugScreen from '../screens/About/DebugScreen';
13
 import DebugScreen from '../screens/About/DebugScreen';
14
 import Sidebar from "../components/Sidebar/Sidebar";
14
 import Sidebar from "../components/Sidebar/Sidebar";
15
 import {createStackNavigator, TransitionPresets} from "@react-navigation/stack";
15
 import {createStackNavigator, TransitionPresets} from "@react-navigation/stack";
16
-import HeaderButton from "../components/Custom/HeaderButton";
17
 import i18n from "i18n-js";
16
 import i18n from "i18n-js";
18
 import LoginScreen from "../screens/Amicale/LoginScreen";
17
 import LoginScreen from "../screens/Amicale/LoginScreen";
19
 import ProfileScreen from "../screens/Amicale/ProfileScreen";
18
 import ProfileScreen from "../screens/Amicale/ProfileScreen";
22
 import ClubAboutScreen from "../screens/Amicale/Clubs/ClubAboutScreen";
21
 import ClubAboutScreen from "../screens/Amicale/Clubs/ClubAboutScreen";
23
 import VoteScreen from "../screens/Amicale/VoteScreen";
22
 import VoteScreen from "../screens/Amicale/VoteScreen";
24
 import AmicaleContactScreen from "../screens/Amicale/AmicaleContactScreen";
23
 import AmicaleContactScreen from "../screens/Amicale/AmicaleContactScreen";
24
+import MaterialHeaderButtons, {Item} from "../components/Custom/HeaderButton";
25
 
25
 
26
 const defaultScreenOptions = {
26
 const defaultScreenOptions = {
27
     gestureEnabled: true,
27
     gestureEnabled: true,
31
 
31
 
32
 function getDrawerButton(navigation: Object) {
32
 function getDrawerButton(navigation: Object) {
33
     return (
33
     return (
34
-        <HeaderButton icon={'menu'} onPress={navigation.openDrawer}/>
34
+        <MaterialHeaderButtons left={true}>
35
+            <Item title="menu" iconName="menu" onPress={navigation.openDrawer}/>
36
+        </MaterialHeaderButtons>
35
     );
37
     );
36
 }
38
 }
37
 
39
 
365
     constructor(props: Object) {
367
     constructor(props: Object) {
366
         super(props);
368
         super(props);
367
 
369
 
368
-        this.createTabNavigator = () => <TabNavigator defaultRoute={props.defaultRoute} defaultData={props.defaultData}/>
370
+        this.createTabNavigator = () => <TabNavigator defaultRoute={props.defaultRoute}
371
+                                                      defaultData={props.defaultData}/>
369
     }
372
     }
370
 
373
 
371
     render() {
374
     render() {

+ 5
- 3
src/navigation/MainTabNavigator.js View File

13
 import PlanexScreen from '../screens/Websites/PlanexScreen';
13
 import PlanexScreen from '../screens/Websites/PlanexScreen';
14
 import {MaterialCommunityIcons} from "@expo/vector-icons";
14
 import {MaterialCommunityIcons} from "@expo/vector-icons";
15
 import AsyncStorageManager from "../managers/AsyncStorageManager";
15
 import AsyncStorageManager from "../managers/AsyncStorageManager";
16
-import HeaderButton from "../components/Custom/HeaderButton";
17
 import {withTheme} from 'react-native-paper';
16
 import {withTheme} from 'react-native-paper';
18
 import i18n from "i18n-js";
17
 import i18n from "i18n-js";
19
 import ClubDisplayScreen from "../screens/Amicale/Clubs/ClubDisplayScreen";
18
 import ClubDisplayScreen from "../screens/Amicale/Clubs/ClubDisplayScreen";
20
 import ScannerScreen from "../screens/ScannerScreen";
19
 import ScannerScreen from "../screens/ScannerScreen";
20
+import MaterialHeaderButtons, {Item} from "../components/Custom/HeaderButton";
21
 
21
 
22
 
22
 
23
 const TAB_ICONS = {
23
 const TAB_ICONS = {
36
 
36
 
37
 function getDrawerButton(navigation: Object) {
37
 function getDrawerButton(navigation: Object) {
38
     return (
38
     return (
39
-        <HeaderButton icon={'menu'} onPress={navigation.openDrawer}/>
39
+        <MaterialHeaderButtons left={true}>
40
+            <Item title="menu" iconName="menu" onPress={navigation.openDrawer}/>
41
+        </MaterialHeaderButtons>
40
     );
42
     );
41
 }
43
 }
42
 
44
 
231
     defaultData: Object
233
     defaultData: Object
232
 }
234
 }
233
 
235
 
234
-class TabNavigator extends React.Component<Props>{
236
+class TabNavigator extends React.Component<Props> {
235
 
237
 
236
     createHomeStackComponent: Object;
238
     createHomeStackComponent: Object;
237
 
239
 

+ 4
- 2
src/screens/Amicale/Clubs/ClubListScreen.js View File

8
 import ClubListItem from "../../../components/Lists/ClubListItem";
8
 import ClubListItem from "../../../components/Lists/ClubListItem";
9
 import {isItemInCategoryFilter, stringMatchQuery} from "../../../utils/Search";
9
 import {isItemInCategoryFilter, stringMatchQuery} from "../../../utils/Search";
10
 import ClubListHeader from "../../../components/Lists/ClubListHeader";
10
 import ClubListHeader from "../../../components/Lists/ClubListHeader";
11
-import HeaderButton from "../../../components/Custom/HeaderButton";
11
+import MaterialHeaderButtons, {Item} from "../../../components/Custom/HeaderButton";
12
 
12
 
13
 type Props = {
13
 type Props = {
14
     navigation: Object,
14
     navigation: Object,
72
      */
72
      */
73
     getHeaderButtons = () => {
73
     getHeaderButtons = () => {
74
         const onPress = () => this.props.navigation.navigate("club-about");
74
         const onPress = () => this.props.navigation.navigate("club-about");
75
-        return <HeaderButton icon={'information'} onPress={onPress}/>;
75
+        return <MaterialHeaderButtons>
76
+            <Item title="main" iconName="information" onPress={onPress}/>
77
+        </MaterialHeaderButtons>;
76
     };
78
     };
77
 
79
 
78
     /**
80
     /**

+ 4
- 2
src/screens/Amicale/ProfileScreen.js View File

5
 import {Avatar, Button, Card, Divider, List, withTheme} from 'react-native-paper';
5
 import {Avatar, Button, Card, Divider, List, withTheme} from 'react-native-paper';
6
 import AuthenticatedScreen from "../../components/Amicale/AuthenticatedScreen";
6
 import AuthenticatedScreen from "../../components/Amicale/AuthenticatedScreen";
7
 import {openBrowser} from "../../utils/WebBrowser";
7
 import {openBrowser} from "../../utils/WebBrowser";
8
-import HeaderButton from "../../components/Custom/HeaderButton";
9
 import i18n from 'i18n-js';
8
 import i18n from 'i18n-js';
10
 import LogoutDialog from "../../components/Amicale/LogoutDialog";
9
 import LogoutDialog from "../../components/Amicale/LogoutDialog";
10
+import MaterialHeaderButtons, {Item} from "../../components/Custom/HeaderButton";
11
 
11
 
12
 type Props = {
12
 type Props = {
13
     navigation: Object,
13
     navigation: Object,
47
 
47
 
48
     hideDisconnectDialog = () => this.setState({dialogVisible: false});
48
     hideDisconnectDialog = () => this.setState({dialogVisible: false});
49
 
49
 
50
-    getHeaderButton = () => <HeaderButton icon={'logout'} onPress={this.showDisconnectDialog}/>;
50
+    getHeaderButton = () => <MaterialHeaderButtons>
51
+        <Item title="logout" iconName="logout" onPress={this.showDisconnectDialog}/>
52
+    </MaterialHeaderButtons>;
51
 
53
 
52
     getScreen = (data: Object) => {
54
     getScreen = (data: Object) => {
53
         this.data = data[0];
55
         this.data = data[0];

+ 4
- 6
src/screens/HomeScreen.js View File

12
 import {stringToDate} from "../utils/Planning";
12
 import {stringToDate} from "../utils/Planning";
13
 import {openBrowser} from "../utils/WebBrowser";
13
 import {openBrowser} from "../utils/WebBrowser";
14
 import ActionsDashBoardItem from "../components/Home/ActionsDashboardItem";
14
 import ActionsDashBoardItem from "../components/Home/ActionsDashboardItem";
15
-import HeaderButton from "../components/Custom/HeaderButton";
16
 import ConnectionManager from "../managers/ConnectionManager";
15
 import ConnectionManager from "../managers/ConnectionManager";
17
 import {CommonActions} from '@react-navigation/native';
16
 import {CommonActions} from '@react-navigation/native';
17
+import MaterialHeaderButtons, {Item} from "../components/Custom/HeaderButton";
18
 // import DATA from "../dashboard_data.json";
18
 // import DATA from "../dashboard_data.json";
19
 
19
 
20
 
20
 
96
             ? "account"
96
             ? "account"
97
             : "login";
97
             : "login";
98
         const onPress = () => this.props.navigation.navigate(screen);
98
         const onPress = () => this.props.navigation.navigate(screen);
99
-        return <HeaderButton
100
-            icon={icon}
101
-            onPress={onPress}
102
-            color={this.isLoggedIn ? undefined : this.colors.primary}
103
-        />;
99
+        return <MaterialHeaderButtons>
100
+            <Item title="main" iconName={icon} onPress={onPress}/>
101
+        </MaterialHeaderButtons>;
104
     };
102
     };
105
 
103
 
106
     onProxiwashClick = () => this.props.navigation.navigate('proxiwash');
104
     onProxiwashClick = () => this.props.navigation.navigate('proxiwash');

+ 4
- 2
src/screens/Proximo/ProximoListScreen.js View File

7
 import {RadioButton, Searchbar, Subheading, Text, Title, withTheme} from "react-native-paper";
7
 import {RadioButton, Searchbar, Subheading, Text, Title, withTheme} from "react-native-paper";
8
 import {stringMatchQuery} from "../../utils/Search";
8
 import {stringMatchQuery} from "../../utils/Search";
9
 import ProximoListItem from "../../components/Lists/ProximoListItem";
9
 import ProximoListItem from "../../components/Lists/ProximoListItem";
10
-import HeaderButton from "../../components/Custom/HeaderButton";
10
+import MaterialHeaderButtons, {Item} from "../../components/Custom/HeaderButton";
11
 
11
 
12
 function sortPrice(a, b) {
12
 function sortPrice(a, b) {
13
     return a.price - b.price;
13
     return a.price - b.price;
102
      * @return {*}
102
      * @return {*}
103
      */
103
      */
104
     getSortMenuButton = () => {
104
     getSortMenuButton = () => {
105
-        return <HeaderButton icon="sort" onPress={this.onSortMenuPress}/>;
105
+        return <MaterialHeaderButtons>
106
+            <Item title="main" iconName="sort" onPress={this.onSortMenuPress}/>
107
+        </MaterialHeaderButtons>;
106
     };
108
     };
107
 
109
 
108
     /**
110
     /**

+ 5
- 10
src/screens/Proximo/ProximoMainScreen.js View File

5
 import i18n from "i18n-js";
5
 import i18n from "i18n-js";
6
 import WebSectionList from "../../components/Lists/WebSectionList";
6
 import WebSectionList from "../../components/Lists/WebSectionList";
7
 import {List, withTheme} from 'react-native-paper';
7
 import {List, withTheme} from 'react-native-paper';
8
-import HeaderButton from "../../components/Custom/HeaderButton";
8
+import MaterialHeaderButtons, {Item} from "../../components/Custom/HeaderButton";
9
 
9
 
10
 const DATA_URL = "https://etud.insa-toulouse.fr/~proximo/data/stock-v2.json";
10
 const DATA_URL = "https://etud.insa-toulouse.fr/~proximo/data/stock-v2.json";
11
 const LIST_ITEM_HEIGHT = 84;
11
 const LIST_ITEM_HEIGHT = 84;
111
      * @return {*}
111
      * @return {*}
112
      */
112
      */
113
     getHeaderButtons() {
113
     getHeaderButtons() {
114
-        return (
115
-            <View
116
-                style={{
117
-                    flexDirection: 'row',
118
-                }}>
119
-                <HeaderButton icon={'magnify'} onPress={this.onPressSearchBtn}/>
120
-                <HeaderButton icon={'information'} onPress={this.onPressAboutBtn}/>
121
-            </View>
122
-        );
114
+        return <MaterialHeaderButtons>
115
+            <Item title="magnify" iconName="magnify" onPress={this.onPressSearchBtn}/>
116
+            <Item title="information" iconName="information" onPress={this.onPressAboutBtn}/>
117
+        </MaterialHeaderButtons>;
123
     }
118
     }
124
 
119
 
125
     /**
120
     /**

+ 4
- 2
src/screens/Proxiwash/ProxiwashScreen.js View File

8
 import AsyncStorageManager from "../../managers/AsyncStorageManager";
8
 import AsyncStorageManager from "../../managers/AsyncStorageManager";
9
 import * as Expo from "expo";
9
 import * as Expo from "expo";
10
 import {Avatar, Banner, Button, Card, Text, withTheme} from 'react-native-paper';
10
 import {Avatar, Banner, Button, Card, Text, withTheme} from 'react-native-paper';
11
-import HeaderButton from "../../components/Custom/HeaderButton";
12
 import ProxiwashListItem from "../../components/Lists/ProxiwashListItem";
11
 import ProxiwashListItem from "../../components/Lists/ProxiwashListItem";
13
 import ProxiwashConstants from "../../constants/ProxiwashConstants";
12
 import ProxiwashConstants from "../../constants/ProxiwashConstants";
14
 import CustomModal from "../../components/Custom/CustomModal";
13
 import CustomModal from "../../components/Custom/CustomModal";
15
 import AprilFoolsManager from "../../managers/AprilFoolsManager";
14
 import AprilFoolsManager from "../../managers/AprilFoolsManager";
15
+import MaterialHeaderButtons, {Item} from "../../components/Custom/HeaderButton";
16
 
16
 
17
 const DATA_URL = "https://etud.insa-toulouse.fr/~amicale_app/washinsa/washinsa.json";
17
 const DATA_URL = "https://etud.insa-toulouse.fr/~amicale_app/washinsa/washinsa.json";
18
 
18
 
152
      * @return {*}
152
      * @return {*}
153
      */
153
      */
154
     getAboutButton() {
154
     getAboutButton() {
155
-        return <HeaderButton icon={'information'} onPress={this.onAboutPress}/>;
155
+        return <MaterialHeaderButtons>
156
+            <Item title="information" iconName="information" onPress={this.onAboutPress}/>
157
+        </MaterialHeaderButtons>;
156
     }
158
     }
157
 
159
 
158
     /**
160
     /**

+ 4
- 9
src/screens/Tetris/TetrisScreen.js View File

6
 import {MaterialCommunityIcons} from "@expo/vector-icons";
6
 import {MaterialCommunityIcons} from "@expo/vector-icons";
7
 import GameLogic from "./GameLogic";
7
 import GameLogic from "./GameLogic";
8
 import Grid from "./components/Grid";
8
 import Grid from "./components/Grid";
9
-import HeaderButton from "../../components/Custom/HeaderButton";
10
 import Preview from "./components/Preview";
9
 import Preview from "./components/Preview";
11
 import i18n from "i18n-js";
10
 import i18n from "i18n-js";
11
+import MaterialHeaderButtons, {Item} from "../../components/Custom/HeaderButton";
12
 
12
 
13
 type Props = {
13
 type Props = {
14
     navigation: Object,
14
     navigation: Object,
62
     }
62
     }
63
 
63
 
64
     getRightButton() {
64
     getRightButton() {
65
-        return (
66
-            <View
67
-                style={{
68
-                    flexDirection: 'row',
69
-                }}>
70
-                <HeaderButton icon={'pause'} onPress={() => this.togglePause()}/>
71
-            </View>
72
-        );
65
+        return <MaterialHeaderButtons>
66
+            <Item title="pause" iconName="pause" onPress={() => this.togglePause()}/>
67
+        </MaterialHeaderButtons>;
73
     }
68
     }
74
 
69
 
75
     /**
70
     /**

Loading…
Cancel
Save