2015-09-14 14:35:58 +00:00
/ * *
2016-07-12 12:51:57 +00:00
* Copyright ( c ) 2013 - 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 .
*
2015-09-14 14:35:58 +00:00
* 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' ;
2016-04-09 03:36:40 +00:00
var React = require ( 'react' ) ;
var ReactNative = require ( 'react-native' ) ;
2015-09-14 14:35:58 +00:00
var {
Text ,
TextInput ,
View ,
StyleSheet ,
2016-04-09 03:36:40 +00:00
} = ReactNative ;
2015-09-14 14:35:58 +00:00
2016-07-26 08:00:02 +00:00
class TextEventsExample extends React . Component {
state = {
curText : '<No Event>' ,
prevText : '<No Event>' ,
prev2Text : '<No Event>' ,
} ;
2015-09-14 14:35:58 +00:00
2016-07-26 08:00:02 +00:00
updateText = ( text ) => {
2015-09-14 14:35:58 +00:00
this . setState ( ( state ) => {
return {
curText : text ,
prevText : state . curText ,
prev2Text : state . prevText ,
} ;
} ) ;
2016-07-26 08:00:02 +00:00
} ;
2015-09-14 14:35:58 +00:00
2016-07-26 08:00:02 +00:00
render ( ) {
2015-09-14 14:35:58 +00:00
return (
< View >
< TextInput
autoCapitalize = "none"
placeholder = "Enter text to see events"
autoCorrect = { false }
onFocus = { ( ) => this . updateText ( 'onFocus' ) }
onBlur = { ( ) => this . updateText ( 'onBlur' ) }
onChange = { ( event ) => this . updateText (
'onChange text: ' + event . nativeEvent . text
) }
onEndEditing = { ( event ) => this . updateText (
'onEndEditing text: ' + event . nativeEvent . text
) }
onSubmitEditing = { ( event ) => this . updateText (
'onSubmitEditing text: ' + event . nativeEvent . text
) }
style = { styles . singleLine }
/ >
< Text style = { styles . eventLabel } >
{ this . state . curText } { '\n' }
( prev : { this . state . prevText } ) { '\n' }
( prev2 : { this . state . prev2Text } )
< / T e x t >
< / V i e w >
) ;
}
2016-07-26 08:00:02 +00:00
}
2015-09-14 14:35:58 +00:00
2016-01-25 13:45:44 +00:00
class AutoExpandingTextInput extends React . Component {
constructor ( props ) {
super ( props ) ;
2016-07-07 15:44:59 +00:00
this . state = {
text : 'React Native enables you to build world-class application experiences on native platforms using a consistent developer experience based on JavaScript and React. The focus of React Native is on developer efficiency across all the platforms you care about — learn once, write anywhere. Facebook uses React Native in multiple production apps and will continue investing in React Native.' ,
height : 0 ,
} ;
2016-01-25 13:45:44 +00:00
}
render ( ) {
return (
< TextInput
{ ... this . props }
multiline = { true }
2016-07-07 15:44:59 +00:00
onContentSizeChange = { ( event ) => {
this . setState ( { height : event . nativeEvent . contentSize . height } ) ;
} }
onChangeText = { ( text ) => {
this . setState ( { text } ) ;
2016-01-25 13:45:44 +00:00
} }
style = { [ styles . default , { height : Math . max ( 35 , this . state . height ) } ] }
value = { this . state . text }
/ >
) ;
}
}
2015-09-14 14:35:58 +00:00
class RewriteExample extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = { text : '' } ;
}
render ( ) {
2015-11-06 21:25:05 +00:00
var limit = 20 ;
var remainder = limit - this . state . text . length ;
var remainderColor = remainder > 5 ? 'blue' : 'red' ;
2015-09-14 14:35:58 +00:00
return (
2015-11-06 21:25:05 +00:00
< View style = { styles . rewriteContainer } >
< TextInput
multiline = { false }
maxLength = { limit }
onChangeText = { ( text ) => {
text = text . replace ( / /g , '_' ) ;
this . setState ( { text } ) ;
} }
style = { styles . default }
value = { this . state . text }
/ >
< Text style = { [ styles . remainder , { color : remainderColor } ] } >
{ remainder }
< / T e x t >
< / V i e w >
2015-09-14 14:35:58 +00:00
) ;
}
}
2015-11-06 16:22:22 +00:00
class TokenizedTextExample extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = { text : 'Hello #World' } ;
}
render ( ) {
//define delimiter
let delimiter = /\s+/ ;
//split string
let _text = this . state . text ;
let token , index , parts = [ ] ;
while ( _text ) {
delimiter . lastIndex = 0 ;
token = delimiter . exec ( _text ) ;
if ( token === null ) {
break ;
}
index = token . index ;
if ( token [ 0 ] . length === 0 ) {
index = 1 ;
}
parts . push ( _text . substr ( 0 , index ) ) ;
parts . push ( token [ 0 ] ) ;
index = index + token [ 0 ] . length ;
_text = _text . slice ( index ) ;
}
parts . push ( _text ) ;
//highlight hashtags
parts = parts . map ( ( text ) => {
if ( /^#/ . test ( text ) ) {
return < Text key = { text } style = { styles . hashtag } > { text } < / T e x t > ;
} else {
return text ;
}
} ) ;
return (
< View >
< TextInput
multiline = { true }
style = { styles . multiline }
onChangeText = { ( text ) => {
this . setState ( { text } ) ;
} } >
< Text > { parts } < / T e x t >
< / T e x t I n p u t >
< / V i e w >
) ;
}
}
2016-07-26 08:00:02 +00:00
class BlurOnSubmitExample extends React . Component {
focusNextField = ( nextField ) => {
2016-03-02 15:06:37 +00:00
this . refs [ nextField ] . focus ( ) ;
2016-07-26 08:00:02 +00:00
} ;
2016-03-02 15:06:37 +00:00
2016-07-26 08:00:02 +00:00
render ( ) {
2016-03-02 15:06:37 +00:00
return (
< View >
< TextInput
ref = "1"
style = { styles . singleLine }
placeholder = "blurOnSubmit = false"
returnKeyType = "next"
blurOnSubmit = { false }
onSubmitEditing = { ( ) => this . focusNextField ( '2' ) }
/ >
< TextInput
ref = "2"
style = { styles . singleLine }
keyboardType = "email-address"
placeholder = "blurOnSubmit = false"
returnKeyType = "next"
blurOnSubmit = { false }
onSubmitEditing = { ( ) => this . focusNextField ( '3' ) }
/ >
< TextInput
ref = "3"
style = { styles . singleLine }
keyboardType = "url"
placeholder = "blurOnSubmit = false"
returnKeyType = "next"
blurOnSubmit = { false }
onSubmitEditing = { ( ) => this . focusNextField ( '4' ) }
/ >
< TextInput
ref = "4"
style = { styles . singleLine }
keyboardType = "numeric"
placeholder = "blurOnSubmit = false"
blurOnSubmit = { false }
onSubmitEditing = { ( ) => this . focusNextField ( '5' ) }
/ >
< TextInput
ref = "5"
style = { styles . singleLine }
keyboardType = "numbers-and-punctuation"
placeholder = "blurOnSubmit = true"
returnKeyType = "done"
/ >
< / V i e w >
) ;
}
2016-07-26 08:00:02 +00:00
}
2016-03-02 15:06:37 +00:00
2016-08-18 10:15:51 +00:00
class ToggleDefaultPaddingExample extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = { hasPadding : false } ;
}
render ( ) {
return (
< View >
< TextInput style = { this . state . hasPadding ? { padding : 0 } : null } / >
< Text onPress = { ( ) => this . setState ( { hasPadding : ! this . state . hasPadding } ) } >
Toggle padding
< / T e x t >
< / V i e w >
) ;
}
}
2016-09-05 14:04:26 +00:00
type SelectionExampleState = {
selection : {
start : number ;
end : number ;
} ;
value : string ;
} ;
class SelectionExample extends React . Component {
state : SelectionExampleState ;
_textInput : any ;
constructor ( props ) {
super ( props ) ;
this . state = {
selection : { start : 0 , end : 0 } ,
value : props . value
} ;
}
onSelectionChange ( { nativeEvent : { selection } } ) {
this . setState ( { selection } ) ;
}
getRandomPosition ( ) {
var length = this . state . value . length ;
return Math . round ( Math . random ( ) * length ) ;
}
select ( start , end ) {
this . _textInput . focus ( ) ;
this . setState ( { selection : { start , end } } ) ;
}
selectRandom ( ) {
var positions = [ this . getRandomPosition ( ) , this . getRandomPosition ( ) ] . sort ( ) ;
this . select ( ... positions ) ;
}
placeAt ( position ) {
this . select ( position , position ) ;
}
placeAtRandom ( ) {
this . placeAt ( this . getRandomPosition ( ) ) ;
}
render ( ) {
var length = this . state . value . length ;
return (
< View >
< TextInput
multiline = { this . props . multiline }
onChangeText = { ( value ) => this . setState ( { value } ) }
onSelectionChange = { this . onSelectionChange . bind ( this ) }
ref = { textInput => ( this . _textInput = textInput ) }
selection = { this . state . selection }
style = { this . props . style }
value = { this . state . value }
/ >
< View >
< Text >
selection = { JSON . stringify ( this . state . selection ) }
< / T e x t >
< Text onPress = { this . placeAt . bind ( this , 0 ) } >
Place at Start ( 0 , 0 )
< / T e x t >
< Text onPress = { this . placeAt . bind ( this , length ) } >
Place at End ( { length } , { length } )
< / T e x t >
< Text onPress = { this . placeAtRandom . bind ( this ) } >
Place at Random
< / T e x t >
< Text onPress = { this . select . bind ( this , 0 , length ) } >
Select All
< / T e x t >
< Text onPress = { this . selectRandom . bind ( this ) } >
Select Random
< / T e x t >
< / V i e w >
< / V i e w >
) ;
}
}
2015-09-14 14:35:58 +00:00
var styles = StyleSheet . create ( {
multiline : {
height : 60 ,
fontSize : 16 ,
padding : 4 ,
marginBottom : 10 ,
} ,
eventLabel : {
margin : 3 ,
fontSize : 12 ,
} ,
singleLine : {
fontSize : 16 ,
padding : 4 ,
} ,
singleLineWithHeightTextInput : {
height : 30 ,
} ,
2015-11-06 16:22:22 +00:00
hashtag : {
color : 'blue' ,
fontWeight : 'bold' ,
} ,
2015-09-14 14:35:58 +00:00
} ) ;
exports . title = '<TextInput>' ;
exports . description = 'Single and multi-line text inputs.' ;
exports . examples = [
{
title : 'Auto-focus' ,
render : function ( ) {
2016-02-04 13:12:36 +00:00
return (
< TextInput
autoFocus = { true }
style = { styles . singleLine }
accessibilityLabel = "I am the accessibility label for text input"
/ >
) ;
2015-09-14 14:35:58 +00:00
}
} ,
{
title : "Live Re-Write (<sp> -> '_')" ,
render : function ( ) {
return < RewriteExample / > ;
}
} ,
{
title : 'Auto-capitalize' ,
render : function ( ) {
var autoCapitalizeTypes = [
'none' ,
'sentences' ,
'words' ,
'characters' ,
] ;
var examples = autoCapitalizeTypes . map ( ( type ) => {
return (
< TextInput
2015-10-09 16:31:51 +00:00
key = { type }
2015-09-14 14:35:58 +00:00
autoCapitalize = { type }
placeholder = { 'autoCapitalize: ' + type }
style = { styles . singleLine }
/ >
) ;
} ) ;
return < View > { examples } < / V i e w > ;
}
} ,
{
title : 'Auto-correct' ,
render : function ( ) {
return (
< View >
< TextInput
autoCorrect = { true }
placeholder = "This has autoCorrect"
style = { styles . singleLine }
/ >
< TextInput
autoCorrect = { false }
placeholder = "This does not have autoCorrect"
style = { styles . singleLine }
/ >
< / V i e w >
) ;
}
} ,
{
title : 'Keyboard types' ,
render : function ( ) {
var keyboardTypes = [
'default' ,
'email-address' ,
'numeric' ,
2016-01-14 19:41:10 +00:00
'phone-pad' ,
2015-09-14 14:35:58 +00:00
] ;
var examples = keyboardTypes . map ( ( type ) => {
return (
< TextInput
2015-10-09 16:31:51 +00:00
key = { type }
2015-09-14 14:35:58 +00:00
keyboardType = { type }
placeholder = { 'keyboardType: ' + type }
style = { styles . singleLine }
/ >
) ;
} ) ;
return < View > { examples } < / V i e w > ;
}
} ,
2016-03-02 15:06:37 +00:00
{
title : 'Blur on submit' ,
2016-10-14 15:53:57 +00:00
render : function ( ) : React . Element { return < BlurOnSubmitExample / > ; } ,
2016-03-02 15:06:37 +00:00
} ,
2015-09-14 14:35:58 +00:00
{
title : 'Event handling' ,
2016-10-14 15:53:57 +00:00
render : function ( ) : React . Element { return < TextEventsExample / > ; } ,
2015-09-14 14:35:58 +00:00
} ,
{
title : 'Colors and text inputs' ,
render : function ( ) {
return (
< View >
< TextInput
style = { [ styles . singleLine ] }
defaultValue = "Default color text"
/ >
< TextInput
style = { [ styles . singleLine , { color : 'green' } ] }
defaultValue = "Green Text"
/ >
< TextInput
placeholder = "Default placeholder text color"
style = { styles . singleLine }
/ >
< TextInput
placeholder = "Red placeholder text color"
placeholderTextColor = "red"
style = { styles . singleLine }
/ >
< TextInput
placeholder = "Default underline color"
style = { styles . singleLine }
/ >
< TextInput
placeholder = "Blue underline color"
style = { styles . singleLine }
underlineColorAndroid = "blue"
/ >
2015-09-29 16:12:19 +00:00
< TextInput
defaultValue = "Same BackgroundColor as View "
style = { [ styles . singleLine , { backgroundColor : 'rgba(100, 100, 100, 0.3)' } ] } >
< Text style = { { backgroundColor : 'rgba(100, 100, 100, 0.3)' } } >
Darker backgroundColor
< / T e x t >
< / T e x t I n p u t >
2016-02-03 13:48:31 +00:00
< TextInput
defaultValue = "Highlight Color is red"
selectionColor = { 'red' }
style = { styles . singleLine } >
< / T e x t I n p u t >
2015-09-14 14:35:58 +00:00
< / V i e w >
) ;
}
} ,
{
title : 'Text input, themes and heights' ,
render : function ( ) {
return (
< TextInput
placeholder = "If you set height, beware of padding set from themes"
style = { [ styles . singleLineWithHeightTextInput ] }
/ >
) ;
}
} ,
2016-04-28 20:21:57 +00:00
{
title : 'fontFamily, fontWeight and fontStyle' ,
render : function ( ) {
return (
< View >
2016-06-28 21:11:23 +00:00
< TextInput
2016-04-28 20:21:57 +00:00
style = { [ styles . singleLine , { fontFamily : 'sans-serif' } ] }
placeholder = "Custom fonts like Sans-Serif are supported"
/ >
2016-06-28 21:11:23 +00:00
< TextInput
2016-04-28 20:21:57 +00:00
style = { [ styles . singleLine , { fontFamily : 'sans-serif' , fontWeight : 'bold' } ] }
placeholder = "Sans-Serif bold"
/ >
2016-06-28 21:11:23 +00:00
< TextInput
2016-04-28 20:21:57 +00:00
style = { [ styles . singleLine , { fontFamily : 'sans-serif' , fontStyle : 'italic' } ] }
placeholder = "Sans-Serif italic"
/ >
2016-06-28 21:11:23 +00:00
< TextInput
2016-04-28 20:21:57 +00:00
style = { [ styles . singleLine , { fontFamily : 'serif' } ] }
placeholder = "Serif"
/ >
< / V i e w >
) ;
}
} ,
2015-09-14 14:35:58 +00:00
{
title : 'Passwords' ,
render : function ( ) {
return (
2016-03-21 20:47:23 +00:00
< View >
< TextInput
defaultValue = "iloveturtles"
secureTextEntry = { true }
style = { styles . singleLine }
/ >
2016-04-06 16:20:39 +00:00
< TextInput
2016-03-21 20:47:23 +00:00
secureTextEntry = { true }
style = { [ styles . singleLine , { color : 'red' } ] }
placeholder = "color is supported too"
placeholderTextColor = "red"
/ >
< / V i e w >
2015-09-14 14:35:58 +00:00
) ;
}
} ,
{
title : 'Editable' ,
render : function ( ) {
return (
< TextInput
defaultValue = "Can't touch this! (>'-')> ^(' - ')^ <('-'<) (>'-')> ^(' - ')^"
editable = { false }
style = { styles . singleLine }
/ >
) ;
}
} ,
{
title : 'Multiline' ,
render : function ( ) {
return (
< View >
< TextInput
autoCorrect = { true }
placeholder = "multiline, aligned top-left"
placeholderTextColor = "red"
multiline = { true }
2016-09-05 14:04:26 +00:00
style = { [ styles . multiline , { textAlign : 'left' , textAlignVertical : 'top' } ] }
2015-09-14 14:35:58 +00:00
/ >
< TextInput
autoCorrect = { true }
placeholder = "multiline, aligned center"
placeholderTextColor = "green"
multiline = { true }
2016-09-05 14:04:26 +00:00
style = { [ styles . multiline , { textAlign : 'center' , textAlignVertical : 'center' } ] }
2015-09-14 14:35:58 +00:00
/ >
< TextInput
autoCorrect = { true }
multiline = { true }
2016-09-05 14:04:26 +00:00
style = { [ styles . multiline , { color : 'blue' } , { textAlign : 'right' , textAlignVertical : 'bottom' } ] } >
2015-09-14 14:35:58 +00:00
< Text style = { styles . multiline } > multiline with children , aligned bottom - right < / T e x t >
< / T e x t I n p u t >
< / V i e w >
) ;
}
} ,
{
title : 'Fixed number of lines' ,
platform : 'android' ,
render : function ( ) {
return (
< View >
< TextInput numberOfLines = { 2 }
multiline = { true }
placeholder = "Two line input"
/ >
< TextInput numberOfLines = { 5 }
multiline = { true }
placeholder = "Five line input"
/ >
< / V i e w >
) ;
}
} ,
2016-01-25 13:45:44 +00:00
{
title : 'Auto-expanding' ,
render : function ( ) {
return (
< View >
< AutoExpandingTextInput
placeholder = "height increases with content"
enablesReturnKeyAutomatically = { true }
returnKeyType = "done"
/ >
< / V i e w >
) ;
}
} ,
2015-11-06 16:22:22 +00:00
{
title : 'Attributed text' ,
render : function ( ) {
return < TokenizedTextExample / > ;
}
} ,
2016-05-05 17:21:35 +00:00
{
title : 'Return key' ,
render : function ( ) {
var returnKeyTypes = [
'none' ,
'go' ,
'search' ,
'send' ,
'done' ,
'previous' ,
'next' ,
] ;
var returnKeyLabels = [
'Compile' ,
'React Native' ,
] ;
var examples = returnKeyTypes . map ( ( type ) => {
return (
< TextInput
key = { type }
returnKeyType = { type }
placeholder = { 'returnKeyType: ' + type }
style = { styles . singleLine }
/ >
) ;
} ) ;
var types = returnKeyLabels . map ( ( type ) => {
return (
< TextInput
key = { type }
returnKeyLabel = { type }
placeholder = { 'returnKeyLabel: ' + type }
style = { styles . singleLine }
/ >
) ;
} ) ;
return < View > { examples } { types } < / V i e w > ;
}
} ,
2016-06-28 21:11:23 +00:00
{
title : 'Inline Images' ,
render : function ( ) {
return (
< View >
< TextInput
inlineImageLeft = "ic_menu_black_24dp"
placeholder = "This has drawableLeft set"
style = { styles . singleLine }
/ >
< TextInput
inlineImageLeft = "ic_menu_black_24dp"
inlineImagePadding = { 30 }
placeholder = "This has drawableLeft and drawablePadding set"
style = { styles . singleLine }
/ >
< TextInput
placeholder = "This does not have drawable props set"
style = { styles . singleLine }
/ >
< / V i e w >
) ;
}
} ,
2016-08-18 10:15:51 +00:00
{
title : 'Toggle Default Padding' ,
2016-10-14 15:53:57 +00:00
render : function ( ) : React . Element { return < ToggleDefaultPaddingExample / > ; } ,
2016-08-18 10:15:51 +00:00
} ,
2016-09-05 14:04:26 +00:00
{
title : 'Text selection & cursor placement' ,
render : function ( ) {
return (
< View >
< SelectionExample
style = { styles . default }
value = "text selection can be changed"
/ >
< SelectionExample
multiline
style = { styles . multiline }
value = { "multiline text selection\ncan also be changed" }
/ >
< / V i e w >
) ;
}
} ,
2015-09-14 14:35:58 +00:00
] ;