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/StatusBarScreen'));
16    },
17    name: 'StatusBar',
18  },
19  {
20    getComponent() {
21      return optionalRequire(() => require('../screens/AlertScreen'));
22    },
23    name: 'Alert',
24  },
25  {
26    getComponent() {
27      return optionalRequire(() => require('../screens/Amplitude/AmplitudeScreen'));
28    },
29    name: 'Amplitude',
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/BranchScreen'));
110    },
111    name: 'Branch',
112  },
113  {
114    getComponent() {
115      return optionalRequire(() => require('../screens/BrightnessScreen'));
116    },
117    name: 'Brightness',
118  },
119  {
120    getComponent() {
121      return optionalRequire(() => require('../screens/DeviceScreen'));
122    },
123    name: 'Device',
124  },
125  {
126    getComponent() {
127      return optionalRequire(() => require('../screens/DocumentPickerScreen'));
128    },
129    name: 'DocumentPicker',
130  },
131  {
132    getComponent() {
133      return optionalRequire(() => require('../screens/LocalizationScreen'));
134    },
135    name: 'Localization',
136  },
137  {
138    getComponent() {
139      return optionalRequire(() => require('../screens/FacebookAppEventsScreen'));
140    },
141    name: 'FacebookAppEvents',
142  },
143  {
144    getComponent() {
145      return optionalRequire(() => require('../screens/FacebookLoginScreen'));
146    },
147    name: 'FacebookLogin',
148  },
149  {
150    getComponent() {
151      return optionalRequire(() => require('../screens/FaceDetectorScreen'));
152    },
153    name: 'FaceDetector',
154  },
155  {
156    getComponent() {
157      return optionalRequire(() => require('../screens/FileSystemScreen'));
158    },
159    name: 'FileSystem',
160  },
161  {
162    getComponent() {
163      return optionalRequire(() => require('../screens/FirebaseRecaptchaScreen'));
164    },
165    name: 'FirebaseRecaptcha',
166  },
167  {
168    getComponent() {
169      return optionalRequire(() => require('../screens/FontScreen'));
170    },
171    name: 'Font',
172  },
173  {
174    getComponent() {
175      return optionalRequire(() => require('../screens/GoogleSignInScreen'));
176    },
177    name: 'GoogleSignIn',
178    options: { title: 'Native Google Sign-In' },
179  },
180  {
181    getComponent() {
182      return optionalRequire(() => require('../screens/HapticsScreen'));
183    },
184    name: 'Haptics',
185    options: { title: 'Haptics Feedback' },
186  },
187  {
188    getComponent() {
189      return optionalRequire(() => require('../screens/CalendarsScreen'));
190    },
191    name: 'Calendars',
192  },
193  {
194    getComponent() {
195      return optionalRequire(() => require('../screens/ConstantsScreen'));
196    },
197    name: 'Constants',
198  },
199  {
200    getComponent() {
201      return optionalRequire(() => require('../screens/Contacts/ContactsScreen'));
202    },
203    name: 'Contacts',
204  },
205  {
206    getComponent() {
207      return optionalRequire(() => require('../screens/Contacts/ContactDetailScreen'));
208    },
209    name: 'ContactDetail',
210  },
211  {
212    getComponent() {
213      return optionalRequire(() => require('../screens/ErrorScreen'));
214    },
215    name: 'Errors',
216  },
217  {
218    getComponent() {
219      return optionalRequire(() => require('../screens/EventsScreen'));
220    },
221    name: 'Events',
222  },
223  {
224    getComponent() {
225      return optionalRequire(() => require('../screens/ImageManipulatorScreen'));
226    },
227    name: 'ImageManipulator',
228  },
229  {
230    getComponent() {
231      return optionalRequire(() => require('../screens/ImagePicker/ImagePickerScreen'));
232    },
233    name: 'ImagePicker',
234  },
235  {
236    getComponent() {
237      return optionalRequire(() => require('../screens/InAppPurchases/InAppPurchases'));
238    },
239    name: 'InAppPurchases',
240    options: { title: 'In-App Purchases' },
241  },
242  {
243    getComponent() {
244      return optionalRequire(() => require('../screens/IntentLauncherScreen'));
245    },
246    name: 'IntentLauncher',
247  },
248  {
249    getComponent() {
250      return optionalRequire(() => require('../screens/KeepAwakeScreen'));
251    },
252    name: 'KeepAwake',
253  },
254  {
255    getComponent() {
256      return optionalRequire(() => require('../screens/LinkingScreen'));
257    },
258    name: 'Linking',
259  },
260  {
261    getComponent() {
262      return optionalRequire(() => require('../screens/MailComposerScreen'));
263    },
264    name: 'MailComposer',
265  },
266  {
267    getComponent() {
268      return optionalRequire(() => require('../screens/MediaLibrary/MediaLibraryScreen'));
269    },
270    name: 'MediaLibrary',
271  },
272  {
273    getComponent() {
274      return optionalRequire(() => require('../screens/MediaLibrary/MediaAlbumsScreen'));
275    },
276    name: 'MediaAlbums',
277    options: { title: 'MediaLibrary Albums' },
278  },
279  {
280    getComponent() {
281      return optionalRequire(() => require('../screens/MediaLibrary/MediaDetailsScreen'));
282    },
283    name: 'MediaDetails',
284    options: { title: 'MediaLibrary Asset' },
285  },
286  {
287    getComponent() {
288      return optionalRequire(() => require('../screens/NetInfoScreen'));
289    },
290    name: 'NetInfo',
291  },
292  {
293    getComponent() {
294      return optionalRequire(() => require('../screens/NetworkScreen'));
295    },
296    name: 'Network',
297  },
298  {
299    getComponent() {
300      return optionalRequire(() => require('../screens/NotificationScreen'));
301    },
302    name: 'Notification',
303  },
304  {
305    getComponent() {
306      return optionalRequire(() => require('../screens/LocalAuthenticationScreen'));
307    },
308    name: 'LocalAuthentication',
309  },
310  {
311    getComponent() {
312      return optionalRequire(() => require('../screens/Location/LocationScreen'));
313    },
314    name: 'Location',
315  },
316  {
317    getComponent() {
318      return optionalRequire(() => require('../screens/Location/GeocodingScreen'));
319    },
320    name: 'Geocoding',
321  },
322  {
323    getComponent() {
324      return optionalRequire(() => require('../screens/Location/GeofencingScreen'));
325    },
326    name: 'Geofencing',
327    options: { title: 'Geofencing Map' },
328  },
329  {
330    getComponent() {
331      return optionalRequire(() => require('../screens/PedometerScreen'));
332    },
333    name: 'Pedometer',
334  },
335  {
336    getComponent() {
337      return optionalRequire(() => require('../screens/PermissionsScreen'));
338    },
339    name: 'Permissions',
340  },
341  {
342    getComponent() {
343      return optionalRequire(() => require('../screens/PrintScreen'));
344    },
345    name: 'Print',
346  },
347  {
348    getComponent() {
349      return optionalRequire(() => require('../screens/AV/RecordingScreen'));
350    },
351    name: 'Recording',
352    options: { title: 'Audio Recording' },
353  },
354  {
355    getComponent() {
356      return optionalRequire(() => require('../screens/RandomScreen'));
357    },
358    name: 'Random',
359  },
360  {
361    getComponent() {
362      return optionalRequire(() => require('../screens/RemindersScreen'));
363    },
364    name: 'Reminders',
365  },
366  {
367    getComponent() {
368      return optionalRequire(() => require('../screens/SafeAreaContextScreen'));
369    },
370    name: 'SafeAreaContext',
371  },
372  {
373    getComponent() {
374      return optionalRequire(() => require('../screens/ScreenOrientationScreen'));
375    },
376    name: 'ScreenOrientation',
377  },
378  {
379    getComponent() {
380      return optionalRequire(() => require('../screens/SecureStoreScreen'));
381    },
382    name: 'SecureStore',
383  },
384  {
385    getComponent() {
386      return optionalRequire(() => require('../screens/ScreenCaptureScreen'));
387    },
388    name: 'ScreenCapture',
389  },
390  {
391    getComponent() {
392      return optionalRequire(() => require('../screens/SensorScreen'));
393    },
394    name: 'Sensor',
395  },
396  {
397    getComponent() {
398      return optionalRequire(() => require('../screens/SharingScreen'));
399    },
400    name: 'Sharing',
401  },
402  {
403    getComponent() {
404      return optionalRequire(() => require('../screens/NavigationBarScreen'));
405    },
406    name: 'NavigationBar',
407  },
408  {
409    getComponent() {
410      return optionalRequire(() => require('../screens/SystemUIScreen'));
411    },
412    name: 'SystemUI',
413  },
414  {
415    getComponent() {
416      return optionalRequire(() => require('../screens/SMSScreen'));
417    },
418    name: 'SMS',
419  },
420  {
421    getComponent() {
422      return optionalRequire(() => require('../screens/StoreReview'));
423    },
424    name: 'StoreReview',
425    options: { title: 'Store Review' },
426  },
427  {
428    getComponent() {
429      return optionalRequire(() => require('../screens/TaskManagerScreen'));
430    },
431    name: 'TaskManager',
432  },
433  {
434    getComponent() {
435      return optionalRequire(() => require('../screens/TextToSpeechScreen'));
436    },
437    name: 'TextToSpeech',
438    options: { title: 'Speech' },
439  },
440  {
441    getComponent() {
442      return optionalRequire(() => require('../screens/TrackingTransparencyScreen'));
443    },
444    name: 'TrackingTransparency',
445    options: { title: 'TrackingTransparency' },
446  },
447  {
448    getComponent() {
449      return optionalRequire(() => require('../screens/WebBrowser/WebBrowserScreen'));
450    },
451    name: 'WebBrowser',
452  },
453  {
454    getComponent() {
455      return optionalRequire(() => require('../screens/ViewShotScreen'));
456    },
457    name: 'ViewShot',
458  },
459];
460
461function ExpoApisStackNavigator(props: { navigation: BottomTabNavigationProp<any> }) {
462  return (
463    <Stack.Navigator {...props} {...getStackConfig(props)}>
464      <Stack.Screen name="ExpoApis" options={{ title: 'APIs in Expo SDK' }} component={ExpoApis} />
465
466      {Screens.map(({ name, options, getComponent }) => (
467        <Stack.Screen name={name} key={name} getComponent={getComponent} options={options || {}} />
468      ))}
469    </Stack.Navigator>
470  );
471}
472const icon = ({ focused }: { focused: boolean }) => {
473  return <TabIcon name="code-tags" focused={focused} />;
474};
475ExpoApisStackNavigator.navigationOptions = {
476  title: 'APIs',
477  tabBarLabel: 'APIs',
478  tabBarIcon: icon,
479  drawerIcon: icon,
480};
481
482export default ExpoApisStackNavigator;
483