Browse Source

Update misc screens to use TypeScript

Arnaud Vergnet 3 years ago
parent
commit
4d0df7a5b7

+ 12
- 8
src/components/Lists/DashboardEdit/DashboardEditPreviewItem.tsx View File

@@ -22,7 +22,7 @@ import {TouchableRipple, useTheme} from 'react-native-paper';
22 22
 import {Dimensions, Image, View} from 'react-native';
23 23
 
24 24
 type PropsType = {
25
-  image: string;
25
+  image?: string | number;
26 26
   isActive: boolean;
27 27
   onPress: () => void;
28 28
 };
@@ -51,13 +51,17 @@ function DashboardEditPreviewItem(props: PropsType) {
51 51
           width: itemSize,
52 52
           height: itemSize,
53 53
         }}>
54
-        <Image
55
-          source={{uri: props.image}}
56
-          style={{
57
-            width: '100%',
58
-            height: '100%',
59
-          }}
60
-        />
54
+        {props.image ? (
55
+          <Image
56
+            source={
57
+              typeof props.image === 'string' ? {uri: props.image} : props.image
58
+            }
59
+            style={{
60
+              width: '100%',
61
+              height: '100%',
62
+            }}
63
+          />
64
+        ) : null}
61 65
       </View>
62 66
     </TouchableRipple>
63 67
   );

+ 0
- 179
src/screens/Other/FeedbackScreen.js View File

@@ -1,179 +0,0 @@
1
-/*
2
- * Copyright (c) 2019 - 2020 Arnaud Vergnet.
3
- *
4
- * This file is part of Campus INSAT.
5
- *
6
- * Campus INSAT is free software: you can redistribute it and/or modify
7
- *  it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation, either version 3 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * Campus INSAT is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License
17
- * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
18
- */
19
-
20
-// @flow
21
-
22
-import * as React from 'react';
23
-import {Avatar, Button, Card, Paragraph, withTheme} from 'react-native-paper';
24
-import i18n from 'i18n-js';
25
-import {Linking, View} from 'react-native';
26
-import CollapsibleScrollView from '../../components/Collapsible/CollapsibleScrollView';
27
-import type {CardTitleIconPropsType} from '../../constants/PaperStyles';
28
-
29
-const links = {
30
-  bugsGit: 'https://git.etud.insa-toulouse.fr/vergnet/application-amicale/',
31
-  trello: 'https://trello.com/b/RMej49Uq/application-campus-insa',
32
-  facebook: 'https://www.facebook.com/campus.insat',
33
-  feedbackMail: `mailto:app@amicale-insat.fr?subject=[FEEDBACK] Application CAMPUS
34
-&body=Coucou Arnaud j'ai du feedback\n\n\n\nBien cordialement.`,
35
-  feedbackDiscord: 'https://discord.gg/W8MeTec',
36
-};
37
-
38
-class FeedbackScreen extends React.Component<null> {
39
-  /**
40
-   * Gets link buttons
41
-   *
42
-   * @returns {*}
43
-   */
44
-  static getButtons(isFeedback: boolean): React.Node {
45
-    return (
46
-      <Card.Actions
47
-        style={{
48
-          flex: 1,
49
-          flexWrap: 'wrap',
50
-        }}>
51
-        {isFeedback ? (
52
-          <View
53
-            style={{
54
-              flex: 1,
55
-              flexWrap: 'wrap',
56
-              flexDirection: 'row',
57
-              width: '100%',
58
-            }}>
59
-            <Button
60
-              icon="email"
61
-              mode="contained"
62
-              style={{
63
-                marginLeft: 'auto',
64
-                marginRight: 'auto',
65
-                marginTop: 5,
66
-              }}
67
-              onPress={() => {
68
-                Linking.openURL(links.feedbackMail);
69
-              }}>
70
-              MAIL
71
-            </Button>
72
-            <Button
73
-              icon="facebook"
74
-              mode="contained"
75
-              color="#2e88fe"
76
-              style={{
77
-                marginLeft: 'auto',
78
-                marginRight: 'auto',
79
-                marginTop: 5,
80
-              }}
81
-              onPress={() => {
82
-                Linking.openURL(links.facebook);
83
-              }}>
84
-              Facebook
85
-            </Button>
86
-            <Button
87
-              icon="discord"
88
-              mode="contained"
89
-              color="#7289da"
90
-              style={{
91
-                marginLeft: 'auto',
92
-                marginRight: 'auto',
93
-                marginTop: 5,
94
-              }}
95
-              onPress={() => {
96
-                Linking.openURL(links.feedbackDiscord);
97
-              }}>
98
-              Discord
99
-            </Button>
100
-          </View>
101
-        ) : (
102
-          <View
103
-            style={{
104
-              flex: 1,
105
-              flexWrap: 'wrap',
106
-              flexDirection: 'row',
107
-              width: '100%',
108
-            }}>
109
-            <Button
110
-              icon="git"
111
-              mode="contained"
112
-              color="#609927"
113
-              style={{
114
-                marginLeft: 'auto',
115
-                marginRight: 'auto',
116
-                marginTop: 5,
117
-              }}
118
-              onPress={() => {
119
-                Linking.openURL(links.bugsGit);
120
-              }}>
121
-              GITETUD
122
-            </Button>
123
-            <Button
124
-              icon="calendar"
125
-              mode="contained"
126
-              color="#026AA7"
127
-              style={{
128
-                marginLeft: 'auto',
129
-                marginRight: 'auto',
130
-                marginTop: 5,
131
-              }}
132
-              onPress={() => {
133
-                Linking.openURL(links.trello);
134
-              }}>
135
-              TRELLO
136
-            </Button>
137
-          </View>
138
-        )}
139
-      </Card.Actions>
140
-    );
141
-  }
142
-
143
-  render(): React.Node {
144
-    return (
145
-      <CollapsibleScrollView style={{padding: 5}}>
146
-        <Card>
147
-          <Card.Title
148
-            title={i18n.t('screens.feedback.feedback')}
149
-            subtitle={i18n.t('screens.feedback.feedbackSubtitle')}
150
-            left={(iconProps: CardTitleIconPropsType): React.Node => (
151
-              <Avatar.Icon size={iconProps.size} icon="comment" />
152
-            )}
153
-          />
154
-          <Card.Content>
155
-            <Paragraph>
156
-              {i18n.t('screens.feedback.feedbackDescription')}
157
-            </Paragraph>
158
-          </Card.Content>
159
-          {FeedbackScreen.getButtons(true)}
160
-          <Card.Title
161
-            title={i18n.t('screens.feedback.contribute')}
162
-            subtitle={i18n.t('screens.feedback.contributeSubtitle')}
163
-            left={(iconProps: CardTitleIconPropsType): React.Node => (
164
-              <Avatar.Icon size={iconProps.size} icon="handshake" />
165
-            )}
166
-          />
167
-          <Card.Content>
168
-            <Paragraph>
169
-              {i18n.t('screens.feedback.contributeDescription')}
170
-            </Paragraph>
171
-          </Card.Content>
172
-          {FeedbackScreen.getButtons(false)}
173
-        </Card>
174
-      </CollapsibleScrollView>
175
-    );
176
-  }
177
-}
178
-
179
-export default withTheme(FeedbackScreen);

+ 169
- 0
src/screens/Other/FeedbackScreen.tsx View File

@@ -0,0 +1,169 @@
1
+/*
2
+ * Copyright (c) 2019 - 2020 Arnaud Vergnet.
3
+ *
4
+ * This file is part of Campus INSAT.
5
+ *
6
+ * Campus INSAT is free software: you can redistribute it and/or modify
7
+ *  it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * Campus INSAT is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
18
+ */
19
+
20
+import * as React from 'react';
21
+import {Avatar, Button, Card, Paragraph, withTheme} from 'react-native-paper';
22
+import i18n from 'i18n-js';
23
+import {Linking, View} from 'react-native';
24
+import CollapsibleScrollView from '../../components/Collapsible/CollapsibleScrollView';
25
+
26
+const links = {
27
+  bugsGit: 'https://git.etud.insa-toulouse.fr/vergnet/application-amicale/',
28
+  trello: 'https://trello.com/b/RMej49Uq/application-campus-insa',
29
+  facebook: 'https://www.facebook.com/campus.insat',
30
+  feedbackMail: `mailto:app@amicale-insat.fr?subject=[FEEDBACK] Application CAMPUS
31
+&body=Coucou Arnaud j'ai du feedback\n\n\n\nBien cordialement.`,
32
+  feedbackDiscord: 'https://discord.gg/W8MeTec',
33
+};
34
+
35
+function getButtons(isFeedback: boolean) {
36
+  return (
37
+    <Card.Actions
38
+      style={{
39
+        flex: 1,
40
+        flexWrap: 'wrap',
41
+      }}>
42
+      {isFeedback ? (
43
+        <View
44
+          style={{
45
+            flex: 1,
46
+            flexWrap: 'wrap',
47
+            flexDirection: 'row',
48
+            width: '100%',
49
+          }}>
50
+          <Button
51
+            icon="email"
52
+            mode="contained"
53
+            style={{
54
+              marginLeft: 'auto',
55
+              marginRight: 'auto',
56
+              marginTop: 5,
57
+            }}
58
+            onPress={() => {
59
+              Linking.openURL(links.feedbackMail);
60
+            }}>
61
+            MAIL
62
+          </Button>
63
+          <Button
64
+            icon="facebook"
65
+            mode="contained"
66
+            color="#2e88fe"
67
+            style={{
68
+              marginLeft: 'auto',
69
+              marginRight: 'auto',
70
+              marginTop: 5,
71
+            }}
72
+            onPress={() => {
73
+              Linking.openURL(links.facebook);
74
+            }}>
75
+            Facebook
76
+          </Button>
77
+          <Button
78
+            icon="discord"
79
+            mode="contained"
80
+            color="#7289da"
81
+            style={{
82
+              marginLeft: 'auto',
83
+              marginRight: 'auto',
84
+              marginTop: 5,
85
+            }}
86
+            onPress={() => {
87
+              Linking.openURL(links.feedbackDiscord);
88
+            }}>
89
+            Discord
90
+          </Button>
91
+        </View>
92
+      ) : (
93
+        <View
94
+          style={{
95
+            flex: 1,
96
+            flexWrap: 'wrap',
97
+            flexDirection: 'row',
98
+            width: '100%',
99
+          }}>
100
+          <Button
101
+            icon="git"
102
+            mode="contained"
103
+            color="#609927"
104
+            style={{
105
+              marginLeft: 'auto',
106
+              marginRight: 'auto',
107
+              marginTop: 5,
108
+            }}
109
+            onPress={() => {
110
+              Linking.openURL(links.bugsGit);
111
+            }}>
112
+            GITETUD
113
+          </Button>
114
+          <Button
115
+            icon="calendar"
116
+            mode="contained"
117
+            color="#026AA7"
118
+            style={{
119
+              marginLeft: 'auto',
120
+              marginRight: 'auto',
121
+              marginTop: 5,
122
+            }}
123
+            onPress={() => {
124
+              Linking.openURL(links.trello);
125
+            }}>
126
+            TRELLO
127
+          </Button>
128
+        </View>
129
+      )}
130
+    </Card.Actions>
131
+  );
132
+}
133
+
134
+function FeedbackScreen() {
135
+  return (
136
+    <CollapsibleScrollView style={{padding: 5}}>
137
+      <Card>
138
+        <Card.Title
139
+          title={i18n.t('screens.feedback.feedback')}
140
+          subtitle={i18n.t('screens.feedback.feedbackSubtitle')}
141
+          left={(iconProps) => (
142
+            <Avatar.Icon size={iconProps.size} icon="comment" />
143
+          )}
144
+        />
145
+        <Card.Content>
146
+          <Paragraph>
147
+            {i18n.t('screens.feedback.feedbackDescription')}
148
+          </Paragraph>
149
+        </Card.Content>
150
+        {getButtons(true)}
151
+        <Card.Title
152
+          title={i18n.t('screens.feedback.contribute')}
153
+          subtitle={i18n.t('screens.feedback.contributeSubtitle')}
154
+          left={(iconProps) => (
155
+            <Avatar.Icon size={iconProps.size} icon="handshake" />
156
+          )}
157
+        />
158
+        <Card.Content>
159
+          <Paragraph>
160
+            {i18n.t('screens.feedback.contributeDescription')}
161
+          </Paragraph>
162
+        </Card.Content>
163
+        {getButtons(false)}
164
+      </Card>
165
+    </CollapsibleScrollView>
166
+  );
167
+}
168
+
169
+export default withTheme(FeedbackScreen);

src/screens/Other/Settings/DashboardEditScreen.js → src/screens/Other/Settings/DashboardEditScreen.tsx View File

@@ -17,11 +17,9 @@
17 17
  * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
18 18
  */
19 19
 
20
-// @flow
21
-
22 20
 import * as React from 'react';
23 21
 import {StackNavigationProp} from '@react-navigation/stack';
24
-import {Button, Card, Paragraph, withTheme} from 'react-native-paper';
22
+import {Button, Card, Paragraph} from 'react-native-paper';
25 23
 import {FlatList} from 'react-native';
26 24
 import {View} from 'react-native-animatable';
27 25
 import i18n from 'i18n-js';
@@ -30,20 +28,19 @@ import type {
30 28
   ServiceItemType,
31 29
 } from '../../../managers/ServicesManager';
32 30
 import DashboardManager from '../../../managers/DashboardManager';
33
-import DashboardItem from '../../../components/Home/EventDashboardItem';
34 31
 import DashboardEditAccordion from '../../../components/Lists/DashboardEdit/DashboardEditAccordion';
35 32
 import DashboardEditPreviewItem from '../../../components/Lists/DashboardEdit/DashboardEditPreviewItem';
36 33
 import AsyncStorageManager from '../../../managers/AsyncStorageManager';
37 34
 import CollapsibleFlatList from '../../../components/Collapsible/CollapsibleFlatList';
38 35
 
39 36
 type PropsType = {
40
-  navigation: StackNavigationProp,
37
+  navigation: StackNavigationProp<any>;
41 38
 };
42 39
 
43 40
 type StateType = {
44
-  currentDashboard: Array<ServiceItemType | null>,
45
-  currentDashboardIdList: Array<string>,
46
-  activeItem: number,
41
+  currentDashboard: Array<ServiceItemType | null>;
42
+  currentDashboardIdList: Array<string>;
43
+  activeItem: number;
47 44
 };
48 45
 
49 46
 /**
@@ -75,13 +72,13 @@ class DashboardEditScreen extends React.Component<PropsType, StateType> {
75 72
     item,
76 73
     index,
77 74
   }: {
78
-    item: DashboardItem,
79
-    index: number,
80
-  }): React.Node => {
75
+    item: ServiceItemType | null;
76
+    index: number;
77
+  }) => {
81 78
     const {activeItem} = this.state;
82 79
     return (
83 80
       <DashboardEditPreviewItem
84
-        image={item.image}
81
+        image={item?.image}
85 82
         onPress={() => {
86 83
           this.setState({activeItem: index});
87 84
         }}
@@ -90,7 +87,7 @@ class DashboardEditScreen extends React.Component<PropsType, StateType> {
90 87
     );
91 88
   };
92 89
 
93
-  getDashboard(content: Array<DashboardItem>): React.Node {
90
+  getDashboard(content: Array<ServiceItemType | null>) {
94 91
     return (
95 92
       <FlatList
96 93
         data={content}
@@ -106,7 +103,7 @@ class DashboardEditScreen extends React.Component<PropsType, StateType> {
106 103
     );
107 104
   }
108 105
 
109
-  getRenderItem = ({item}: {item: ServiceCategoryType}): React.Node => {
106
+  getRenderItem = ({item}: {item: ServiceCategoryType}) => {
110 107
     const {currentDashboardIdList} = this.state;
111 108
     return (
112 109
       <DashboardEditAccordion
@@ -117,7 +114,7 @@ class DashboardEditScreen extends React.Component<PropsType, StateType> {
117 114
     );
118 115
   };
119 116
 
120
-  getListHeader(): React.Node {
117
+  getListHeader() {
121 118
     const {currentDashboard} = this.state;
122 119
     return (
123 120
       <Card style={{margin: 5}}>
@@ -170,7 +167,7 @@ class DashboardEditScreen extends React.Component<PropsType, StateType> {
170 167
     );
171 168
   };
172 169
 
173
-  render(): React.Node {
170
+  render() {
174 171
     return (
175 172
       <CollapsibleFlatList
176 173
         data={this.content}
@@ -182,4 +179,4 @@ class DashboardEditScreen extends React.Component<PropsType, StateType> {
182 179
   }
183 180
 }
184 181
 
185
-export default withTheme(DashboardEditScreen);
182
+export default DashboardEditScreen;

src/screens/Other/Settings/SettingsScreen.js → src/screens/Other/Settings/SettingsScreen.tsx View File

@@ -17,8 +17,6 @@
17 17
  * along with Campus INSAT.  If not, see <https://www.gnu.org/licenses/>.
18 18
  */
19 19
 
20
-// @flow
21
-
22 20
 import * as React from 'react';
23 21
 import {View} from 'react-native';
24 22
 import i18n from 'i18n-js';
@@ -32,24 +30,22 @@ import {
32 30
 } from 'react-native-paper';
33 31
 import {Appearance} from 'react-native-appearance';
34 32
 import {StackNavigationProp} from '@react-navigation/stack';
35
-import type {CustomThemeType} from '../../../managers/ThemeManager';
36 33
 import ThemeManager from '../../../managers/ThemeManager';
37 34
 import AsyncStorageManager from '../../../managers/AsyncStorageManager';
38 35
 import CustomSlider from '../../../components/Overrides/CustomSlider';
39 36
 import CollapsibleScrollView from '../../../components/Collapsible/CollapsibleScrollView';
40
-import type {ListIconPropsType} from '../../../constants/PaperStyles';
41 37
 
42 38
 type PropsType = {
43
-  navigation: StackNavigationProp,
44
-  theme: CustomThemeType,
39
+  navigation: StackNavigationProp<any>;
40
+  theme: ReactNativePaper.Theme;
45 41
 };
46 42
 
47 43
 type StateType = {
48
-  nightMode: boolean,
49
-  nightModeFollowSystem: boolean,
50
-  startScreenPickerSelected: string,
51
-  selectedWash: string,
52
-  isDebugUnlocked: boolean,
44
+  nightMode: boolean;
45
+  nightModeFollowSystem: boolean;
46
+  startScreenPickerSelected: string;
47
+  selectedWash: string;
48
+  isDebugUnlocked: boolean;
53 49
 };
54 50
 
55 51
 /**
@@ -61,14 +57,15 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
61 57
   /**
62 58
    * Loads user preferences into state
63 59
    */
64
-  constructor() {
65
-    super();
60
+  constructor(props: PropsType) {
61
+    super(props);
66 62
     const notifReminder = AsyncStorageManager.getString(
67 63
       AsyncStorageManager.PREFERENCES.proxiwashNotifications.key,
68 64
     );
69 65
     this.savedNotificationReminder = parseInt(notifReminder, 10);
70
-    if (Number.isNaN(this.savedNotificationReminder))
66
+    if (Number.isNaN(this.savedNotificationReminder)) {
71 67
       this.savedNotificationReminder = 0;
68
+    }
72 69
 
73 70
     this.state = {
74 71
       nightMode: ThemeManager.getNightMode(),
@@ -120,7 +117,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
120 117
    *
121 118
    * @returns {React.Node}
122 119
    */
123
-  getProxiwashNotifPicker(): React.Node {
120
+  getProxiwashNotifPicker() {
124 121
     const {theme} = this.props;
125 122
     return (
126 123
       <CustomSlider
@@ -141,7 +138,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
141 138
    *
142 139
    * @returns {React.Node}
143 140
    */
144
-  getProxiwashChangePicker(): React.Node {
141
+  getProxiwashChangePicker() {
145 142
     const {selectedWash} = this.state;
146 143
     return (
147 144
       <RadioButton.Group
@@ -164,7 +161,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
164 161
    *
165 162
    * @returns {React.Node}
166 163
    */
167
-  getStartScreenPicker(): React.Node {
164
+  getStartScreenPicker() {
168 165
     const {startScreenPickerSelected} = this.state;
169 166
     return (
170 167
       <ToggleButton.Row
@@ -220,17 +217,15 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
220 217
     title: string,
221 218
     subtitle: string,
222 219
     state: boolean,
223
-  ): React.Node {
220
+  ) {
224 221
     return (
225 222
       <List.Item
226 223
         title={title}
227 224
         description={subtitle}
228
-        left={(props: ListIconPropsType): React.Node => (
225
+        left={(props) => (
229 226
           <List.Icon color={props.color} style={props.style} icon={icon} />
230 227
         )}
231
-        right={(): React.Node => (
232
-          <Switch value={state} onValueChange={onPressCallback} />
233
-        )}
228
+        right={() => <Switch value={state} onValueChange={onPressCallback} />}
234 229
       />
235 230
     );
236 231
   }
@@ -241,7 +236,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
241 236
     title: string,
242 237
     subtitle: string,
243 238
     onLongPress?: () => void,
244
-  ): React.Node {
239
+  ) {
245 240
     const {navigation} = this.props;
246 241
     return (
247 242
       <List.Item
@@ -250,10 +245,10 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
250 245
         onPress={() => {
251 246
           navigation.navigate(route);
252 247
         }}
253
-        left={(props: ListIconPropsType): React.Node => (
248
+        left={(props) => (
254 249
           <List.Icon color={props.color} style={props.style} icon={icon} />
255 250
         )}
256
-        right={(props: ListIconPropsType): React.Node => (
251
+        right={(props) => (
257 252
           <List.Icon
258 253
             color={props.color}
259 254
             style={props.style}
@@ -291,7 +286,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
291 286
     );
292 287
   };
293 288
 
294
-  render(): React.Node {
289
+  render() {
295 290
     const {nightModeFollowSystem, nightMode, isDebugUnlocked} = this.state;
296 291
     return (
297 292
       <CollapsibleScrollView>
@@ -322,7 +317,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
322 317
             <List.Item
323 318
               title={i18n.t('screens.settings.startScreen')}
324 319
               description={i18n.t('screens.settings.startScreenSub')}
325
-              left={(props: ListIconPropsType): React.Node => (
320
+              left={(props) => (
326 321
                 <List.Icon
327 322
                   color={props.color}
328 323
                   style={props.style}
@@ -345,7 +340,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
345 340
             <List.Item
346 341
               title={i18n.t('screens.settings.proxiwashNotifReminder')}
347 342
               description={i18n.t('screens.settings.proxiwashNotifReminderSub')}
348
-              left={(props: ListIconPropsType): React.Node => (
343
+              left={(props) => (
349 344
                 <List.Icon
350 345
                   color={props.color}
351 346
                   style={props.style}
@@ -359,7 +354,7 @@ class SettingsScreen extends React.Component<PropsType, StateType> {
359 354
             <List.Item
360 355
               title={i18n.t('screens.settings.proxiwashChangeWash')}
361 356
               description={i18n.t('screens.settings.proxiwashChangeWashSub')}
362
-              left={(props: ListIconPropsType): React.Node => (
357
+              left={(props) => (
363 358
                 <List.Icon
364 359
                   color={props.color}
365 360
                   style={props.style}

Loading…
Cancel
Save