/** * The examples provided by Facebook are for non-commercial testing and * evaluation purposes only. * * Facebook reserves all rights not expressly granted. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * @flow */ 'use strict'; var React = require('react'); var ReactNative = require('react-native'); var { PixelRatio, Image, StyleSheet, Text, TouchableHighlight, TouchableOpacity, UIManager, Platform, TouchableNativeFeedback, View, } = ReactNative; exports.displayName = (undefined: ?string); exports.description = 'Touchable and onPress examples.'; exports.title = ' and onPress'; exports.examples = [ { title: '', description: 'TouchableHighlight works by adding an extra view with a ' + 'black background under the single child view. This works best when the ' + 'child view is fully opaque, although it can be made to work as a simple ' + 'background color change as well with the activeOpacity and ' + 'underlayColor props.', render: function() { return ( console.log('stock THW image - highlight')}> console.log('custom THW text - highlight')}> Tap Here For Custom Highlight! ); }, }, { title: ' with highlight', render: function(): ReactElement { return ; }, }, { title: 'Touchable feedback events', description: ' components accept onPress, onPressIn, ' + 'onPressOut, and onLongPress as props.', render: function(): ReactElement { return ; }, }, { title: 'Touchable delay for events', description: ' components also accept delayPressIn, ' + 'delayPressOut, and delayLongPress as props. These props impact the ' + 'timing of feedback events.', render: function(): ReactElement { return ; }, }, { title: '3D Touch / Force Touch', description: 'iPhone 6s and 6s plus support 3D touch, which adds a force property to touches', render: function(): ReactElement { return ; }, platform: 'ios', }, { title: 'Touchable Hit Slop', description: ' components accept hitSlop prop which extends the touch area ' + 'without changing the view bounds.', render: function(): ReactElement { return ; }, }, { title: 'Disabled Touchable*', description: ' components accept disabled prop which prevents ' + 'any interaction with component', render: function(): ReactElement { return ; }, }]; var TextOnPressBox = React.createClass({ getInitialState: function() { return { timesPressed: 0, }; }, textOnPress: function() { this.setState({ timesPressed: this.state.timesPressed + 1, }); }, render: function() { var textLog = ''; if (this.state.timesPressed > 1) { textLog = this.state.timesPressed + 'x text onPress'; } else if (this.state.timesPressed > 0) { textLog = 'text onPress'; } return ( Text has built-in onPress handling {textLog} ); } }); var TouchableFeedbackEvents = React.createClass({ getInitialState: function() { return { eventLog: [], }; }, render: function() { return ( this._appendEvent('press')} onPressIn={() => this._appendEvent('pressIn')} onPressOut={() => this._appendEvent('pressOut')} onLongPress={() => this._appendEvent('longPress')}> Press Me {this.state.eventLog.map((e, ii) => {e})} ); }, _appendEvent: function(eventName) { var limit = 6; var eventLog = this.state.eventLog.slice(0, limit - 1); eventLog.unshift(eventName); this.setState({eventLog}); }, }); var TouchableDelayEvents = React.createClass({ getInitialState: function() { return { eventLog: [], }; }, render: function() { return ( this._appendEvent('press')} delayPressIn={400} onPressIn={() => this._appendEvent('pressIn - 400ms delay')} delayPressOut={1000} onPressOut={() => this._appendEvent('pressOut - 1000ms delay')} delayLongPress={800} onLongPress={() => this._appendEvent('longPress - 800ms delay')}> Press Me {this.state.eventLog.map((e, ii) => {e})} ); }, _appendEvent: function(eventName) { var limit = 6; var eventLog = this.state.eventLog.slice(0, limit - 1); eventLog.unshift(eventName); this.setState({eventLog}); }, }); var ForceTouchExample = React.createClass({ getInitialState: function() { return { force: 0, }; }, _renderConsoleText: function() { return View.forceTouchAvailable ? 'Force: ' + this.state.force.toFixed(3) : '3D Touch is not available on this device'; }, render: function() { return ( {this._renderConsoleText()} true} onResponderMove={(event) => this.setState({force: event.nativeEvent.force})} onResponderRelease={(event) => this.setState({force: 0})}> Press Me ); }, }); var TouchableHitSlop = React.createClass({ getInitialState: function() { return { timesPressed: 0, }; }, onPress: function() { this.setState({ timesPressed: this.state.timesPressed + 1, }); }, render: function() { var log = ''; if (this.state.timesPressed > 1) { log = this.state.timesPressed + 'x onPress'; } else if (this.state.timesPressed > 0) { log = 'onPress'; } return ( Press Outside This View {log} ); } }); var TouchableDisabled = React.createClass({ render: function() { return ( Disabled TouchableOpacity Enabled TouchableOpacity console.log('custom THW text - highlight')}> Disabled TouchableHighlight console.log('custom THW text - highlight')}> Disabled TouchableHighlight {Platform.OS === 'android' && console.log('custom TNF has been clicked')} background={TouchableNativeFeedback.SelectableBackground()}> Enabled TouchableNativeFeedback } {Platform.OS === 'android' && console.log('custom TNF has been clicked')} background={TouchableNativeFeedback.SelectableBackground()}> Disabled TouchableNativeFeedback } ); } }); var heartImage = {uri: 'https://pbs.twimg.com/media/BlXBfT3CQAA6cVZ.png:small'}; var styles = StyleSheet.create({ row: { justifyContent: 'center', flexDirection: 'row', }, icon: { width: 24, height: 24, }, image: { width: 50, height: 50, }, text: { fontSize: 16, }, block: { padding: 10, }, button: { color: '#007AFF', }, disabledButton: { color: '#007AFF', opacity: 0.5, }, nativeFeedbackButton: { textAlign: 'center', margin: 10, }, hitSlopButton: { color: 'white', }, wrapper: { borderRadius: 8, }, wrapperCustom: { borderRadius: 8, padding: 6, }, hitSlopWrapper: { backgroundColor: 'red', marginVertical: 30, }, logBox: { padding: 20, margin: 10, borderWidth: StyleSheet.hairlineWidth, borderColor: '#f0f0f0', backgroundColor: '#f9f9f9', }, eventLogBox: { padding: 10, margin: 10, height: 120, borderWidth: StyleSheet.hairlineWidth, borderColor: '#f0f0f0', backgroundColor: '#f9f9f9', }, forceTouchBox: { padding: 10, margin: 10, borderWidth: StyleSheet.hairlineWidth, borderColor: '#f0f0f0', backgroundColor: '#f9f9f9', alignItems: 'center', }, textBlock: { fontWeight: '500', color: 'blue', }, });