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