2015-01-30 01:10:49 +00:00
/ * *
2017-05-06 03:50:47 +00:00
* Copyright ( c ) 2015 - present , Facebook , Inc .
2016-07-12 12:51:57 +00:00
* 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 .
*
2015-03-23 22:07:33 +00:00
* @ flow
2017-02-25 11:05:32 +00:00
* @ providesModule PointerEventsExample
2015-01-30 01:10:49 +00:00
* /
'use strict' ;
2016-04-09 03:36:40 +00:00
var React = require ( 'react' ) ;
var ReactNative = require ( 'react-native' ) ;
2015-01-30 01:10:49 +00:00
var {
StyleSheet ,
Text ,
View ,
2016-04-09 03:36:40 +00:00
} = ReactNative ;
2015-01-30 01:10:49 +00:00
2017-08-18 01:36:54 +00:00
class ExampleBox extends React . Component < $FlowFixMeProps , $FlowFixMeState > {
2016-07-26 08:00:02 +00:00
state = {
log : [ ] ,
} ;
handleLog = ( msg ) => {
2015-01-30 01:10:49 +00:00
this . state . log = this . state . log . concat ( [ msg ] ) ;
2016-07-26 08:00:02 +00:00
} ;
flushReactChanges = ( ) => {
2015-01-30 01:10:49 +00:00
this . forceUpdate ( ) ;
2016-07-26 08:00:02 +00:00
} ;
2015-01-30 01:10:49 +00:00
/ * *
* Capture phase of bubbling to append separator before any of the bubbling
* happens .
* /
2016-07-26 08:00:02 +00:00
handleTouchCapture = ( ) => {
2015-01-30 01:10:49 +00:00
this . state . log = this . state . log . concat ( [ '---' ] ) ;
2016-07-26 08:00:02 +00:00
} ;
render ( ) {
2015-01-30 01:10:49 +00:00
return (
< View >
< View
onTouchEndCapture = { this . handleTouchCapture }
onTouchStart = { this . flushReactChanges } >
2017-08-29 21:54:33 +00:00
{ / * $ F l o w F i x M e ( > = 0 . 5 3 . 0 s i t e = r e a c t _ n a t i v e _ f b , r e a c t _ n a t i v e _ o s s ) T h i s
* comment suppresses an error when upgrading Flow ' s support for
* React . To see the error delete this comment and run Flow . * / }
2015-01-30 01:10:49 +00:00
< this . props . Component onLog = { this . handleLog } / >
< / V i e w >
< View
style = { styles . logBox } >
< DemoText style = { styles . logText } >
{ this . state . log . join ( '\n' ) }
< / D e m o T e x t >
< / V i e w >
< / V i e w >
) ;
}
2016-07-26 08:00:02 +00:00
}
2015-01-30 01:10:49 +00:00
2017-08-18 01:36:54 +00:00
class NoneExample extends React . Component < $FlowFixMeProps > {
2016-07-26 08:00:02 +00:00
render ( ) {
2015-01-30 01:10:49 +00:00
return (
< View
onTouchStart = { ( ) => this . props . onLog ( 'A unspecified touched' ) }
style = { styles . box } >
< DemoText style = { styles . text } >
A : unspecified
< / D e m o T e x t >
< View
2015-03-05 05:06:49 +00:00
pointerEvents = "none"
2015-01-30 01:10:49 +00:00
onTouchStart = { ( ) => this . props . onLog ( 'B none touched' ) }
style = { [ styles . box , styles . boxPassedThrough ] } >
< DemoText style = { [ styles . text , styles . textPassedThrough ] } >
B : none
< / D e m o T e x t >
< View
onTouchStart = { ( ) => this . props . onLog ( 'C unspecified touched' ) }
style = { [ styles . box , styles . boxPassedThrough ] } >
< DemoText style = { [ styles . text , styles . textPassedThrough ] } >
C : unspecified
< / D e m o T e x t >
< / V i e w >
< / V i e w >
< / V i e w >
) ;
}
2016-07-26 08:00:02 +00:00
}
2015-01-30 01:10:49 +00:00
/ * *
* Special demo text that makes itself untouchable so that it doesn ' t destroy
* the experiment and confuse the output .
* /
2017-08-18 01:36:54 +00:00
class DemoText extends React . Component < $FlowFixMeProps > {
2016-07-26 08:00:02 +00:00
render ( ) {
2015-01-30 01:10:49 +00:00
return (
2015-03-05 05:06:49 +00:00
< View pointerEvents = "none" >
2015-01-30 01:10:49 +00:00
< Text
style = { this . props . style } >
{ this . props . children }
< / T e x t >
< / V i e w >
) ;
}
2016-07-26 08:00:02 +00:00
}
2015-01-30 01:10:49 +00:00
2017-08-18 01:36:54 +00:00
class BoxNoneExample extends React . Component < $FlowFixMeProps > {
2016-07-26 08:00:02 +00:00
render ( ) {
2015-01-30 01:10:49 +00:00
return (
< View
onTouchStart = { ( ) => this . props . onLog ( 'A unspecified touched' ) }
style = { styles . box } >
< DemoText style = { styles . text } >
A : unspecified
< / D e m o T e x t >
< View
2015-03-05 05:06:49 +00:00
pointerEvents = "box-none"
onTouchStart = { ( ) => this . props . onLog ( 'B box-none touched' ) }
2015-01-30 01:10:49 +00:00
style = { [ styles . box , styles . boxPassedThrough ] } >
< DemoText style = { [ styles . text , styles . textPassedThrough ] } >
2015-03-05 05:06:49 +00:00
B : box - none
2015-01-30 01:10:49 +00:00
< / D e m o T e x t >
< View
onTouchStart = { ( ) => this . props . onLog ( 'C unspecified touched' ) }
style = { styles . box } >
< DemoText style = { styles . text } >
C : unspecified
< / D e m o T e x t >
< / V i e w >
< View
2015-03-05 05:06:49 +00:00
pointerEvents = "auto"
2015-01-30 01:10:49 +00:00
onTouchStart = { ( ) => this . props . onLog ( 'C explicitly unspecified touched' ) }
style = { [ styles . box ] } >
< DemoText style = { [ styles . text ] } >
C : explicitly unspecified
< / D e m o T e x t >
< / V i e w >
< / V i e w >
< / V i e w >
) ;
}
2016-07-26 08:00:02 +00:00
}
2015-01-30 01:10:49 +00:00
2017-08-18 01:36:54 +00:00
class BoxOnlyExample extends React . Component < $FlowFixMeProps > {
2016-07-26 08:00:02 +00:00
render ( ) {
2015-01-30 01:10:49 +00:00
return (
< View
onTouchStart = { ( ) => this . props . onLog ( 'A unspecified touched' ) }
style = { styles . box } >
< DemoText style = { styles . text } >
A : unspecified
< / D e m o T e x t >
< View
2015-03-05 05:06:49 +00:00
pointerEvents = "box-only"
onTouchStart = { ( ) => this . props . onLog ( 'B box-only touched' ) }
2015-01-30 01:10:49 +00:00
style = { styles . box } >
< DemoText style = { styles . text } >
2015-03-05 05:06:49 +00:00
B : box - only
2015-01-30 01:10:49 +00:00
< / D e m o T e x t >
< View
onTouchStart = { ( ) => this . props . onLog ( 'C unspecified touched' ) }
style = { [ styles . box , styles . boxPassedThrough ] } >
< DemoText style = { [ styles . text , styles . textPassedThrough ] } >
C : unspecified
< / D e m o T e x t >
< / V i e w >
< View
2015-03-05 05:06:49 +00:00
pointerEvents = "auto"
2015-01-30 01:10:49 +00:00
onTouchStart = { ( ) => this . props . onLog ( 'C explicitly unspecified touched' ) }
style = { [ styles . box , styles . boxPassedThrough ] } >
< DemoText style = { [ styles . text , styles . textPassedThrough ] } >
C : explicitly unspecified
< / D e m o T e x t >
< / V i e w >
< / V i e w >
< / V i e w >
) ;
}
2016-07-26 08:00:02 +00:00
}
2015-01-30 01:10:49 +00:00
2015-05-12 21:22:22 +00:00
type ExampleClass = {
2017-08-18 01:36:54 +00:00
Component : React . ComponentType < any > ,
2015-05-12 21:22:22 +00:00
title : string ,
description : string ,
} ;
var exampleClasses : Array < ExampleClass > = [
2015-01-30 01:10:49 +00:00
{
Component : NoneExample ,
title : '`none`' ,
description : '`none` causes touch events on the container and its child components to pass through to the parent container.' ,
} ,
{
Component : BoxNoneExample ,
2015-03-05 05:06:49 +00:00
title : '`box-none`' ,
description : '`box-none` causes touch events on the container to pass through and will only detect touch events on its child components.' ,
2015-01-30 01:10:49 +00:00
} ,
{
Component : BoxOnlyExample ,
2015-03-05 05:06:49 +00:00
title : '`box-only`' ,
description : '`box-only` causes touch events on the container\'s child components to pass through and will only detect touch events on the container itself.' ,
2015-01-30 01:10:49 +00:00
}
] ;
var infoToExample = ( info ) => {
return {
title : info . title ,
description : info . description ,
render : function ( ) {
return < ExampleBox key = { info . title } Component = { info . Component } / > ;
} ,
} ;
} ;
var styles = StyleSheet . create ( {
text : {
fontSize : 10 ,
color : '#5577cc' ,
} ,
textPassedThrough : {
color : '#88aadd' ,
} ,
box : {
backgroundColor : '#aaccff' ,
borderWidth : 1 ,
borderColor : '#7799cc' ,
padding : 10 ,
margin : 5 ,
} ,
boxPassedThrough : {
borderColor : '#99bbee' ,
} ,
logText : {
fontSize : 9 ,
} ,
logBox : {
padding : 20 ,
margin : 10 ,
borderWidth : 0.5 ,
borderColor : '#f0f0f0' ,
backgroundColor : '#f9f9f9' ,
} ,
bottomSpacer : {
marginBottom : 100 ,
} ,
} ) ;
exports . framework = 'React' ;
exports . title = 'Pointer Events' ;
2015-09-15 21:46:54 +00:00
exports . description = 'Demonstrates the use of the pointerEvents prop of a ' +
'View to control how touches should be handled.' ;
2015-01-30 01:10:49 +00:00
exports . examples = exampleClasses . map ( infoToExample ) ;