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