UNPKG

react-native

Version:

A framework for building native apps using React

984 lines (982 loc) • 35.8 kB
/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @generated SignedSource<<ed9bcb7fcffc322ce7bade156f9ffc21>> * * This file was translated from Flow by scripts/build-types/index.js. * Original file: packages/react-native/Libraries/Components/TextInput/TextInput.flow.js */ import type { HostInstance } from "../../../src/private/types/HostInstance"; import type { GestureResponderEvent, NativeSyntheticEvent, ScrollEvent } from "../../Types/CoreEventTypes"; import type { ViewProps } from "../View/ViewPropTypes"; import { type ColorValue, type TextStyleProp } from "../../StyleSheet/StyleSheet"; import * as React from "react"; /** * @see TextInputProps.onChange */ /** * @see TextInputProps.onChange */ type TextInputChangeEventData = Readonly<{ eventCount: number; target: number; text: string; }>; export type TextInputChangeEvent = NativeSyntheticEvent<TextInputChangeEventData>; export type TextInputEvent = NativeSyntheticEvent<Readonly<{ eventCount: number; previousText: string; range: Readonly<{ start: number; end: number; }>; target: number; text: string; }>>; type TextInputContentSizeChangeEventData = Readonly<{ target: number; contentSize: Readonly<{ width: number; height: number; }>; }>; /** * @see TextInputProps.onContentSizeChange */ export type TextInputContentSizeChangeEvent = NativeSyntheticEvent<TextInputContentSizeChangeEventData>; type TargetEvent = Readonly<{ target: number; }>; type TextInputFocusEventData = TargetEvent; /** * @see TextInputProps.onBlur */ export type TextInputBlurEvent = NativeSyntheticEvent<TextInputFocusEventData>; /** * @see TextInputProps.onFocus */ export type TextInputFocusEvent = NativeSyntheticEvent<TextInputFocusEventData>; export type Selection = Readonly<{ start: number; end: number; }>; type TextInputSelectionChangeEventData = Readonly<Omit<TargetEvent, keyof { selection: Selection; }> & { selection: Selection; }>; /** * @see TextInputProps.onSelectionChange */ export type TextInputSelectionChangeEvent = NativeSyntheticEvent<TextInputSelectionChangeEventData>; type TextInputKeyPressEventData = Readonly<Omit<TargetEvent, keyof { key: string; target?: number | undefined; eventCount: number; }> & { key: string; target?: number | undefined; eventCount: number; }>; /** * @see TextInputProps.onKeyPress */ export type TextInputKeyPressEvent = NativeSyntheticEvent<TextInputKeyPressEventData>; type TextInputEndEditingEventData = Readonly<Omit<TargetEvent, keyof { eventCount: number; text: string; }> & { eventCount: number; text: string; }>; /** * @see TextInputProps.onEndEditing */ export type TextInputEndEditingEvent = NativeSyntheticEvent<TextInputEndEditingEventData>; type TextInputSubmitEditingEventData = Readonly<Omit<TargetEvent, keyof { eventCount: number; text: string; }> & { eventCount: number; text: string; }>; /** * @see TextInputProps.onSubmitEditing */ export type TextInputSubmitEditingEvent = NativeSyntheticEvent<TextInputSubmitEditingEventData>; export type TextInputEditingEvent = NativeSyntheticEvent<TextInputEndEditingEventData>; type DataDetectorTypesType = "phoneNumber" | "link" | "address" | "calendarEvent" | "trackingNumber" | "flightNumber" | "lookupSuggestion" | "none" | "all"; export type KeyboardType = "default" | "email-address" | "numeric" | "phone-pad" | "number-pad" | "decimal-pad" | "url"; export type KeyboardTypeIOS = "ascii-capable" | "numbers-and-punctuation" | "name-phone-pad" | "twitter" | "web-search" | "ascii-capable-number-pad"; export type KeyboardTypeAndroid = "visible-password"; export type KeyboardTypeOptions = KeyboardType | KeyboardTypeIOS | KeyboardTypeAndroid; export type InputModeOptions = "none" | "text" | "decimal" | "numeric" | "tel" | "search" | "email" | "url"; export type ReturnKeyType = "done" | "go" | "next" | "search" | "send"; export type ReturnKeyTypeIOS = "default" | "emergency-call" | "google" | "join" | "route" | "yahoo"; export type ReturnKeyTypeAndroid = "none" | "previous"; export type ReturnKeyTypeOptions = ReturnKeyType | ReturnKeyTypeIOS | ReturnKeyTypeAndroid; export type SubmitBehavior = "submit" | "blurAndSubmit" | "newline"; export type AutoCapitalize = "none" | "sentences" | "words" | "characters"; export type TextContentType = "none" | "URL" | "addressCity" | "addressCityAndState" | "addressState" | "countryName" | "creditCardNumber" | "creditCardExpiration" | "creditCardExpirationMonth" | "creditCardExpirationYear" | "creditCardSecurityCode" | "creditCardType" | "creditCardName" | "creditCardGivenName" | "creditCardMiddleName" | "creditCardFamilyName" | "emailAddress" | "familyName" | "fullStreetAddress" | "givenName" | "jobTitle" | "location" | "middleName" | "name" | "namePrefix" | "nameSuffix" | "nickname" | "organizationName" | "postalCode" | "streetAddressLine1" | "streetAddressLine2" | "sublocality" | "telephoneNumber" | "username" | "password" | "newPassword" | "oneTimeCode" | "birthdate" | "birthdateDay" | "birthdateMonth" | "birthdateYear" | "cellularEID" | "cellularIMEI" | "dateTime" | "flightNumber" | "shipmentTrackingNumber"; export type EnterKeyHintTypeAndroid = "previous"; export type EnterKeyHintTypeIOS = "enter"; export type EnterKeyHintType = "done" | "go" | "next" | "search" | "send"; export type EnterKeyHintTypeOptions = EnterKeyHintType | EnterKeyHintTypeAndroid | EnterKeyHintTypeIOS; type PasswordRules = string; export type TextInputIOSProps = Readonly<{ /** * If true, the keyboard shortcuts (undo/redo and copy buttons) are disabled. The default value is false. * @platform ios */ disableKeyboardShortcuts?: boolean | undefined; /** * When the clear button should appear on the right side of the text view. * This property is supported only for single-line TextInput component. * @platform ios */ clearButtonMode?: ("never" | "while-editing" | "unless-editing" | "always") | undefined; /** * If `true`, clears the text field automatically when editing begins. * @platform ios */ clearTextOnFocus?: boolean | undefined; /** * Determines the types of data converted to clickable URLs in the text input. * Only valid if `multiline={true}` and `editable={false}`. * By default no data types are detected. * * You can provide one type or an array of many types. * * Possible values for `dataDetectorTypes` are: * * - `'phoneNumber'` * - `'link'` * - `'address'` * - `'calendarEvent'` * - `'none'` * - `'all'` * * @platform ios */ dataDetectorTypes?: (DataDetectorTypesType | undefined) | ReadonlyArray<DataDetectorTypesType>; /** * If `true`, the keyboard disables the return key when there is no text and * automatically enables it when there is text. The default value is `false`. * @platform ios */ enablesReturnKeyAutomatically?: boolean | undefined; /** * An optional identifier which links a custom InputAccessoryView to * this text input. The InputAccessoryView is rendered above the * keyboard when this text input is focused. * @platform ios */ inputAccessoryViewID?: string | undefined; /** * An optional label that overrides the default input accessory view button label. * @platform ios */ inputAccessoryViewButtonLabel?: string | undefined; /** * Determines the color of the keyboard. * @platform ios */ keyboardAppearance?: ("default" | "light" | "dark") | undefined; /** * Provide rules for your password. * For example, say you want to require a password with at least eight characters consisting of a mix of uppercase and lowercase letters, at least one number, and at most two consecutive characters. * "required: upper; required: lower; required: digit; max-consecutive: 2; minlength: 8;" * @platform ios */ passwordRules?: PasswordRules | undefined; rejectResponderTermination?: boolean | undefined; /** * If `false`, scrolling of the text view will be disabled. * The default value is `true`. Does only work with 'multiline={true}'. * @platform ios */ scrollEnabled?: boolean | undefined; /** * If `false`, disables spell-check style (i.e. red underlines). * The default value is inherited from `autoCorrect`. * @platform ios */ spellCheck?: boolean | undefined; /** * Give the keyboard and the system information about the * expected semantic meaning for the content that users enter. * @platform ios */ textContentType?: TextContentType | undefined; /** * Set line break strategy on iOS. * @platform ios */ lineBreakStrategyIOS?: ("none" | "standard" | "hangul-word" | "push-out") | undefined; /** * Set line break mode on iOS. * @platform ios */ lineBreakModeIOS?: ("wordWrapping" | "char" | "clip" | "head" | "middle" | "tail") | undefined; /** * If `false`, the iOS system will not insert an extra space after a paste operation * neither delete one or two spaces after a cut or delete operation. * * The default value is `true`. * * @platform ios */ smartInsertDelete?: boolean | undefined; }>; export type TextInputAndroidProps = Readonly<{ /** * When provided it will set the color of the cursor (or "caret") in the component. * Unlike the behavior of `selectionColor` the cursor color will be set independently * from the color of the text selection box. * @platform android */ cursorColor?: ColorValue | undefined; /** * When provided it will set the color of the selection handles when highlighting text. * Unlike the behavior of `selectionColor` the handle color will be set independently * from the color of the text selection box. * @platform android */ selectionHandleColor?: ColorValue | undefined; /** * When `false`, if there is a small amount of space available around a text input * (e.g. landscape orientation on a phone), the OS may choose to have the user edit * the text inside of a full screen text input mode. When `true`, this feature is * disabled and users will always edit the text directly inside of the text input. * Defaults to `false`. * @platform android */ disableFullscreenUI?: boolean | undefined; /** * Determines whether the individual fields in your app should be included in a * view structure for autofill purposes on Android API Level 26+. Defaults to auto. * To disable auto complete, use `off`. * * *Android Only* * * The following values work on Android only: * * - `auto` - let Android decide * - `no` - not important for autofill * - `noExcludeDescendants` - this view and its children aren't important for autofill * - `yes` - is important for autofill * - `yesExcludeDescendants` - this view is important for autofill but its children aren't */ importantForAutofill?: ("auto" | "no" | "noExcludeDescendants" | "yes" | "yesExcludeDescendants") | undefined; /** * If defined, the provided image resource will be rendered on the left. * The image resource must be inside `/android/app/src/main/res/drawable` and referenced * like * ``` * <TextInput * inlineImageLeft='search_icon' * /> * ``` * @platform android */ inlineImageLeft?: string | undefined; /** * Padding between the inline image, if any, and the text input itself. * @platform android */ inlineImagePadding?: number | undefined; /** * Sets the number of lines for a `TextInput`. Use it with multiline set to * `true` to be able to fill the lines. * @platform android */ numberOfLines?: number | undefined; /** * Sets the return key to the label. Use it instead of `returnKeyType`. * @platform android */ returnKeyLabel?: string | undefined; /** * Sets the number of rows for a `TextInput`. Use it with multiline set to * `true` to be able to fill the lines. * @platform android */ rows?: number | undefined; /** * When `false`, it will prevent the soft keyboard from showing when the field is focused. * Defaults to `true`. */ showSoftInputOnFocus?: boolean | undefined; /** * Set text break strategy on Android API Level 23+, possible values are `simple`, `highQuality`, `balanced` * The default value is `simple`. * @platform android */ textBreakStrategy?: ("simple" | "highQuality" | "balanced") | undefined; /** * The color of the `TextInput` underline. * @platform android */ underlineColorAndroid?: ColorValue | undefined; }>; type TextInputBaseProps = Readonly<{ /** * When provided, the text input will only accept drag and drop events for the specified * types. If null or not provided, the text input will accept all types of drag and drop events. * An empty array will accept no drag and drop events. * Defaults to null. * * On Android, types must correspond to MIME types from ClipData: * https://developer.android.com/reference/android/content/ClipData * (e.g. "text/plain" or "image/*") * * On iOS, types must correspond to UTIs: * https://developer.apple.com/documentation/uniformtypeidentifiers * (e.g. "public.plain-text" or "public.image") * * *NOTE*: This prop is experimental and its API may change in the future. Use at your own risk. * * @see https://developer.android.com/reference/android/content/ClipData for more information on MIME types */ experimental_acceptDragAndDropTypes?: ReadonlyArray<string> | undefined; /** * Can tell `TextInput` to automatically capitalize certain characters. * * - `characters`: all characters. * - `words`: first letter of each word. * - `sentences`: first letter of each sentence (*default*). * - `none`: don't auto capitalize anything. */ autoCapitalize?: AutoCapitalize | undefined; /** * Specifies autocomplete hints for the system, so it can provide autofill. * On Android, the system will always attempt to offer autofill by using heuristics to identify the type of content. * To disable autocomplete, set autoComplete to off. * * The following values work across platforms: * * - `additional-name` * - `address-line1` * - `address-line2` * - `birthdate-day` (iOS 17+) * - `birthdate-full` (iOS 17+) * - `birthdate-month` (iOS 17+) * - `birthdate-year` (iOS 17+) * - `cc-number` * - `cc-csc` (iOS 17+) * - `cc-exp` (iOS 17+) * - `cc-exp-day` (iOS 17+) * - `cc-exp-month` (iOS 17+) * - `cc-exp-year` (iOS 17+) * - `country` * - `current-password` * - `email` * - `family-name` * - `given-name` * - `honorific-prefix` * - `honorific-suffix` * - `name` * - `new-password` * - `off` * - `one-time-code` * - `postal-code` * - `street-address` * - `tel` * - `username` * * The following values work on iOS only: * * - `cc-name` (iOS 17+) * - `cc-given-name` (iOS 17+) * - `cc-middle-name` (iOS 17+) * - `cc-family-name` (iOS 17+) * - `cc-type` (iOS 17+) * - `nickname` * - `organization` * - `organization-title` * - `url` * * The following values work on Android only: * * - `gender` * - `name-family` * - `name-given` * - `name-middle` * - `name-middle-initial` * - `name-prefix` * - `name-suffix` * - `password` * - `password-new` * - `postal-address` * - `postal-address-country` * - `postal-address-extended` * - `postal-address-extended-postal-code` * - `postal-address-locality` * - `postal-address-region` * - `sms-otp` * - `tel-country-code` * - `tel-national` * - `tel-device` * - `username-new` */ autoComplete?: ("additional-name" | "address-line1" | "address-line2" | "birthdate-day" | "birthdate-full" | "birthdate-month" | "birthdate-year" | "cc-csc" | "cc-exp" | "cc-exp-day" | "cc-exp-month" | "cc-exp-year" | "cc-number" | "cc-name" | "cc-given-name" | "cc-middle-name" | "cc-family-name" | "cc-type" | "country" | "current-password" | "email" | "family-name" | "gender" | "given-name" | "honorific-prefix" | "honorific-suffix" | "name" | "name-family" | "name-given" | "name-middle" | "name-middle-initial" | "name-prefix" | "name-suffix" | "new-password" | "nickname" | "one-time-code" | "organization" | "organization-title" | "password" | "password-new" | "postal-address" | "postal-address-country" | "postal-address-extended" | "postal-address-extended-postal-code" | "postal-address-locality" | "postal-address-region" | "postal-code" | "street-address" | "sms-otp" | "tel" | "tel-country-code" | "tel-national" | "tel-device" | "url" | "username" | "username-new" | "off") | undefined; /** * If `false`, disables auto-correct. The default value is `true`. */ autoCorrect?: boolean | undefined; /** * If `true`, focuses the input on `componentDidMount`. * The default value is `false`. */ autoFocus?: boolean | undefined; /** * Specifies whether fonts should scale to respect Text Size accessibility settings. The * default is `true`. */ allowFontScaling?: boolean | undefined; /** * If `true`, caret is hidden. The default value is `false`. * * On Android devices manufactured by Xiaomi with Android Q, * when keyboardType equals 'email-address'this will be set * in native to 'true' to prevent a system related crash. This * will cause cursor to be disabled as a side-effect. * */ caretHidden?: boolean | undefined; contextMenuHidden?: boolean | undefined; /** * Provides an initial value that will change when the user starts typing. * Useful for simple use-cases where you do not want to deal with listening * to events and updating the value prop to keep the controlled state in sync. */ defaultValue?: string | undefined; /** * If `false`, text is not editable. The default value is `true`. */ editable?: boolean | undefined; forwardedRef?: React.Ref<TextInputInstance> | undefined; /** * `enterKeyHint` defines what action label (or icon) to present for the enter key on virtual keyboards. * * The following values is supported: * * - `enter` * - `done` * - `go` * - `next` * - `previous` * - `search` * - `send` */ enterKeyHint?: EnterKeyHintTypeOptions | undefined; /** * `inputMode` works like the `inputmode` attribute in HTML, it determines which * keyboard to open, e.g.`numeric` and has precedence over keyboardType * * Support the following values: * * - `none` * - `text` * - `decimal` * - `numeric` * - `tel` * - `search` * - `email` * - `url` */ inputMode?: InputModeOptions | undefined; /** * Determines which keyboard to open, e.g.`numeric`. * * The following values work across platforms: * * - `default` * - `numeric` * - `number-pad` * - `decimal-pad` * - `email-address` * - `phone-pad` * - `url` * * *iOS Only* * * The following values work on iOS only: * * - `ascii-capable` * - `numbers-and-punctuation` * - `name-phone-pad` * - `twitter` * - `web-search` * * *Android Only* * * The following values work on Android only: * * - `visible-password` * */ keyboardType?: KeyboardTypeOptions | undefined; /** * Specifies largest possible scale a font can reach when `allowFontScaling` is enabled. * Possible values: * `null/undefined` (default): inherit from the parent node or the global default (0) * `0`: no max, ignore parent/global default * `>= 1`: sets the maxFontSizeMultiplier of this node to this value */ maxFontSizeMultiplier?: number | undefined; /** * Limits the maximum number of characters that can be entered. Use this * instead of implementing the logic in JS to avoid flicker. */ maxLength?: number | undefined; /** * If `true`, the text input can be multiple lines. * The default value is `false`. */ multiline?: boolean | undefined; /** * Callback that is called when the text input is blurred. */ onBlur?: ((e: TextInputBlurEvent) => unknown) | undefined; /** * Callback that is called when the text input's text changes. */ onChange?: ((e: TextInputChangeEvent) => unknown) | undefined; /** * Callback that is called when the text input's text changes. * Changed text is passed as an argument to the callback handler. */ onChangeText?: ((text: string) => unknown) | undefined; /** * Callback that is called when the text input's content size changes. * This will be called with * `{ nativeEvent: { contentSize: { width, height } } }`. * * Only called for multiline text inputs. */ onContentSizeChange?: ((e: TextInputContentSizeChangeEvent) => unknown) | undefined; /** * Callback that is called when text input ends. */ onEndEditing?: ((e: TextInputEndEditingEvent) => unknown) | undefined; /** * Callback that is called when the text input is focused. */ onFocus?: ((e: TextInputFocusEvent) => unknown) | undefined; /** * Callback that is called when a key is pressed. * This will be called with `{ nativeEvent: { key: keyValue } }` * where `keyValue` is `'Enter'` or `'Backspace'` for respective keys and * the typed-in character otherwise including `' '` for space. * Fires before `onChange` callbacks. */ onKeyPress?: ((e: TextInputKeyPressEvent) => unknown) | undefined; /** * Called when a single tap gesture is detected. */ onPress?: ((event: GestureResponderEvent) => unknown) | undefined; /** * Called when a touch is engaged. */ onPressIn?: ((event: GestureResponderEvent) => unknown) | undefined; /** * Called when a touch is released. */ onPressOut?: ((event: GestureResponderEvent) => unknown) | undefined; /** * Callback that is called when the text input selection is changed. * This will be called with * `{ nativeEvent: { selection: { start, end } } }`. */ onSelectionChange?: ((e: TextInputSelectionChangeEvent) => unknown) | undefined; /** * Callback that is called when the text input's submit button is pressed. * Invalid if `multiline={true}` is specified. */ onSubmitEditing?: ((e: TextInputSubmitEditingEvent) => unknown) | undefined; /** * Invoked on content scroll with `{ nativeEvent: { contentOffset: { x, y } } }`. * May also contain other properties from ScrollEvent but on Android contentSize * is not provided for performance reasons. */ onScroll?: ((e: ScrollEvent) => unknown) | undefined; /** * The string that will be rendered before text input has been entered. */ placeholder?: string | undefined; /** * The text color of the placeholder string. */ placeholderTextColor?: ColorValue | undefined; /** `readOnly` works like the `readonly` attribute in HTML. * If `true`, text is not editable. The default value is `false`. * See https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/readonly * for more details. */ readOnly?: boolean | undefined; /** * Determines how the return key should look. On Android you can also use * `returnKeyLabel`. * * *Cross platform* * * The following values work across platforms: * * - `done` * - `go` * - `next` * - `search` * - `send` * * *Android Only* * * The following values work on Android only: * * - `none` * - `previous` * * *iOS Only* * * The following values work on iOS only: * * - `default` * - `emergency-call` * - `google` * - `join` * - `route` * - `yahoo` */ returnKeyType?: ReturnKeyTypeOptions | undefined; /** * If `true`, the text input obscures the text entered so that sensitive text * like passwords stay secure. The default value is `false`. Does not work with 'multiline={true}'. */ secureTextEntry?: boolean | undefined; /** * The start and end of the text input's selection. Set start and end to * the same value to position the cursor. */ selection?: Readonly<{ start: number; end?: number | undefined; }> | undefined; /** * The highlight and cursor color of the text input. */ selectionColor?: ColorValue | undefined; /** * If `true`, all text will automatically be selected on focus. */ selectTextOnFocus?: boolean | undefined; /** * If `true`, the text field will blur when submitted. * The default value is true for single-line fields and false for * multiline fields. Note that for multiline fields, setting `blurOnSubmit` * to `true` means that pressing return will blur the field and trigger the * `onSubmitEditing` event instead of inserting a newline into the field. * * @deprecated * Note that `submitBehavior` now takes the place of `blurOnSubmit` and will * override any behavior defined by `blurOnSubmit`. * @see submitBehavior */ blurOnSubmit?: boolean | undefined; /** * When the return key is pressed, * * For single line inputs: * * - `'newline`' defaults to `'blurAndSubmit'` * - `undefined` defaults to `'blurAndSubmit'` * * For multiline inputs: * * - `'newline'` adds a newline * - `undefined` defaults to `'newline'` * * For both single line and multiline inputs: * * - `'submit'` will only send a submit event and not blur the input * - `'blurAndSubmit`' will both blur the input and send a submit event */ submitBehavior?: SubmitBehavior | undefined; /** * Note that not all Text styles are supported, an incomplete list of what is not supported includes: * * - `borderLeftWidth` * - `borderTopWidth` * - `borderRightWidth` * - `borderBottomWidth` * - `borderTopLeftRadius` * - `borderTopRightRadius` * - `borderBottomRightRadius` * - `borderBottomLeftRadius` * * see [Issue#7070](https://github.com/facebook/react-native/issues/7070) * for more detail. * * [Styles](docs/style.html) */ style?: TextStyleProp | undefined; /** * The value to show for the text input. `TextInput` is a controlled * component, which means the native value will be forced to match this * value prop if provided. For most uses, this works great, but in some * cases this may cause flickering - one common cause is preventing edits * by keeping value the same. In addition to simply setting the same value, * either set `editable={false}`, or set/update `maxLength` to prevent * unwanted edits without flicker. */ value?: string | undefined; /** * Align the input text to the left, center, or right sides of the input field. */ textAlign?: ("left" | "center" | "right") | undefined; }>; export type TextInputProps = Readonly<Omit<Omit<ViewProps, "style">, keyof TextInputIOSProps | keyof TextInputAndroidProps | keyof TextInputBaseProps | keyof {}> & Omit<TextInputIOSProps, keyof TextInputAndroidProps | keyof TextInputBaseProps | keyof {}> & Omit<TextInputAndroidProps, keyof TextInputBaseProps | keyof {}> & Omit<TextInputBaseProps, keyof {}> & {}>; export interface TextInputInstance extends HostInstance { readonly clear: () => void; readonly isFocused: () => boolean; readonly getNativeRef: () => HostInstance | undefined; readonly setSelection: (start: number, end: number) => void; } /** * A foundational component for inputting text into the app via a * keyboard. Props provide configurability for several features, such as * auto-correction, auto-capitalization, placeholder text, and different keyboard * types, such as a numeric keypad. * * The simplest use case is to plop down a `TextInput` and subscribe to the * `onChangeText` events to read the user input. There are also other events, * such as `onSubmitEditing` and `onFocus` that can be subscribed to. A simple * example: * * ```ReactNativeWebPlayer * import React, { Component } from 'react'; * import { AppRegistry, TextInput } from 'react-native'; * * export default class UselessTextInput extends Component { * constructor(props) { * super(props); * this.state = { text: 'Useless Placeholder' }; * } * * render() { * return ( * <TextInput * style={{height: 40, borderColor: 'gray', borderWidth: 1}} * onChangeText={(text) => this.setState({text})} * value={this.state.text} * /> * ); * } * } * * // skip this line if using Create React Native App * AppRegistry.registerComponent('AwesomeProject', () => UselessTextInput); * ``` * * Two methods exposed via the native element are .focus() and .blur() that * will focus or blur the TextInput programmatically. * * Note that some props are only available with `multiline={true/false}`. * Additionally, border styles that apply to only one side of the element * (e.g., `borderBottomColor`, `borderLeftWidth`, etc.) will not be applied if * `multiline=false`. To achieve the same effect, you can wrap your `TextInput` * in a `View`: * * ```ReactNativeWebPlayer * import React, { Component } from 'react'; * import { AppRegistry, View, TextInput } from 'react-native'; * * class UselessTextInput extends Component { * render() { * return ( * <TextInput * {...this.props} // Inherit any props passed to it; e.g., multiline, numberOfLines below * editable = {true} * maxLength = {40} * /> * ); * } * } * * export default class UselessTextInputMultiline extends Component { * constructor(props) { * super(props); * this.state = { * text: 'Useless Multiline Placeholder', * }; * } * * // If you type something in the text box that is a color, the background will change to that * // color. * render() { * return ( * <View style={{ * backgroundColor: this.state.text, * borderBottomColor: '#000000', * borderBottomWidth: 1 }} * > * <UselessTextInput * multiline = {true} * numberOfLines = {4} * onChangeText={(text) => this.setState({text})} * value={this.state.text} * /> * </View> * ); * } * } * * // skip these lines if using Create React Native App * AppRegistry.registerComponent( * 'AwesomeProject', * () => UselessTextInputMultiline * ); * ``` * * `TextInput` has by default a border at the bottom of its view. This border * has its padding set by the background image provided by the system, and it * cannot be changed. Solutions to avoid this is to either not set height * explicitly, case in which the system will take care of displaying the border * in the correct position, or to not display the border by setting * `underlineColorAndroid` to transparent. * * Note that on Android performing text selection in input can change * app's activity `windowSoftInputMode` param to `adjustResize`. * This may cause issues with components that have position: 'absolute' * while keyboard is active. To avoid this behavior either specify `windowSoftInputMode` * in AndroidManifest.xml ( https://developer.android.com/guide/topics/manifest/activity-element.html ) * or control this param programmatically with native code. * */ /** * A foundational component for inputting text into the app via a * keyboard. Props provide configurability for several features, such as * auto-correction, auto-capitalization, placeholder text, and different keyboard * types, such as a numeric keypad. * * The simplest use case is to plop down a `TextInput` and subscribe to the * `onChangeText` events to read the user input. There are also other events, * such as `onSubmitEditing` and `onFocus` that can be subscribed to. A simple * example: * * ```ReactNativeWebPlayer * import React, { Component } from 'react'; * import { AppRegistry, TextInput } from 'react-native'; * * export default class UselessTextInput extends Component { * constructor(props) { * super(props); * this.state = { text: 'Useless Placeholder' }; * } * * render() { * return ( * <TextInput * style={{height: 40, borderColor: 'gray', borderWidth: 1}} * onChangeText={(text) => this.setState({text})} * value={this.state.text} * /> * ); * } * } * * // skip this line if using Create React Native App * AppRegistry.registerComponent('AwesomeProject', () => UselessTextInput); * ``` * * Two methods exposed via the native element are .focus() and .blur() that * will focus or blur the TextInput programmatically. * * Note that some props are only available with `multiline={true/false}`. * Additionally, border styles that apply to only one side of the element * (e.g., `borderBottomColor`, `borderLeftWidth`, etc.) will not be applied if * `multiline=false`. To achieve the same effect, you can wrap your `TextInput` * in a `View`: * * ```ReactNativeWebPlayer * import React, { Component } from 'react'; * import { AppRegistry, View, TextInput } from 'react-native'; * * class UselessTextInput extends Component { * render() { * return ( * <TextInput * {...this.props} // Inherit any props passed to it; e.g., multiline, numberOfLines below * editable = {true} * maxLength = {40} * /> * ); * } * } * * export default class UselessTextInputMultiline extends Component { * constructor(props) { * super(props); * this.state = { * text: 'Useless Multiline Placeholder', * }; * } * * // If you type something in the text box that is a color, the background will change to that * // color. * render() { * return ( * <View style={{ * backgroundColor: this.state.text, * borderBottomColor: '#000000', * borderBottomWidth: 1 }} * > * <UselessTextInput * multiline = {true} * numberOfLines = {4} * onChangeText={(text) => this.setState({text})} * value={this.state.text} * /> * </View> * ); * } * } * * // skip these lines if using Create React Native App * AppRegistry.registerComponent( * 'AwesomeProject', * () => UselessTextInputMultiline * ); * ``` * * `TextInput` has by default a border at the bottom of its view. This border * has its padding set by the background image provided by the system, and it * cannot be changed. Solutions to avoid this is to either not set height * explicitly, case in which the system will take care of displaying the border * in the correct position, or to not display the border by setting * `underlineColorAndroid` to transparent. * * Note that on Android performing text selection in input can change * app's activity `windowSoftInputMode` param to `adjustResize`. * This may cause issues with components that have position: 'absolute' * while keyboard is active. To avoid this behavior either specify `windowSoftInputMode` * in AndroidManifest.xml ( https://developer.android.com/guide/topics/manifest/activity-element.html ) * or control this param programmatically with native code. * */ type InternalTextInput = (props: Omit<TextInputProps, keyof { ref?: React.Ref<TextInputInstance>; }> & { ref?: React.Ref<TextInputInstance>; }) => React.ReactNode; export type TextInputComponentStatics = Readonly<{ State: Readonly<{ currentlyFocusedInput: () => HostInstance | undefined; currentlyFocusedField: () => number | undefined; focusTextInput: (textField: HostInstance | undefined) => void; blurTextInput: (textField: HostInstance | undefined) => void; }>; }>; export type TextInputType = InternalTextInput & TextInputComponentStatics;