mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 01:25:39 +00:00
70558b9e70
Summary: As a new user it took me a while to figure out you can import these examples directly. The import statement completes the example for new users like me who have no idea these components can be imported. It is a very important piece of information and it is hard to find otherwise. I think this should be added to all the other component examples as well. Documentation only. Closes https://github.com/facebook/react-native/pull/15501 Differential Revision: D5882436 Pulled By: hramos fbshipit-source-id: 2da0fe4c7c41e2fdb6b13a945460e17e16442d62
178 lines
4.7 KiB
JavaScript
178 lines
4.7 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @providesModule Button
|
|
* @flow
|
|
*/
|
|
'use strict';
|
|
|
|
const ColorPropType = require('ColorPropType');
|
|
const Platform = require('Platform');
|
|
const React = require('React');
|
|
const PropTypes = require('prop-types');
|
|
const StyleSheet = require('StyleSheet');
|
|
const Text = require('Text');
|
|
const TouchableNativeFeedback = require('TouchableNativeFeedback');
|
|
const TouchableOpacity = require('TouchableOpacity');
|
|
const View = require('View');
|
|
|
|
const invariant = require('fbjs/lib/invariant');
|
|
|
|
/**
|
|
* A basic button component that should render nicely on any platform. Supports
|
|
* a minimal level of customization.
|
|
*
|
|
* <center><img src="img/buttonExample.png"></img></center>
|
|
*
|
|
* If this button doesn't look right for your app, you can build your own
|
|
* button using [TouchableOpacity](docs/touchableopacity.html)
|
|
* or [TouchableNativeFeedback](docs/touchablenativefeedback.html).
|
|
* For inspiration, look at the [source code for this button component](https://github.com/facebook/react-native/blob/master/Libraries/Components/Button.js).
|
|
* Or, take a look at the [wide variety of button components built by the community](https://js.coach/react-native?search=button).
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```
|
|
* import { Button } from 'react-native';
|
|
* ...
|
|
*
|
|
* <Button
|
|
* onPress={onPressLearnMore}
|
|
* title="Learn More"
|
|
* color="#841584"
|
|
* accessibilityLabel="Learn more about this purple button"
|
|
* />
|
|
* ```
|
|
*
|
|
*/
|
|
|
|
class Button extends React.Component<{
|
|
title: string,
|
|
onPress: () => any,
|
|
color?: ?string,
|
|
accessibilityLabel?: ?string,
|
|
disabled?: ?boolean,
|
|
testID?: ?string,
|
|
}> {
|
|
static propTypes = {
|
|
/**
|
|
* Text to display inside the button
|
|
*/
|
|
title: PropTypes.string.isRequired,
|
|
/**
|
|
* Text to display for blindness accessibility features
|
|
*/
|
|
accessibilityLabel: PropTypes.string,
|
|
/**
|
|
* Color of the text (iOS), or background color of the button (Android)
|
|
*/
|
|
color: ColorPropType,
|
|
/**
|
|
* If true, disable all interactions for this component.
|
|
*/
|
|
disabled: PropTypes.bool,
|
|
/**
|
|
* Handler to be called when the user taps the button
|
|
*/
|
|
onPress: PropTypes.func.isRequired,
|
|
/**
|
|
* Used to locate this view in end-to-end tests.
|
|
*/
|
|
testID: PropTypes.string,
|
|
};
|
|
|
|
render() {
|
|
const {
|
|
accessibilityLabel,
|
|
color,
|
|
onPress,
|
|
title,
|
|
disabled,
|
|
testID,
|
|
} = this.props;
|
|
const buttonStyles = [styles.button];
|
|
const textStyles = [styles.text];
|
|
if (color) {
|
|
if (Platform.OS === 'ios') {
|
|
textStyles.push({color: color});
|
|
} else {
|
|
buttonStyles.push({backgroundColor: color});
|
|
}
|
|
}
|
|
const accessibilityTraits = ['button'];
|
|
if (disabled) {
|
|
buttonStyles.push(styles.buttonDisabled);
|
|
textStyles.push(styles.textDisabled);
|
|
accessibilityTraits.push('disabled');
|
|
}
|
|
invariant(
|
|
typeof title === 'string',
|
|
'The title prop of a Button must be a string',
|
|
);
|
|
const formattedTitle = Platform.OS === 'android' ? title.toUpperCase() : title;
|
|
const Touchable = Platform.OS === 'android' ? TouchableNativeFeedback : TouchableOpacity;
|
|
return (
|
|
<Touchable
|
|
accessibilityComponentType="button"
|
|
accessibilityLabel={accessibilityLabel}
|
|
accessibilityTraits={accessibilityTraits}
|
|
testID={testID}
|
|
disabled={disabled}
|
|
onPress={onPress}>
|
|
<View style={buttonStyles}>
|
|
<Text style={textStyles} disabled={disabled}>{formattedTitle}</Text>
|
|
</View>
|
|
</Touchable>
|
|
);
|
|
}
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
button: Platform.select({
|
|
ios: {},
|
|
android: {
|
|
elevation: 4,
|
|
// Material design blue from https://material.google.com/style/color.html#color-color-palette
|
|
backgroundColor: '#2196F3',
|
|
borderRadius: 2,
|
|
},
|
|
}),
|
|
text: Platform.select({
|
|
ios: {
|
|
// iOS blue from https://developer.apple.com/ios/human-interface-guidelines/visual-design/color/
|
|
color: '#007AFF',
|
|
textAlign: 'center',
|
|
padding: 8,
|
|
fontSize: 18,
|
|
},
|
|
android: {
|
|
color: 'white',
|
|
textAlign: 'center',
|
|
padding: 8,
|
|
fontWeight: '500',
|
|
},
|
|
}),
|
|
buttonDisabled: Platform.select({
|
|
ios: {},
|
|
android: {
|
|
elevation: 0,
|
|
backgroundColor: '#dfdfdf',
|
|
}
|
|
}),
|
|
textDisabled: Platform.select({
|
|
ios: {
|
|
color: '#cdcdcd',
|
|
},
|
|
android: {
|
|
color: '#a1a1a1',
|
|
}
|
|
}),
|
|
});
|
|
|
|
module.exports = Button;
|