mirror of
https://github.com/status-im/react-native.git
synced 2025-02-23 22:58:19 +00:00
Summary: Previously the RNTester app saved what screen you were on and what filter text was entered into the initial screen. This made e2e testing complex, as each test needed to manually restore the state to the home screen. If the state ever got out of sync with the test's expectations, it could lead to multiple failed tests. There is still one specific component that uses persistence: `RNTesterSettingSwitchRow`. Persistence can be removed from this component next time tests for it are updated. As a result, `RNTesterStatePersister` is not yet entirely removed from the app. Pull Request resolved: https://github.com/facebook/react-native/pull/22596 Differential Revision: D13413457 Pulled By: cpojer fbshipit-source-id: 3faa26a94139397b4bce6b62ff43e9c2f870b145
188 lines
4.9 KiB
JavaScript
188 lines
4.9 KiB
JavaScript
/**
|
|
* 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 AsyncStorage = require('AsyncStorage');
|
|
const BackHandler = require('BackHandler');
|
|
const Linking = require('Linking');
|
|
const React = require('react');
|
|
const ReactNative = require('react-native');
|
|
const RNTesterActions = require('./RNTesterActions');
|
|
const RNTesterExampleContainer = require('./RNTesterExampleContainer');
|
|
const RNTesterExampleList = require('./RNTesterExampleList');
|
|
const RNTesterList = require('./RNTesterList.ios');
|
|
const RNTesterNavigationReducer = require('./RNTesterNavigationReducer');
|
|
const URIActionMap = require('./URIActionMap');
|
|
|
|
const {
|
|
Button,
|
|
AppRegistry,
|
|
SnapshotViewIOS,
|
|
StyleSheet,
|
|
Text,
|
|
View,
|
|
SafeAreaView,
|
|
} = ReactNative;
|
|
|
|
import type {RNTesterExample} from './RNTesterList.ios';
|
|
import type {RNTesterAction} from './RNTesterActions';
|
|
import type {RNTesterNavigationState} from './RNTesterNavigationReducer';
|
|
|
|
type Props = {
|
|
exampleFromAppetizeParams: string,
|
|
};
|
|
|
|
const APP_STATE_KEY = 'RNTesterAppState.v2';
|
|
|
|
const Header = ({onBack, title}: {onBack?: () => mixed, title: string}) => (
|
|
<SafeAreaView style={styles.headerContainer}>
|
|
<View style={styles.header}>
|
|
<View style={styles.headerCenter}>
|
|
<Text style={styles.title}>{title}</Text>
|
|
</View>
|
|
{onBack && (
|
|
<View style={styles.headerLeft}>
|
|
<Button title="Back" onPress={onBack} />
|
|
</View>
|
|
)}
|
|
</View>
|
|
</SafeAreaView>
|
|
);
|
|
|
|
class RNTesterApp extends React.Component<Props, RNTesterNavigationState> {
|
|
UNSAFE_componentWillMount() {
|
|
BackHandler.addEventListener('hardwareBackPress', this._handleBack);
|
|
}
|
|
|
|
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;
|
|
const initialAction = launchAction || {type: 'InitialAction'};
|
|
this.setState(RNTesterNavigationReducer(undefined, initialAction));
|
|
});
|
|
});
|
|
|
|
Linking.addEventListener('url', url => {
|
|
this._handleAction(URIActionMap(url));
|
|
});
|
|
}
|
|
|
|
_handleBack = () => {
|
|
this._handleAction(RNTesterActions.Back());
|
|
};
|
|
|
|
_handleAction = (action: ?RNTesterAction) => {
|
|
if (!action) {
|
|
return;
|
|
}
|
|
const newState = RNTesterNavigationReducer(this.state, action);
|
|
if (this.state !== newState) {
|
|
this.setState(newState, () =>
|
|
AsyncStorage.setItem(APP_STATE_KEY, JSON.stringify(this.state)),
|
|
);
|
|
}
|
|
};
|
|
|
|
render() {
|
|
if (!this.state) {
|
|
return null;
|
|
}
|
|
if (this.state.openExample) {
|
|
const Component = RNTesterList.Modules[this.state.openExample];
|
|
if (Component.external) {
|
|
return <Component onExampleExit={this._handleBack} />;
|
|
} else {
|
|
return (
|
|
<View style={styles.exampleContainer}>
|
|
<Header onBack={this._handleBack} title={Component.title} />
|
|
<RNTesterExampleContainer module={Component} />
|
|
</View>
|
|
);
|
|
}
|
|
}
|
|
return (
|
|
<View style={styles.exampleContainer}>
|
|
<Header title="RNTester" />
|
|
<RNTesterExampleList
|
|
onNavigate={this._handleAction}
|
|
list={RNTesterList}
|
|
/>
|
|
</View>
|
|
);
|
|
}
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
headerContainer: {
|
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
borderBottomColor: '#96969A',
|
|
backgroundColor: '#F5F5F6',
|
|
},
|
|
header: {
|
|
height: 40,
|
|
flexDirection: 'row',
|
|
},
|
|
headerLeft: {},
|
|
headerCenter: {
|
|
flex: 1,
|
|
position: 'absolute',
|
|
top: 7,
|
|
left: 0,
|
|
right: 0,
|
|
},
|
|
title: {
|
|
fontSize: 19,
|
|
fontWeight: '600',
|
|
textAlign: 'center',
|
|
},
|
|
exampleContainer: {
|
|
flex: 1,
|
|
},
|
|
});
|
|
|
|
AppRegistry.registerComponent('SetPropertiesExampleApp', () =>
|
|
require('./SetPropertiesExampleApp'),
|
|
);
|
|
AppRegistry.registerComponent('RootViewSizeFlexibilityExampleApp', () =>
|
|
require('./RootViewSizeFlexibilityExampleApp'),
|
|
);
|
|
AppRegistry.registerComponent('RNTesterApp', () => RNTesterApp);
|
|
|
|
// Register suitable examples for snapshot tests
|
|
RNTesterList.ComponentExamples.concat(RNTesterList.APIExamples).forEach(
|
|
(Example: RNTesterExample) => {
|
|
const ExampleModule = Example.module;
|
|
if (ExampleModule.displayName) {
|
|
class Snapshotter extends React.Component<{}> {
|
|
render() {
|
|
return (
|
|
<SnapshotViewIOS>
|
|
<RNTesterExampleContainer module={ExampleModule} />
|
|
</SnapshotViewIOS>
|
|
);
|
|
}
|
|
}
|
|
|
|
AppRegistry.registerComponent(
|
|
ExampleModule.displayName,
|
|
() => Snapshotter,
|
|
);
|
|
}
|
|
},
|
|
);
|
|
|
|
module.exports = RNTesterApp;
|