/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format * @flow */ 'use strict'; const React = require('react'); const { AppRegistry, AsyncStorage, BackHandler, Dimensions, DrawerLayoutAndroid, Linking, StatusBar, StyleSheet, ToolbarAndroid, UIManager, View, } = require('react-native'); const RNTesterActions = require('./RNTesterActions'); const RNTesterExampleContainer = require('./RNTesterExampleContainer'); const RNTesterExampleList = require('./RNTesterExampleList'); /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found when * making Flow check .android.js files. */ const RNTesterList = require('./RNTesterList'); const RNTesterNavigationReducer = require('./RNTesterNavigationReducer'); const URIActionMap = require('./URIActionMap'); const nativeImageSource = require('../../Libraries/Image/nativeImageSource'); import type {RNTesterNavigationState} from './RNTesterNavigationReducer'; UIManager.setLayoutAnimationEnabledExperimental(true); const DRAWER_WIDTH_LEFT = 56; type Props = { exampleFromAppetizeParams: string, }; const APP_STATE_KEY = 'RNTesterAppState.v2'; const HEADER_LOGO_ICON = nativeImageSource({ android: 'launcher_icon', width: 132, height: 144, }); const HEADER_NAV_ICON = nativeImageSource({ android: 'ic_menu_black_24dp', width: 48, height: 48, }); class RNTesterApp extends React.Component { UNSAFE_componentWillMount() { BackHandler.addEventListener( 'hardwareBackPress', this._handleBackButtonPress, ); } componentDidMount() { Linking.getInitialURL().then(url => { AsyncStorage.getItem(APP_STATE_KEY, (err, storedString) => { const exampleAction = URIActionMap( this.props.exampleFromAppetizeParams, ); const urlAction = URIActionMap(url); const launchAction = exampleAction || urlAction; if (err || !storedString) { const initialAction = launchAction || {type: 'InitialAction'}; this.setState(RNTesterNavigationReducer(null, initialAction)); return; } const storedState = JSON.parse(storedString); if (launchAction) { this.setState(RNTesterNavigationReducer(storedState, launchAction)); return; } this.setState(storedState); }); }); } render() { if (!this.state) { return null; } return ( { /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was * found when making Flow check .android.js files. */ this._overrideBackPressForDrawerLayout = true; }} onDrawerClose={() => { /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was * found when making Flow check .android.js files. */ this._overrideBackPressForDrawerLayout = false; }} ref={drawer => { /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was * found when making Flow check .android.js files. */ this.drawer = drawer; }} renderNavigationView={this._renderDrawerContent} statusBarBackgroundColor="#589c90"> {this._renderApp()} ); } _renderDrawerContent = () => { return ( ); }; _renderApp() { const {openExample} = this.state; if (openExample) { const ExampleModule = RNTesterList.Modules[openExample]; if (ExampleModule.external) { return ( { this._handleAction(RNTesterActions.Back()); }} ref={example => { /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue * was found when making Flow check .android.js files. */ this._exampleRef = example; }} /> ); } else if (ExampleModule) { return ( =0.78.0 site=react_native_android_fb) This issue * was found when making Flow check .android.js files. */ onIconClicked={() => this.drawer.openDrawer()} style={styles.toolbar} title={ExampleModule.title} /> { /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue * was found when making Flow check .android.js files. */ this._exampleRef = example; }} /> ); } } return ( =0.78.0 site=react_native_android_fb) This issue was * found when making Flow check .android.js files. */ onIconClicked={() => this.drawer.openDrawer()} style={styles.toolbar} title="RNTester" /> ); } _handleAction = (action: Object): boolean => { /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found * when making Flow check .android.js files. */ this.drawer && this.drawer.closeDrawer(); const newState = RNTesterNavigationReducer(this.state, action); if (this.state !== newState) { this.setState(newState, () => AsyncStorage.setItem(APP_STATE_KEY, JSON.stringify(this.state)), ); return true; } return false; }; _handleBackButtonPress = () => { /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found * when making Flow check .android.js files. */ if (this._overrideBackPressForDrawerLayout) { // This hack is necessary because drawer layout provides an imperative API // with open and close methods. This code would be cleaner if the drawer // layout provided an `isOpen` prop and allowed us to pass a `onDrawerClose` handler. /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found * when making Flow check .android.js files. */ this.drawer && this.drawer.closeDrawer(); return true; } if ( /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found * when making Flow check .android.js files. */ this._exampleRef && this._exampleRef.handleBackAction && /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found * when making Flow check .android.js files. */ this._exampleRef.handleBackAction() ) { return true; } return this._handleAction(RNTesterActions.Back()); }; } const styles = StyleSheet.create({ container: { flex: 1, }, toolbar: { backgroundColor: '#E9EAED', height: 56, }, drawerContentWrapper: { flex: 1, paddingTop: StatusBar.currentHeight, backgroundColor: 'white', }, }); AppRegistry.registerComponent('RNTesterApp', () => RNTesterApp); module.exports = RNTesterApp;