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