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/GoogleSignInScreen'));
182    },
183    name: 'GoogleSignIn',
184    options: { title: 'Native Google Sign-In' },
185  },
186  {
187    getComponent() {
188      return optionalRequire(() => require('../screens/HapticsScreen'));
189    },
190    name: 'Haptics',
191    options: { title: 'Haptics Feedback' },
192  },
193  {
194    getComponent() {
195      return optionalRequire(() => require('../screens/CalendarsScreen'));
196    },
197    name: 'Calendars',
198  },
199  {
200    getComponent() {
201      return optionalRequire(() => require('../screens/ConstantsScreen'));
202    },
203    name: 'Constants',
204  },
205  {
206    getComponent() {
207      return optionalRequire(() => require('../screens/Contacts/ContactsScreen'));
208    },
209    name: 'Contacts',
210  },
211  {
212    getComponent() {
213      return optionalRequire(() => require('../screens/Contacts/ContactDetailScreen'));
214    },
215    name: 'ContactDetail',
216  },
217  {
218    getComponent() {
219      return optionalRequire(() => require('../screens/ErrorScreen'));
220    },
221    name: 'Errors',
222  },
223  {
224    getComponent() {
225      return optionalRequire(() => require('../screens/EventsScreen'));
226    },
227    name: 'Events',
228  },
229  {
230    getComponent() {
231      return optionalRequire(() => require('../screens/ImageManipulatorScreen'));
232    },
233    name: 'ImageManipulator',
234  },
235  {
236    getComponent() {
237      return optionalRequire(() => require('../screens/ImagePicker/ImagePickerScreen'));
238    },
239    name: 'ImagePicker',
240  },
241  {
242    getComponent() {
243      return optionalRequire(() => require('../screens/InAppPurchases/InAppPurchases'));
244    },
245    name: 'InAppPurchases',
246    options: { title: 'In-App Purchases' },
247  },
248  {
249    getComponent() {
250      return optionalRequire(() => require('../screens/IntentLauncherScreen'));
251    },
252    name: 'IntentLauncher',
253  },
254  {
255    getComponent() {
256      return optionalRequire(() => require('../screens/KeepAwakeScreen'));
257    },
258    name: 'KeepAwake',
259  },
260  {
261    getComponent() {
262      return optionalRequire(() => require('../screens/LinkingScreen'));
263    },
264    name: 'Linking',
265  },
266  {
267    getComponent() {
268      return optionalRequire(() => require('../screens/MailComposerScreen'));
269    },
270    name: 'MailComposer',
271  },
272  {
273    getComponent() {
274      return optionalRequire(() => require('../screens/MediaLibrary/MediaLibraryScreen'));
275    },
276    name: 'MediaLibrary',
277  },
278  {
279    getComponent() {
280      return optionalRequire(() => require('../screens/MediaLibrary/MediaAlbumsScreen'));
281    },
282    name: 'MediaAlbums',
283    options: { title: 'MediaLibrary Albums' },
284  },
285  {
286    getComponent() {
287      return optionalRequire(() => require('../screens/MediaLibrary/MediaDetailsScreen'));
288    },
289    name: 'MediaDetails',
290    options: { title: 'MediaLibrary Asset' },
291  },
292  {
293    getComponent() {
294      return optionalRequire(() => require('../screens/NetInfoScreen'));
295    },
296    name: 'NetInfo',
297  },
298  {
299    getComponent() {
300      return optionalRequire(() => require('../screens/NetworkScreen'));
301    },
302    name: 'Network',
303  },
304  {
305    getComponent() {
306      return optionalRequire(() => require('../screens/NotificationScreen'));
307    },
308    name: 'Notification',
309  },
310  {
311    getComponent() {
312      return optionalRequire(() => require('../screens/LocalAuthenticationScreen'));
313    },
314    name: 'LocalAuthentication',
315  },
316  {
317    getComponent() {
318      return optionalRequire(() => require('../screens/Location/LocationScreen'));
319    },
320    name: 'Location',
321  },
322  {
323    getComponent() {
324      return optionalRequire(() => require('../screens/Location/GeocodingScreen'));
325    },
326    name: 'Geocoding',
327  },
328  {
329    getComponent() {
330      return optionalRequire(() => require('../screens/Location/GeofencingScreen'));
331    },
332    name: 'Geofencing',
333    options: { title: 'Geofencing Map' },
334  },
335  {
336    getComponent() {
337      return optionalRequire(() => require('../screens/PedometerScreen'));
338    },
339    name: 'Pedometer',
340  },
341  {
342    getComponent() {
343      return optionalRequire(() => require('../screens/PermissionsScreen'));
344    },
345    name: 'Permissions',
346  },
347  {
348    getComponent() {
349      return optionalRequire(() => require('../screens/PrintScreen'));
350    },
351    name: 'Print',
352  },
353  {
354    getComponent() {
355      return optionalRequire(() => require('../screens/AV/RecordingScreen'));
356    },
357    name: 'Recording',
358    options: { title: 'Audio Recording' },
359  },
360  {
361    getComponent() {
362      return optionalRequire(() => require('../screens/RandomScreen'));
363    },
364    name: 'Random',
365  },
366  {
367    getComponent() {
368      return optionalRequire(() => require('../screens/RemindersScreen'));
369    },
370    name: 'Reminders',
371  },
372  {
373    getComponent() {
374      return optionalRequire(() => require('../screens/SafeAreaContextScreen'));
375    },
376    name: 'SafeAreaContext',
377  },
378  {
379    getComponent() {
380      return optionalRequire(() => require('../screens/ScreenOrientationScreen'));
381    },
382    name: 'ScreenOrientation',
383  },
384  {
385    getComponent() {
386      return optionalRequire(() => require('../screens/SecureStoreScreen'));
387    },
388    name: 'SecureStore',
389  },
390  {
391    getComponent() {
392      return optionalRequire(() => require('../screens/ScreenCaptureScreen'));
393    },
394    name: 'ScreenCapture',
395  },
396  {
397    getComponent() {
398      return optionalRequire(() => require('../screens/SensorScreen'));
399    },
400    name: 'Sensor',
401  },
402  {
403    getComponent() {
404      return optionalRequire(() => require('../screens/SharingScreen'));
405    },
406    name: 'Sharing',
407  },
408  {
409    getComponent() {
410      return optionalRequire(() => require('../screens/NavigationBarScreen'));
411    },
412    name: 'NavigationBar',
413  },
414  {
415    getComponent() {
416      return optionalRequire(() => require('../screens/SystemUIScreen'));
417    },
418    name: 'SystemUI',
419  },
420  {
421    getComponent() {
422      return optionalRequire(() => require('../screens/SMSScreen'));
423    },
424    name: 'SMS',
425  },
426  {
427    getComponent() {
428      return optionalRequire(() => require('../screens/StoreReview'));
429    },
430    name: 'StoreReview',
431    options: { title: 'Store Review' },
432  },
433  {
434    getComponent() {
435      return optionalRequire(() => require('../screens/TaskManagerScreen'));
436    },
437    name: 'TaskManager',
438  },
439  {
440    getComponent() {
441      return optionalRequire(() => require('../screens/TextToSpeechScreen'));
442    },
443    name: 'TextToSpeech',
444    options: { title: 'Speech' },
445  },
446  {
447    getComponent() {
448      return optionalRequire(() => require('../screens/TrackingTransparencyScreen'));
449    },
450    name: 'TrackingTransparency',
451    options: { title: 'TrackingTransparency' },
452  },
453  {
454    getComponent() {
455      return optionalRequire(() => require('../screens/WebBrowser/WebBrowserScreen'));
456    },
457    name: 'WebBrowser',
458  },
459  {
460    getComponent() {
461      return optionalRequire(() => require('../screens/ViewShotScreen'));
462    },
463    name: 'ViewShot',
464  },
465];
466
467function ExpoApisStackNavigator(props: { navigation: BottomTabNavigationProp<any> }) {
468  return (
469    <Stack.Navigator {...props} {...getStackConfig(props)}>
470      <Stack.Screen name="ExpoApis" options={{ title: 'APIs in Expo SDK' }} component={ExpoApis} />
471
472      {Screens.map(({ name, options, getComponent }) => (
473        <Stack.Screen name={name} key={name} getComponent={getComponent} options={options || {}} />
474      ))}
475    </Stack.Navigator>
476  );
477}
478const icon = ({ focused }: { focused: boolean }) => {
479  return <TabIcon name="code-tags" focused={focused} />;
480};
481ExpoApisStackNavigator.navigationOptions = {
482  title: 'APIs',
483  tabBarLabel: 'APIs',
484  tabBarIcon: icon,
485  drawerIcon: icon,
486};
487
488export default ExpoApisStackNavigator;
489