Browse Source

Update navigation components to use TypeScript

Arnaud Vergnet 3 years ago
parent
commit
b8e7272d2c

+ 18
- 29
src/components/Tabbar/CustomTabBar.tsx View File

21
 import {Animated} from 'react-native';
21
 import {Animated} from 'react-native';
22
 import {withTheme} from 'react-native-paper';
22
 import {withTheme} from 'react-native-paper';
23
 import {Collapsible} from 'react-navigation-collapsible';
23
 import {Collapsible} from 'react-navigation-collapsible';
24
-import {StackNavigationProp} from '@react-navigation/stack';
25
 import TabIcon from './TabIcon';
24
 import TabIcon from './TabIcon';
26
 import TabHomeIcon from './TabHomeIcon';
25
 import TabHomeIcon from './TabHomeIcon';
27
-
28
-type RouteType = {
29
-  name: string;
30
-  key: string;
31
-  params: {collapsible: Collapsible};
32
-  state: {
33
-    index: number;
34
-    routes: Array<RouteType>;
35
-  };
26
+import {BottomTabBarProps} from '@react-navigation/bottom-tabs';
27
+import {NavigationState} from '@react-navigation/native';
28
+import {
29
+  PartialState,
30
+  Route,
31
+} from '@react-navigation/routers/lib/typescript/src/types';
32
+
33
+type RouteType = Route<string> & {
34
+  state?: NavigationState | PartialState<NavigationState>;
36
 };
35
 };
37
 
36
 
38
-type PropsType = {
39
-  state: {
40
-    index: number;
41
-    routes: Array<RouteType>;
42
-  };
43
-  descriptors: {
44
-    [key: string]: {
45
-      options: {
46
-        tabBarLabel: string;
47
-        title: string;
48
-      };
49
-    };
50
-  };
51
-  navigation: StackNavigationProp<any>;
37
+interface PropsType extends BottomTabBarProps {
52
   theme: ReactNativePaper.Theme;
38
   theme: ReactNativePaper.Theme;
53
-};
39
+}
54
 
40
 
55
 type StateType = {
41
 type StateType = {
56
   translateY: any;
42
   translateY: any;
164
           onLongPress={onLongPress}
150
           onLongPress={onLongPress}
165
           icon={this.getTabBarIcon(route, isFocused)}
151
           icon={this.getTabBarIcon(route, isFocused)}
166
           color={color}
152
           color={color}
167
-          label={label}
153
+          label={label as string}
168
           focused={isFocused}
154
           focused={isFocused}
169
           extraData={state.index > index}
155
           extraData={state.index > index}
170
           key={route.key}
156
           key={route.key}
193
     if (isFocused) {
179
     if (isFocused) {
194
       const stackState = route.state;
180
       const stackState = route.state;
195
       const stackRoute =
181
       const stackRoute =
196
-        stackState != null ? stackState.routes[stackState.index] : null;
197
-      const params: {collapsible: Collapsible} | null =
198
-        stackRoute != null ? stackRoute.params : null;
182
+        stackState && stackState.index
183
+          ? stackState.routes[stackState.index]
184
+          : null;
185
+      const params: {collapsible: Collapsible} | null | undefined = stackRoute
186
+        ? (stackRoute.params as {collapsible: Collapsible})
187
+        : null;
199
       const collapsible = params != null ? params.collapsible : null;
188
       const collapsible = params != null ? params.collapsible : null;
200
       if (collapsible != null) {
189
       if (collapsible != null) {
201
         this.setState({
190
         this.setState({

src/navigation/MainNavigator.js → src/navigation/MainNavigator.tsx View File

17
  * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
17
  * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
18
  */
18
  */
19
 
19
 
20
-// @flow
21
-
22
 import * as React from 'react';
20
 import * as React from 'react';
23
 import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
21
 import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
24
 import i18n from 'i18n-js';
22
 import i18n from 'i18n-js';
40
 import ClubAboutScreen from '../screens/Amicale/Clubs/ClubAboutScreen';
38
 import ClubAboutScreen from '../screens/Amicale/Clubs/ClubAboutScreen';
41
 import ClubDisplayScreen from '../screens/Amicale/Clubs/ClubDisplayScreen';
39
 import ClubDisplayScreen from '../screens/Amicale/Clubs/ClubDisplayScreen';
42
 import {
40
 import {
43
-  createScreenCollapsibleStack,
41
+  CreateScreenCollapsibleStack,
44
   getWebsiteStack,
42
   getWebsiteStack,
45
 } from '../utils/CollapsibleUtils';
43
 } from '../utils/CollapsibleUtils';
46
 import BugReportScreen from '../screens/Other/FeedbackScreen';
44
 import BugReportScreen from '../screens/Other/FeedbackScreen';
47
 import WebsiteScreen from '../screens/Services/WebsiteScreen';
45
 import WebsiteScreen from '../screens/Services/WebsiteScreen';
48
-import EquipmentScreen from '../screens/Amicale/Equipment/EquipmentListScreen';
46
+import EquipmentScreen, {
47
+  DeviceType,
48
+} from '../screens/Amicale/Equipment/EquipmentListScreen';
49
 import EquipmentLendScreen from '../screens/Amicale/Equipment/EquipmentRentScreen';
49
 import EquipmentLendScreen from '../screens/Amicale/Equipment/EquipmentRentScreen';
50
 import EquipmentConfirmScreen from '../screens/Amicale/Equipment/EquipmentConfirmScreen';
50
 import EquipmentConfirmScreen from '../screens/Amicale/Equipment/EquipmentConfirmScreen';
51
 import DashboardEditScreen from '../screens/Other/Settings/DashboardEditScreen';
51
 import DashboardEditScreen from '../screens/Other/Settings/DashboardEditScreen';
52
 import GameStartScreen from '../screens/Game/screens/GameStartScreen';
52
 import GameStartScreen from '../screens/Game/screens/GameStartScreen';
53
 import ImageGalleryScreen from '../screens/Media/ImageGalleryScreen';
53
 import ImageGalleryScreen from '../screens/Media/ImageGalleryScreen';
54
 
54
 
55
+export enum MainRoutes {
56
+  Main = 'main',
57
+  Gallery = 'gallery',
58
+  Settings = 'settings',
59
+  DashboardEdit = 'dashboard-edit',
60
+  About = 'about',
61
+  Dependencies = 'dependencies',
62
+  Debug = 'debug',
63
+  GameStart = 'game-start',
64
+  GameMain = 'game-main',
65
+  Login = 'login',
66
+  SelfMenu = 'self-menu',
67
+  Proximo = 'proximo',
68
+  ProximoList = 'proximo-list',
69
+  ProximoAbout = 'proximo-about',
70
+  Profile = 'profile',
71
+  ClubList = 'club-list',
72
+  ClubInformation = 'club-information',
73
+  ClubAbout = 'club-about',
74
+  EquipmentList = 'equipment-list',
75
+  EquipmentRent = 'equipment-rent',
76
+  EquipmentConfirm = 'equipment-confirm',
77
+  Vote = 'vote',
78
+  Feedback = 'feedback',
79
+}
80
+
81
+type DefaultParams = {[key in MainRoutes]: object | undefined};
82
+
83
+export interface FullParamsList extends DefaultParams {
84
+  login: {nextScreen: string};
85
+  'equipment-confirm': {
86
+    item?: DeviceType;
87
+    dates: [string, string];
88
+  };
89
+  'equipment-rent': {item?: DeviceType};
90
+  gallery: {images: Array<{url: string}>};
91
+}
92
+
93
+// Don't know why but TS is complaining without this
94
+// See: https://stackoverflow.com/questions/63652687/interface-does-not-satisfy-the-constraint-recordstring-object-undefined
95
+export type MainStackParamsList = FullParamsList &
96
+  Record<string, object | undefined>;
97
+
55
 const modalTransition =
98
 const modalTransition =
56
   Platform.OS === 'ios'
99
   Platform.OS === 'ios'
57
     ? TransitionPresets.ModalPresentationIOS
100
     ? TransitionPresets.ModalPresentationIOS
63
   ...TransitionPresets.SlideFromRightIOS,
106
   ...TransitionPresets.SlideFromRightIOS,
64
 };
107
 };
65
 
108
 
66
-const MainStack = createStackNavigator();
109
+const MainStack = createStackNavigator<MainStackParamsList>();
67
 
110
 
68
-function MainStackComponent(props: {
69
-  createTabNavigator: () => React.Node,
70
-}): React.Node {
111
+function MainStackComponent(props: {createTabNavigator: () => JSX.Element}) {
71
   const {createTabNavigator} = props;
112
   const {createTabNavigator} = props;
72
   return (
113
   return (
73
     <MainStack.Navigator
114
     <MainStack.Navigator
74
-      initialRouteName="main"
115
+      initialRouteName={MainRoutes.Main}
75
       headerMode="screen"
116
       headerMode="screen"
76
       screenOptions={defaultScreenOptions}>
117
       screenOptions={defaultScreenOptions}>
77
       <MainStack.Screen
118
       <MainStack.Screen
78
-        name="main"
119
+        name={MainRoutes.Main}
79
         component={createTabNavigator}
120
         component={createTabNavigator}
80
         options={{
121
         options={{
81
           headerShown: false,
122
           headerShown: false,
83
         }}
124
         }}
84
       />
125
       />
85
       <MainStack.Screen
126
       <MainStack.Screen
86
-        name="gallery"
127
+        name={MainRoutes.Gallery}
87
         component={ImageGalleryScreen}
128
         component={ImageGalleryScreen}
88
         options={{
129
         options={{
89
           headerShown: false,
130
           headerShown: false,
90
           ...modalTransition,
131
           ...modalTransition,
91
         }}
132
         }}
92
       />
133
       />
93
-      {createScreenCollapsibleStack(
94
-        'settings',
134
+      {CreateScreenCollapsibleStack(
135
+        MainRoutes.Settings,
95
         MainStack,
136
         MainStack,
96
         SettingsScreen,
137
         SettingsScreen,
97
         i18n.t('screens.settings.title'),
138
         i18n.t('screens.settings.title'),
98
       )}
139
       )}
99
-      {createScreenCollapsibleStack(
100
-        'dashboard-edit',
140
+      {CreateScreenCollapsibleStack(
141
+        MainRoutes.DashboardEdit,
101
         MainStack,
142
         MainStack,
102
         DashboardEditScreen,
143
         DashboardEditScreen,
103
         i18n.t('screens.settings.dashboardEdit.title'),
144
         i18n.t('screens.settings.dashboardEdit.title'),
104
       )}
145
       )}
105
-      {createScreenCollapsibleStack(
106
-        'about',
146
+      {CreateScreenCollapsibleStack(
147
+        MainRoutes.About,
107
         MainStack,
148
         MainStack,
108
         AboutScreen,
149
         AboutScreen,
109
         i18n.t('screens.about.title'),
150
         i18n.t('screens.about.title'),
110
       )}
151
       )}
111
-      {createScreenCollapsibleStack(
112
-        'dependencies',
152
+      {CreateScreenCollapsibleStack(
153
+        MainRoutes.Dependencies,
113
         MainStack,
154
         MainStack,
114
         AboutDependenciesScreen,
155
         AboutDependenciesScreen,
115
         i18n.t('screens.about.libs'),
156
         i18n.t('screens.about.libs'),
116
       )}
157
       )}
117
-      {createScreenCollapsibleStack(
118
-        'debug',
158
+      {CreateScreenCollapsibleStack(
159
+        MainRoutes.Debug,
119
         MainStack,
160
         MainStack,
120
         DebugScreen,
161
         DebugScreen,
121
         i18n.t('screens.about.debug'),
162
         i18n.t('screens.about.debug'),
122
       )}
163
       )}
123
 
164
 
124
-      {createScreenCollapsibleStack(
125
-        'game-start',
165
+      {CreateScreenCollapsibleStack(
166
+        MainRoutes.GameStart,
126
         MainStack,
167
         MainStack,
127
         GameStartScreen,
168
         GameStartScreen,
128
         i18n.t('screens.game.title'),
169
         i18n.t('screens.game.title'),
129
         true,
170
         true,
130
-        null,
171
+        undefined,
131
         'transparent',
172
         'transparent',
132
       )}
173
       )}
133
       <MainStack.Screen
174
       <MainStack.Screen
134
-        name="game-main"
175
+        name={MainRoutes.GameMain}
135
         component={GameMainScreen}
176
         component={GameMainScreen}
136
         options={{
177
         options={{
137
           title: i18n.t('screens.game.title'),
178
           title: i18n.t('screens.game.title'),
138
         }}
179
         }}
139
       />
180
       />
140
-      {createScreenCollapsibleStack(
141
-        'login',
181
+      {CreateScreenCollapsibleStack(
182
+        MainRoutes.Login,
142
         MainStack,
183
         MainStack,
143
         LoginScreen,
184
         LoginScreen,
144
         i18n.t('screens.login.title'),
185
         i18n.t('screens.login.title'),
148
       )}
189
       )}
149
       {getWebsiteStack('website', MainStack, WebsiteScreen, '')}
190
       {getWebsiteStack('website', MainStack, WebsiteScreen, '')}
150
 
191
 
151
-      {createScreenCollapsibleStack(
152
-        'self-menu',
192
+      {CreateScreenCollapsibleStack(
193
+        MainRoutes.SelfMenu,
153
         MainStack,
194
         MainStack,
154
         SelfMenuScreen,
195
         SelfMenuScreen,
155
         i18n.t('screens.menu.title'),
196
         i18n.t('screens.menu.title'),
156
       )}
197
       )}
157
-      {createScreenCollapsibleStack(
158
-        'proximo',
198
+      {CreateScreenCollapsibleStack(
199
+        MainRoutes.Proximo,
159
         MainStack,
200
         MainStack,
160
         ProximoMainScreen,
201
         ProximoMainScreen,
161
         i18n.t('screens.proximo.title'),
202
         i18n.t('screens.proximo.title'),
162
       )}
203
       )}
163
-      {createScreenCollapsibleStack(
164
-        'proximo-list',
204
+      {CreateScreenCollapsibleStack(
205
+        MainRoutes.ProximoList,
165
         MainStack,
206
         MainStack,
166
         ProximoListScreen,
207
         ProximoListScreen,
167
         i18n.t('screens.proximo.articleList'),
208
         i18n.t('screens.proximo.articleList'),
168
       )}
209
       )}
169
-      {createScreenCollapsibleStack(
170
-        'proximo-about',
210
+      {CreateScreenCollapsibleStack(
211
+        MainRoutes.ProximoAbout,
171
         MainStack,
212
         MainStack,
172
         ProximoAboutScreen,
213
         ProximoAboutScreen,
173
         i18n.t('screens.proximo.title'),
214
         i18n.t('screens.proximo.title'),
175
         {...modalTransition},
216
         {...modalTransition},
176
       )}
217
       )}
177
 
218
 
178
-      {createScreenCollapsibleStack(
179
-        'profile',
219
+      {CreateScreenCollapsibleStack(
220
+        MainRoutes.Profile,
180
         MainStack,
221
         MainStack,
181
         ProfileScreen,
222
         ProfileScreen,
182
         i18n.t('screens.profile.title'),
223
         i18n.t('screens.profile.title'),
183
       )}
224
       )}
184
-      {createScreenCollapsibleStack(
185
-        'club-list',
225
+      {CreateScreenCollapsibleStack(
226
+        MainRoutes.ClubList,
186
         MainStack,
227
         MainStack,
187
         ClubListScreen,
228
         ClubListScreen,
188
         i18n.t('screens.clubs.title'),
229
         i18n.t('screens.clubs.title'),
189
       )}
230
       )}
190
-      {createScreenCollapsibleStack(
191
-        'club-information',
231
+      {CreateScreenCollapsibleStack(
232
+        MainRoutes.ClubInformation,
192
         MainStack,
233
         MainStack,
193
         ClubDisplayScreen,
234
         ClubDisplayScreen,
194
         i18n.t('screens.clubs.details'),
235
         i18n.t('screens.clubs.details'),
195
         true,
236
         true,
196
         {...modalTransition},
237
         {...modalTransition},
197
       )}
238
       )}
198
-      {createScreenCollapsibleStack(
199
-        'club-about',
239
+      {CreateScreenCollapsibleStack(
240
+        MainRoutes.ClubAbout,
200
         MainStack,
241
         MainStack,
201
         ClubAboutScreen,
242
         ClubAboutScreen,
202
         i18n.t('screens.clubs.title'),
243
         i18n.t('screens.clubs.title'),
203
         true,
244
         true,
204
         {...modalTransition},
245
         {...modalTransition},
205
       )}
246
       )}
206
-      {createScreenCollapsibleStack(
207
-        'equipment-list',
247
+      {CreateScreenCollapsibleStack(
248
+        MainRoutes.EquipmentList,
208
         MainStack,
249
         MainStack,
209
         EquipmentScreen,
250
         EquipmentScreen,
210
         i18n.t('screens.equipment.title'),
251
         i18n.t('screens.equipment.title'),
211
       )}
252
       )}
212
-      {createScreenCollapsibleStack(
213
-        'equipment-rent',
253
+      {CreateScreenCollapsibleStack(
254
+        MainRoutes.EquipmentRent,
214
         MainStack,
255
         MainStack,
215
         EquipmentLendScreen,
256
         EquipmentLendScreen,
216
         i18n.t('screens.equipment.book'),
257
         i18n.t('screens.equipment.book'),
217
       )}
258
       )}
218
-      {createScreenCollapsibleStack(
219
-        'equipment-confirm',
259
+      {CreateScreenCollapsibleStack(
260
+        MainRoutes.EquipmentConfirm,
220
         MainStack,
261
         MainStack,
221
         EquipmentConfirmScreen,
262
         EquipmentConfirmScreen,
222
         i18n.t('screens.equipment.confirm'),
263
         i18n.t('screens.equipment.confirm'),
223
       )}
264
       )}
224
-      {createScreenCollapsibleStack(
225
-        'vote',
265
+      {CreateScreenCollapsibleStack(
266
+        MainRoutes.Vote,
226
         MainStack,
267
         MainStack,
227
         VoteScreen,
268
         VoteScreen,
228
         i18n.t('screens.vote.title'),
269
         i18n.t('screens.vote.title'),
229
       )}
270
       )}
230
-      {createScreenCollapsibleStack(
231
-        'feedback',
271
+      {CreateScreenCollapsibleStack(
272
+        MainRoutes.Feedback,
232
         MainStack,
273
         MainStack,
233
         BugReportScreen,
274
         BugReportScreen,
234
         i18n.t('screens.feedback.title'),
275
         i18n.t('screens.feedback.title'),
238
 }
279
 }
239
 
280
 
240
 type PropsType = {
281
 type PropsType = {
241
-  defaultHomeRoute: string | null,
242
-  // eslint-disable-next-line flowtype/no-weak-types
243
-  defaultHomeData: {[key: string]: string},
282
+  defaultHomeRoute: string | null;
283
+  defaultHomeData: {[key: string]: string};
244
 };
284
 };
245
 
285
 
246
-export default class MainNavigator extends React.Component<PropsType> {
247
-  createTabNavigator: () => React.Node;
248
-
249
-  constructor(props: PropsType) {
250
-    super(props);
251
-    this.createTabNavigator = (): React.Node => (
252
-      <TabNavigator
253
-        defaultHomeRoute={props.defaultHomeRoute}
254
-        defaultHomeData={props.defaultHomeData}
255
-      />
256
-    );
257
-  }
258
-
259
-  render(): React.Node {
260
-    return <MainStackComponent createTabNavigator={this.createTabNavigator} />;
261
-  }
286
+export default function MainNavigator(props: PropsType) {
287
+  return <MainStackComponent createTabNavigator={() => TabNavigator(props)} />;
262
 }
288
 }

src/navigation/TabNavigator.js → src/navigation/TabNavigator.tsx View File

17
  * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
17
  * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
18
  */
18
  */
19
 
19
 
20
-// @flow
21
-
22
 import * as React from 'react';
20
 import * as React from 'react';
23
 import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
21
 import {createStackNavigator, TransitionPresets} from '@react-navigation/stack';
24
 import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
22
 import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
44
 import ServicesSectionScreen from '../screens/Services/ServicesSectionScreen';
42
 import ServicesSectionScreen from '../screens/Services/ServicesSectionScreen';
45
 import AmicaleContactScreen from '../screens/Amicale/AmicaleContactScreen';
43
 import AmicaleContactScreen from '../screens/Amicale/AmicaleContactScreen';
46
 import {
44
 import {
47
-  createScreenCollapsibleStack,
45
+  CreateScreenCollapsibleStack,
48
   getWebsiteStack,
46
   getWebsiteStack,
49
 } from '../utils/CollapsibleUtils';
47
 } from '../utils/CollapsibleUtils';
50
 import Mascot, {MASCOT_STYLE} from '../components/Mascot/Mascot';
48
 import Mascot, {MASCOT_STYLE} from '../components/Mascot/Mascot';
62
 
60
 
63
 const ServicesStack = createStackNavigator();
61
 const ServicesStack = createStackNavigator();
64
 
62
 
65
-function ServicesStackComponent(): React.Node {
63
+function ServicesStackComponent() {
66
   return (
64
   return (
67
     <ServicesStack.Navigator
65
     <ServicesStack.Navigator
68
       initialRouteName="index"
66
       initialRouteName="index"
69
       headerMode="screen"
67
       headerMode="screen"
70
       screenOptions={defaultScreenOptions}>
68
       screenOptions={defaultScreenOptions}>
71
-      {createScreenCollapsibleStack(
69
+      {CreateScreenCollapsibleStack(
72
         'index',
70
         'index',
73
         ServicesStack,
71
         ServicesStack,
74
         WebsitesHomeScreen,
72
         WebsitesHomeScreen,
75
         i18n.t('screens.services.title'),
73
         i18n.t('screens.services.title'),
76
       )}
74
       )}
77
-      {createScreenCollapsibleStack(
75
+      {CreateScreenCollapsibleStack(
78
         'services-section',
76
         'services-section',
79
         ServicesStack,
77
         ServicesStack,
80
         ServicesSectionScreen,
78
         ServicesSectionScreen,
81
         'SECTION',
79
         'SECTION',
82
       )}
80
       )}
83
-      {createScreenCollapsibleStack(
81
+      {CreateScreenCollapsibleStack(
84
         'amicale-contact',
82
         'amicale-contact',
85
         ServicesStack,
83
         ServicesStack,
86
         AmicaleContactScreen,
84
         AmicaleContactScreen,
92
 
90
 
93
 const ProxiwashStack = createStackNavigator();
91
 const ProxiwashStack = createStackNavigator();
94
 
92
 
95
-function ProxiwashStackComponent(): React.Node {
93
+function ProxiwashStackComponent() {
96
   return (
94
   return (
97
     <ProxiwashStack.Navigator
95
     <ProxiwashStack.Navigator
98
       initialRouteName="index"
96
       initialRouteName="index"
99
       headerMode="screen"
97
       headerMode="screen"
100
       screenOptions={defaultScreenOptions}>
98
       screenOptions={defaultScreenOptions}>
101
-      {createScreenCollapsibleStack(
99
+      {CreateScreenCollapsibleStack(
102
         'index',
100
         'index',
103
         ProxiwashStack,
101
         ProxiwashStack,
104
         ProxiwashScreen,
102
         ProxiwashScreen,
105
         i18n.t('screens.proxiwash.title'),
103
         i18n.t('screens.proxiwash.title'),
106
       )}
104
       )}
107
-      {createScreenCollapsibleStack(
105
+      {CreateScreenCollapsibleStack(
108
         'proxiwash-about',
106
         'proxiwash-about',
109
         ProxiwashStack,
107
         ProxiwashStack,
110
         ProxiwashAboutScreen,
108
         ProxiwashAboutScreen,
116
 
114
 
117
 const PlanningStack = createStackNavigator();
115
 const PlanningStack = createStackNavigator();
118
 
116
 
119
-function PlanningStackComponent(): React.Node {
117
+function PlanningStackComponent() {
120
   return (
118
   return (
121
     <PlanningStack.Navigator
119
     <PlanningStack.Navigator
122
       initialRouteName="index"
120
       initialRouteName="index"
127
         component={PlanningScreen}
125
         component={PlanningScreen}
128
         options={{title: i18n.t('screens.planning.title')}}
126
         options={{title: i18n.t('screens.planning.title')}}
129
       />
127
       />
130
-      {createScreenCollapsibleStack(
128
+      {CreateScreenCollapsibleStack(
131
         'planning-information',
129
         'planning-information',
132
         PlanningStack,
130
         PlanningStack,
133
         PlanningDisplayScreen,
131
         PlanningDisplayScreen,
142
 function HomeStackComponent(
140
 function HomeStackComponent(
143
   initialRoute: string | null,
141
   initialRoute: string | null,
144
   defaultData: {[key: string]: string},
142
   defaultData: {[key: string]: string},
145
-): React.Node {
143
+) {
146
   let params;
144
   let params;
147
-  if (initialRoute != null)
145
+  if (initialRoute != null) {
148
     params = {data: defaultData, nextScreen: initialRoute, shouldOpen: true};
146
     params = {data: defaultData, nextScreen: initialRoute, shouldOpen: true};
147
+  }
149
   const {colors} = useTheme();
148
   const {colors} = useTheme();
150
   return (
149
   return (
151
     <HomeStack.Navigator
150
     <HomeStack.Navigator
161
             headerStyle: {
160
             headerStyle: {
162
               backgroundColor: colors.surface,
161
               backgroundColor: colors.surface,
163
             },
162
             },
164
-            headerTitle: (): React.Node => (
163
+            headerTitle: () => (
165
               <View style={{flexDirection: 'row'}}>
164
               <View style={{flexDirection: 'row'}}>
166
                 <Mascot
165
                 <Mascot
167
                   style={{
166
                   style={{
203
         options={{title: i18n.t('screens.scanner.title')}}
202
         options={{title: i18n.t('screens.scanner.title')}}
204
       />
203
       />
205
 
204
 
206
-      {createScreenCollapsibleStack(
205
+      {CreateScreenCollapsibleStack(
207
         'club-information',
206
         'club-information',
208
         HomeStack,
207
         HomeStack,
209
         ClubDisplayScreen,
208
         ClubDisplayScreen,
210
         i18n.t('screens.clubs.details'),
209
         i18n.t('screens.clubs.details'),
211
       )}
210
       )}
212
-      {createScreenCollapsibleStack(
211
+      {CreateScreenCollapsibleStack(
213
         'feed-information',
212
         'feed-information',
214
         HomeStack,
213
         HomeStack,
215
         FeedItemScreen,
214
         FeedItemScreen,
216
         i18n.t('screens.home.feed'),
215
         i18n.t('screens.home.feed'),
217
       )}
216
       )}
218
-      {createScreenCollapsibleStack(
217
+      {CreateScreenCollapsibleStack(
219
         'planning-information',
218
         'planning-information',
220
         HomeStack,
219
         HomeStack,
221
         PlanningDisplayScreen,
220
         PlanningDisplayScreen,
227
 
226
 
228
 const PlanexStack = createStackNavigator();
227
 const PlanexStack = createStackNavigator();
229
 
228
 
230
-function PlanexStackComponent(): React.Node {
229
+function PlanexStackComponent() {
231
   return (
230
   return (
232
     <PlanexStack.Navigator
231
     <PlanexStack.Navigator
233
       initialRouteName="index"
232
       initialRouteName="index"
239
         PlanexScreen,
238
         PlanexScreen,
240
         i18n.t('screens.planex.title'),
239
         i18n.t('screens.planex.title'),
241
       )}
240
       )}
242
-      {createScreenCollapsibleStack(
241
+      {CreateScreenCollapsibleStack(
243
         'group-select',
242
         'group-select',
244
         PlanexStack,
243
         PlanexStack,
245
         GroupSelectionScreen,
244
         GroupSelectionScreen,
252
 const Tab = createBottomTabNavigator();
251
 const Tab = createBottomTabNavigator();
253
 
252
 
254
 type PropsType = {
253
 type PropsType = {
255
-  defaultHomeRoute: string | null,
256
-  defaultHomeData: {[key: string]: string},
254
+  defaultHomeRoute: string | null;
255
+  defaultHomeData: {[key: string]: string};
257
 };
256
 };
258
 
257
 
259
-export default class TabNavigator extends React.Component<PropsType> {
260
-  createHomeStackComponent: () => React.Node;
261
-
262
-  defaultRoute: string;
263
-
264
-  constructor(props: PropsType) {
265
-    super(props);
266
-    if (props.defaultHomeRoute != null) this.defaultRoute = 'home';
267
-    else
268
-      this.defaultRoute = AsyncStorageManager.getString(
269
-        AsyncStorageManager.PREFERENCES.defaultStartScreen.key,
270
-      ).toLowerCase();
271
-    this.createHomeStackComponent = (): React.Node =>
272
-      HomeStackComponent(props.defaultHomeRoute, props.defaultHomeData);
258
+export default function TabNavigator(props: PropsType) {
259
+  let defaultRoute = 'home';
260
+  if (!props.defaultHomeRoute) {
261
+    defaultRoute = AsyncStorageManager.getString(
262
+      AsyncStorageManager.PREFERENCES.defaultStartScreen.key,
263
+    ).toLowerCase();
273
   }
264
   }
265
+  const createHomeStackComponent = () =>
266
+    HomeStackComponent(props.defaultHomeRoute, props.defaultHomeData);
274
 
267
 
275
-  render(): React.Node {
276
-    return (
277
-      <Tab.Navigator
278
-        initialRouteName={this.defaultRoute}
279
-        // eslint-disable-next-line react/jsx-props-no-spreading
280
-        tabBar={(props: {...}): React.Node => <CustomTabBar {...props} />}>
281
-        <Tab.Screen
282
-          name="services"
283
-          option
284
-          component={ServicesStackComponent}
285
-          options={{title: i18n.t('screens.services.title')}}
286
-        />
287
-        <Tab.Screen
288
-          name="proxiwash"
289
-          component={ProxiwashStackComponent}
290
-          options={{title: i18n.t('screens.proxiwash.title')}}
291
-        />
292
-        <Tab.Screen
293
-          name="home"
294
-          component={this.createHomeStackComponent}
295
-          options={{title: i18n.t('screens.home.title')}}
296
-        />
297
-        <Tab.Screen
298
-          name="planning"
299
-          component={PlanningStackComponent}
300
-          options={{title: i18n.t('screens.planning.title')}}
301
-        />
302
-
303
-        <Tab.Screen
304
-          name="planex"
305
-          component={PlanexStackComponent}
306
-          options={{title: i18n.t('screens.planex.title')}}
307
-        />
308
-      </Tab.Navigator>
309
-    );
310
-  }
268
+  return (
269
+    <Tab.Navigator
270
+      initialRouteName={defaultRoute}
271
+      tabBar={(tabProps) => <CustomTabBar {...tabProps} />}>
272
+      <Tab.Screen
273
+        name="services"
274
+        component={ServicesStackComponent}
275
+        options={{title: i18n.t('screens.services.title')}}
276
+      />
277
+      <Tab.Screen
278
+        name="proxiwash"
279
+        component={ProxiwashStackComponent}
280
+        options={{title: i18n.t('screens.proxiwash.title')}}
281
+      />
282
+      <Tab.Screen
283
+        name="home"
284
+        component={createHomeStackComponent}
285
+        options={{title: i18n.t('screens.home.title')}}
286
+      />
287
+      <Tab.Screen
288
+        name="planning"
289
+        component={PlanningStackComponent}
290
+        options={{title: i18n.t('screens.planning.title')}}
291
+      />
292
+      <Tab.Screen
293
+        name="planex"
294
+        component={PlanexStackComponent}
295
+        options={{title: i18n.t('screens.planex.title')}}
296
+      />
297
+    </Tab.Navigator>
298
+  );
311
 }
299
 }

+ 2
- 2
src/screens/About/AboutDependenciesScreen.tsx View File

50
 /**
50
 /**
51
  * Class defining a screen showing the list of libraries used by the app, taken from package.json
51
  * Class defining a screen showing the list of libraries used by the app, taken from package.json
52
  */
52
  */
53
-export default class AboutDependenciesScreen extends React.Component<null> {
53
+export default class AboutDependenciesScreen extends React.Component<{}> {
54
   data: Array<ListItemType>;
54
   data: Array<ListItemType>;
55
 
55
 
56
   constructor() {
56
   constructor() {
57
-    super(null);
57
+    super({});
58
     this.data = generateListFromObject(packageJson.dependencies);
58
     this.data = generateListFromObject(packageJson.dependencies);
59
   }
59
   }
60
 
60
 

+ 2
- 2
src/screens/Amicale/AmicaleContactScreen.tsx View File

34
 /**
34
 /**
35
  * Class defining a planning event information page.
35
  * Class defining a planning event information page.
36
  */
36
  */
37
-class AmicaleContactScreen extends React.Component<null> {
37
+class AmicaleContactScreen extends React.Component<{}> {
38
   // Dataset containing information about contacts
38
   // Dataset containing information about contacts
39
   CONTACT_DATASET: Array<DatasetItemType>;
39
   CONTACT_DATASET: Array<DatasetItemType>;
40
 
40
 
41
   constructor() {
41
   constructor() {
42
-    super(null);
42
+    super({});
43
     this.CONTACT_DATASET = [
43
     this.CONTACT_DATASET = [
44
       {
44
       {
45
         name: i18n.t('screens.amicaleAbout.roles.interSchools'),
45
         name: i18n.t('screens.amicaleAbout.roles.interSchools'),

+ 3
- 3
src/utils/CollapsibleUtils.tsx View File

21
 import {useTheme} from 'react-native-paper';
21
 import {useTheme} from 'react-native-paper';
22
 import {createCollapsibleStack} from 'react-navigation-collapsible';
22
 import {createCollapsibleStack} from 'react-navigation-collapsible';
23
 import StackNavigator, {StackNavigationOptions} from '@react-navigation/stack';
23
 import StackNavigator, {StackNavigationOptions} from '@react-navigation/stack';
24
-import {StackNavigationState} from '@react-navigation/native';
24
+import {StackNavigationState, TypedNavigator} from '@react-navigation/native';
25
 import {StackNavigationEventMap} from '@react-navigation/stack/lib/typescript/src/types';
25
 import {StackNavigationEventMap} from '@react-navigation/stack/lib/typescript/src/types';
26
 
26
 
27
 type StackNavigatorType = import('@react-navigation/native').TypedNavigator<
27
 type StackNavigatorType = import('@react-navigation/native').TypedNavigator<
50
  */
50
  */
51
 export function CreateScreenCollapsibleStack(
51
 export function CreateScreenCollapsibleStack(
52
   name: string,
52
   name: string,
53
-  Stack: StackNavigatorType,
53
+  Stack: TypedNavigator<any, any, any, any, any>,
54
   component: React.ComponentType<any>,
54
   component: React.ComponentType<any>,
55
   title: string,
55
   title: string,
56
   useNativeDriver: boolean = true,
56
   useNativeDriver: boolean = true,
91
  */
91
  */
92
 export function getWebsiteStack(
92
 export function getWebsiteStack(
93
   name: string,
93
   name: string,
94
-  Stack: StackNavigatorType,
94
+  Stack: TypedNavigator<any, any, any, any, any>,
95
   component: React.ComponentType<any>,
95
   component: React.ComponentType<any>,
96
   title: string,
96
   title: string,
97
 ) {
97
 ) {

Loading…
Cancel
Save