1import { BottomTabNavigationProp } from '@react-navigation/bottom-tabs';
2import { createStackNavigator } from '@react-navigation/stack';
3import * as React from 'react';
4
5import getStackConfig from './StackConfig';
6import { optionalRequire } from './routeBuilder';
7import TabIcon from '../components/TabIcon';
8import ExpoApis from '../screens/ExpoApisScreen';
9
10const Stack = createStackNavigator();
11
12export const Screens = [
13  {
14    getComponent() {
15      return optionalRequire(() => require('../screens/ExpoModulesScreen'));
16    },
17    name: 'ExpoModules',
18  },
19  {
20    getComponent() {
21      return optionalRequire(() => require('../screens/StatusBarScreen'));
22    },
23    name: 'StatusBar',
24  },
25  {
26    getComponent() {
27      return optionalRequire(() => require('../screens/AlertScreen'));
28    },
29    name: 'Alert',
30  },
31  {
32    getComponent() {
33      return optionalRequire(() => require('../screens/Clipboard/ClipboardScreen'));
34    },
35    name: 'Clipboard',
36  },
37  {
38    getComponent() {
39      return optionalRequire(() => require('../screens/CellularScreen'));
40    },
41    name: 'Cellular',
42  },
43  {
44    getComponent() {
45      return optionalRequire(() => require('../screens/AccelerometerScreen'));
46    },
47    name: 'Accelerometer',
48  },
49  {
50    getComponent() {
51      return optionalRequire(() => require('../screens/ActionSheetScreen'));
52    },
53    name: 'ActionSheet',
54    options: { title: 'Action Sheet' },
55  },
56  {
57    getComponent() {
58      return optionalRequire(() => require('../screens/AppearanceScreen'));
59    },
60    name: 'Appearance',
61  },
62  {
63    getComponent() {
64      return optionalRequire(() => require('../screens/AppleAuthenticationScreen'));
65    },
66    name: 'AppleAuthentication',
67    options: { title: 'Apple Authentication' },
68  },
69  {
70    getComponent() {
71      return optionalRequire(() => require('../screens/AsyncStorageScreen'));
72    },
73    name: 'AsyncStorage',
74  },
75  {
76    getComponent() {
77      return optionalRequire(() => require('../screens/AV/AudioScreen'));
78    },
79    name: 'Audio',
80  },
81  {
82    getComponent() {
83      return optionalRequire(() => require('../screens/AuthSession/AuthSessionScreen'));
84    },
85    name: 'AuthSession',
86  },
87  {
88    getComponent() {
89      return optionalRequire(() => require('../screens/Location/BackgroundLocationMapScreen'));
90    },
91    name: 'BackgroundLocation',
92    options: { title: 'Background location' },
93  },
94  {
95    getComponent() {
96      return optionalRequire(() => require('../screens/BackgroundFetchScreen'));
97    },
98    name: 'BackgroundFetch',
99    options: { title: 'Background Fetch' },
100  },
101  {
102    getComponent() {
103      return optionalRequire(() => require('../screens/BatteryScreen'));
104    },
105    name: 'Battery',
106  },
107  {
108    getComponent() {
109      return optionalRequire(() => require('../screens/BrightnessScreen'));
110    },
111    name: 'Brightness',
112  },
113  {
114    getComponent() {
115      return optionalRequire(() => require('../screens/DeviceScreen'));
116    },
117    name: 'Device',
118  },
119  {
120    getComponent() {
121      return optionalRequire(() => require('../screens/DocumentPickerScreen'));
122    },
123    name: 'DocumentPicker',
124  },
125  {
126    getComponent() {
127      return optionalRequire(() => require('../screens/LocalizationScreen'));
128    },
129    name: 'Localization',
130  },
131  {
132    getComponent() {
133      return optionalRequire(() => require('../screens/FaceDetectorScreen'));
134    },
135    name: 'FaceDetector',
136  },
137  {
138    getComponent() {
139      return optionalRequire(() => require('../screens/FileSystemScreen'));
140    },
141    name: 'FileSystem',
142  },
143  {
144    getComponent() {
145      return optionalRequire(() => require('../screens/FontScreen'));
146    },
147    name: 'Font',
148  },
149  {
150    getComponent() {
151      return optionalRequire(() => require('../screens/HapticsScreen'));
152    },
153    name: 'Haptics',
154    options: { title: 'Haptics Feedback' },
155  },
156  {
157    getComponent() {
158      return optionalRequire(() => require('../screens/CalendarsScreen'));
159    },
160    name: 'Calendars',
161  },
162  {
163    getComponent() {
164      return optionalRequire(() => require('../screens/ConstantsScreen'));
165    },
166    name: 'Constants',
167  },
168  {
169    getComponent() {
170      return optionalRequire(() => require('../screens/Contacts/ContactsScreen'));
171    },
172    name: 'Contacts',
173  },
174  {
175    getComponent() {
176      return optionalRequire(() => require('../screens/Contacts/ContactDetailScreen'));
177    },
178    name: 'ContactDetail',
179  },
180  {
181    getComponent() {
182      return optionalRequire(() => require('../screens/ErrorScreen'));
183    },
184    name: 'Errors',
185  },
186  {
187    getComponent() {
188      return optionalRequire(() => require('../screens/EventsScreen'));
189    },
190    name: 'Events',
191  },
192  {
193    getComponent() {
194      return optionalRequire(() => require('../screens/ImageManipulatorScreen'));
195    },
196    name: 'ImageManipulator',
197  },
198  {
199    getComponent() {
200      return optionalRequire(() => require('../screens/ImagePicker/ImagePickerScreen'));
201    },
202    name: 'ImagePicker',
203  },
204  {
205    getComponent() {
206      return optionalRequire(() => require('../screens/InAppPurchases/InAppPurchases'));
207    },
208    name: 'InAppPurchases',
209    options: { title: 'In-App Purchases' },
210  },
211  {
212    getComponent() {
213      return optionalRequire(() => require('../screens/IntentLauncherScreen'));
214    },
215    name: 'IntentLauncher',
216  },
217  {
218    getComponent() {
219      return optionalRequire(() => require('../screens/KeepAwakeScreen'));
220    },
221    name: 'KeepAwake',
222  },
223  {
224    getComponent() {
225      return optionalRequire(() => require('../screens/LinkingScreen'));
226    },
227    name: 'Linking',
228  },
229  {
230    getComponent() {
231      return optionalRequire(() => require('../screens/MailComposerScreen'));
232    },
233    name: 'MailComposer',
234  },
235  {
236    getComponent() {
237      return optionalRequire(() => require('../screens/MediaLibrary/MediaLibraryScreen'));
238    },
239    name: 'MediaLibrary',
240  },
241  {
242    getComponent() {
243      return optionalRequire(() => require('../screens/MediaLibrary/MediaAlbumsScreen'));
244    },
245    name: 'MediaAlbums',
246    options: { title: 'MediaLibrary Albums' },
247  },
248  {
249    getComponent() {
250      return optionalRequire(() => require('../screens/MediaLibrary/MediaDetailsScreen'));
251    },
252    name: 'MediaDetails',
253    options: { title: 'MediaLibrary Asset' },
254  },
255  {
256    getComponent() {
257      return optionalRequire(() => require('../screens/NetInfoScreen'));
258    },
259    name: 'NetInfo',
260  },
261  {
262    getComponent() {
263      return optionalRequire(() => require('../screens/NetworkScreen'));
264    },
265    name: 'Network',
266  },
267  {
268    getComponent() {
269      return optionalRequire(() => require('../screens/CryptoScreen'));
270    },
271    name: 'Crypto',
272  },
273  {
274    getComponent() {
275      return optionalRequire(() => require('../screens/NotificationScreen'));
276    },
277    name: 'Notification',
278  },
279  {
280    getComponent() {
281      return optionalRequire(() => require('../screens/LocalAuthenticationScreen'));
282    },
283    name: 'LocalAuthentication',
284  },
285  {
286    getComponent() {
287      return optionalRequire(() => require('../screens/Location/LocationScreen'));
288    },
289    name: 'Location',
290  },
291  {
292    getComponent() {
293      return optionalRequire(() => require('../screens/Location/GeocodingScreen'));
294    },
295    name: 'Geocoding',
296  },
297  {
298    getComponent() {
299      return optionalRequire(() => require('../screens/Location/GeofencingScreen'));
300    },
301    name: 'Geofencing',
302    options: { title: 'Geofencing Map' },
303  },
304  {
305    getComponent() {
306      return optionalRequire(() => require('../screens/PedometerScreen'));
307    },
308    name: 'Pedometer',
309  },
310  {
311    getComponent() {
312      return optionalRequire(() => require('../screens/PrintScreen'));
313    },
314    name: 'Print',
315  },
316  {
317    getComponent() {
318      return optionalRequire(() => require('../screens/AV/RecordingScreen'));
319    },
320    name: 'Recording',
321    options: { title: 'Audio Recording' },
322  },
323  {
324    getComponent() {
325      return optionalRequire(() => require('../screens/RandomScreen'));
326    },
327    name: 'Random',
328  },
329  {
330    getComponent() {
331      return optionalRequire(() => require('../screens/RemindersScreen'));
332    },
333    name: 'Reminders',
334  },
335  {
336    getComponent() {
337      return optionalRequire(() => require('../screens/SafeAreaContextScreen'));
338    },
339    name: 'SafeAreaContext',
340  },
341  {
342    getComponent() {
343      return optionalRequire(() => require('../screens/ScreenOrientationScreen'));
344    },
345    name: 'ScreenOrientation',
346  },
347  {
348    getComponent() {
349      return optionalRequire(() => require('../screens/SecureStoreScreen'));
350    },
351    name: 'SecureStore',
352  },
353  {
354    getComponent() {
355      return optionalRequire(() => require('../screens/ScreenCaptureScreen'));
356    },
357    name: 'ScreenCapture',
358  },
359  {
360    getComponent() {
361      return optionalRequire(() => require('../screens/SensorScreen'));
362    },
363    name: 'Sensor',
364  },
365  {
366    getComponent() {
367      return optionalRequire(() => require('../screens/SharingScreen'));
368    },
369    name: 'Sharing',
370  },
371  {
372    getComponent() {
373      return optionalRequire(() => require('../screens/NavigationBarScreen'));
374    },
375    name: 'NavigationBar',
376  },
377  {
378    getComponent() {
379      return optionalRequire(() => require('../screens/SystemUIScreen'));
380    },
381    name: 'SystemUI',
382  },
383  {
384    getComponent() {
385      return optionalRequire(() => require('../screens/SMSScreen'));
386    },
387    name: 'SMS',
388  },
389  {
390    getComponent() {
391      return optionalRequire(() => require('../screens/StoreReview'));
392    },
393    name: 'StoreReview',
394    options: { title: 'Store Review' },
395  },
396  {
397    getComponent() {
398      return optionalRequire(() => require('../screens/TaskManagerScreen'));
399    },
400    name: 'TaskManager',
401  },
402  {
403    getComponent() {
404      return optionalRequire(() => require('../screens/TextToSpeechScreen'));
405    },
406    name: 'TextToSpeech',
407    options: { title: 'Speech' },
408  },
409  {
410    getComponent() {
411      return optionalRequire(() => require('../screens/TrackingTransparencyScreen'));
412    },
413    name: 'TrackingTransparency',
414    options: { title: 'TrackingTransparency' },
415  },
416  {
417    getComponent() {
418      return optionalRequire(() => require('../screens/WebBrowser/WebBrowserScreen'));
419    },
420    name: 'WebBrowser',
421  },
422  {
423    getComponent() {
424      return optionalRequire(() => require('../screens/ViewShotScreen'));
425    },
426    name: 'ViewShot',
427  },
428];
429
430function ExpoApisStackNavigator(props: { navigation: BottomTabNavigationProp<any> }) {
431  return (
432    <Stack.Navigator {...props} {...getStackConfig(props)}>
433      <Stack.Screen name="ExpoApis" options={{ title: 'APIs in Expo SDK' }} component={ExpoApis} />
434
435      {Screens.map(({ name, options, getComponent }) => (
436        <Stack.Screen name={name} key={name} getComponent={getComponent} options={options || {}} />
437      ))}
438    </Stack.Navigator>
439  );
440}
441const icon = ({ focused }: { focused: boolean }) => {
442  return <TabIcon name="code-tags" focused={focused} />;
443};
444ExpoApisStackNavigator.navigationOptions = {
445  title: 'APIs',
446  tabBarLabel: 'APIs',
447  tabBarIcon: icon,
448  drawerIcon: icon,
449};
450
451export default ExpoApisStackNavigator;
452