Files
react-native/packages/rn-tester/js/examples/TextInput/TextInputExample.android.js
T
Mateo Guzmán d4407d6f77 Fix RNTester strict mode warnings (#48619)
Summary:
While investigating https://github.com/facebook/react-native/issues/22186, some false positives showed up as some of the examples also have non-strict mode compatible code.

In this PR:

- Converting from class to functional components some TextInput and Image examples that were using `UNSAFE_` lifecycles.
- Unifying the auto-expanding example as it was exactly the same for iOS and Android.

## Changelog:

[INTERNAL] - Fix RNTester strict mode warnings for TextInput and Image examples

Pull Request resolved: https://github.com/facebook/react-native/pull/48619

Test Plan:
- Wrapped the the entry app component in `RNTesterAppShared.js` with `StrictMode` and verified that no warnings are shown anymore for the updated components.
- Checked the examples are still working as they were.

Reviewed By: fabriziocucci

Differential Revision: D68094402

Pulled By: rshest

fbshipit-source-id: e13878cb290735095afaef3d0377fd6dab33c380
2025-01-13 05:11:13 -08:00

408 lines
11 KiB
JavaScript

/**
* 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.
*
* @format
* @flow strict-local
*/
'use strict';
import type {
RNTesterModule,
RNTesterModuleExample,
} from '../../types/RNTesterTypes';
import ExampleTextInput from './ExampleTextInput';
import TextInputSharedExamples from './TextInputSharedExamples';
import React from 'react';
import {StyleSheet, Text, View} from 'react-native';
const ToggleDefaultPaddingExample = (): React.Node => {
const [hasPadding, setHasPadding] = React.useState(false);
return (
<View>
<ExampleTextInput style={hasPadding ? {padding: 0} : null} />
<Text onPress={() => setHasPadding(!hasPadding)}>Toggle padding</Text>
</View>
);
};
const styles = StyleSheet.create({
multiline: {
height: 60,
fontSize: 16,
},
singleLine: {
fontSize: 16,
},
singleLineWithHeightTextInput: {
height: 30,
},
wrappedText: {
maxWidth: 300,
},
});
const examples: Array<RNTesterModuleExample> = [
...TextInputSharedExamples,
{
title: 'Colors and text inputs',
render: function (): React.Node {
return (
<View>
<ExampleTextInput
style={[styles.singleLine]}
defaultValue="Default color text"
/>
<ExampleTextInput
style={[styles.singleLine, {color: 'green'}]}
defaultValue="Green Text"
/>
<ExampleTextInput
placeholder="Default placeholder text color"
style={styles.singleLine}
/>
<ExampleTextInput
placeholder="Red placeholder text color"
placeholderTextColor="red"
style={styles.singleLine}
/>
<ExampleTextInput
placeholder="Default underline color"
style={styles.singleLine}
/>
<ExampleTextInput
placeholder="Blue underline color"
style={styles.singleLine}
underlineColorAndroid="blue"
/>
<ExampleTextInput
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
</Text>
</ExampleTextInput>
<ExampleTextInput
defaultValue="Selection Color is red"
selectionColor={'red'}
style={styles.singleLine}
/>
<ExampleTextInput
defaultValue="Selection handles are red"
selectionHandleColor={'red'}
style={styles.singleLine}
/>
<ExampleTextInput
defaultValue="Cursor Color is red"
cursorColor={'red'}
style={styles.singleLine}
/>
</View>
);
},
},
{
title: 'Font Weight',
render: function (): React.Node {
return (
<View>
<ExampleTextInput
defaultValue="Font Weight (default)"
style={[styles.singleLine]}
/>
{[
'normal',
'bold',
'900',
800,
'700',
'600',
'500',
'400',
'300',
'200',
'100',
].map(fontWeight => (
<ExampleTextInput
defaultValue={`Font Weight (${fontWeight})`}
key={fontWeight}
style={[styles.singleLine, {fontWeight}]}
/>
))}
</View>
);
},
},
{
title: 'Text input, themes and heights',
render: function (): React.Node {
return (
<ExampleTextInput
placeholder="If you set height, beware of padding set from themes"
style={[styles.singleLineWithHeightTextInput]}
/>
);
},
},
{
title: 'letterSpacing',
render: function (): React.Node {
return (
<View>
<ExampleTextInput
style={[styles.singleLine, {letterSpacing: 0}]}
placeholder="letterSpacing = 0"
/>
<ExampleTextInput
style={[styles.singleLine, {letterSpacing: 2}]}
placeholder="letterSpacing = 2"
/>
<ExampleTextInput
style={[styles.singleLine, {letterSpacing: 9}]}
placeholder="letterSpacing = 9"
/>
<ExampleTextInput
style={[styles.singleLine, {letterSpacing: -1}]}
placeholder="letterSpacing = -1"
/>
</View>
);
},
},
{
title: 'Passwords',
render: function (): React.Node {
return (
<View>
<ExampleTextInput
defaultValue="iloveturtles"
secureTextEntry={true}
style={styles.singleLine}
/>
<ExampleTextInput
secureTextEntry={true}
style={[styles.singleLine, {color: 'red'}]}
placeholder="color is supported too"
placeholderTextColor="red"
/>
</View>
);
},
},
{
title: 'Editable',
render: function (): React.Node {
return (
<ExampleTextInput
defaultValue="Can't touch this! (>'-')> ^(' - ')^ <('-'<) (>'-')> ^(' - ')^"
editable={false}
style={styles.singleLine}
/>
);
},
},
{
title: 'Multiline',
render: function (): React.Node {
return (
<View>
<ExampleTextInput
autoCorrect={true}
placeholder="multiline, aligned top-left"
placeholderTextColor="red"
multiline={true}
style={[
styles.multiline,
{textAlign: 'left', textAlignVertical: 'top'},
]}
/>
<ExampleTextInput
autoCorrect={true}
placeholder="multiline, aligned center"
placeholderTextColor="green"
multiline={true}
style={[
styles.multiline,
{textAlign: 'center', textAlignVertical: 'center'},
]}
/>
<ExampleTextInput
autoCorrect={true}
multiline={true}
style={[
styles.multiline,
{color: 'blue'},
{textAlign: 'right', textAlignVertical: 'bottom'},
]}>
<Text style={styles.multiline}>
multiline with children, aligned bottom-right
</Text>
</ExampleTextInput>
</View>
);
},
},
{
title: 'Editable and Read only',
render: function (): React.Node {
return (
<View>
<ExampleTextInput
placeholder="editable text input using editable prop"
editable
/>
<ExampleTextInput
placeholder="uneditable text input using editable prop"
editable={false}
/>
<ExampleTextInput
placeholder="editable text input using readOnly prop"
readOnly={false}
/>
<ExampleTextInput
placeholder="uneditable text input using readOnly prop"
readOnly
/>
</View>
);
},
},
{
title: 'Fixed number of lines',
platform: 'android',
render: function (): React.Node {
return (
<View style={styles.wrappedText}>
<ExampleTextInput
numberOfLines={2}
multiline={true}
placeholder="Two line input using numberOfLines prop"
/>
<ExampleTextInput
numberOfLines={5}
multiline={true}
placeholder="Five line input using numberOfLines prop"
/>
<ExampleTextInput
rows={2}
multiline={true}
placeholder="Two line input using rows prop"
/>
<ExampleTextInput
rows={5}
multiline={true}
placeholder="Five line input using rows prop"
/>
</View>
);
},
},
{
title: 'Text Auto Complete',
render: function (): React.Node {
return (
<View>
<ExampleTextInput autoComplete="country" placeholder="country" />
<ExampleTextInput
autoComplete="postal-address-country"
placeholder="postal-address-country"
/>
<ExampleTextInput
autoComplete="one-time-code"
placeholder="one-time-code"
/>
<ExampleTextInput autoComplete="sms-otp" placeholder="sms-otp" />
</View>
);
},
},
{
title: 'Return key',
render: function (): React.Node {
const returnKeyTypes = [
'none',
'go',
'search',
'send',
'done',
'previous',
'next',
];
const returnKeyLabels = ['Compile', 'React Native'];
const returnKeyExamples = returnKeyTypes.map(type => {
return (
<ExampleTextInput
key={type}
returnKeyType={type}
placeholder={'returnKeyType: ' + type}
style={styles.singleLine}
/>
);
});
const types = returnKeyLabels.map(type => {
return (
<ExampleTextInput
key={type}
returnKeyLabel={type}
placeholder={'returnKeyLabel: ' + type}
style={styles.singleLine}
/>
);
});
return (
<View>
{returnKeyExamples}
{types}
</View>
);
},
},
{
title: 'Inline Images',
render: function (): React.Node {
return (
<View>
<ExampleTextInput
inlineImageLeft="ic_menu_black_24dp"
placeholder="This has drawableLeft set"
style={styles.singleLine}
/>
<ExampleTextInput
inlineImageLeft="ic_menu_black_24dp"
inlineImagePadding={30}
placeholder="This has drawableLeft and drawablePadding set"
style={styles.singleLine}
/>
<ExampleTextInput
placeholder="This does not have drawable props set"
style={styles.singleLine}
/>
</View>
);
},
},
{
title: 'Toggle Default Padding',
render: function (): React.Node {
return <ToggleDefaultPaddingExample />;
},
},
];
module.exports = ({
displayName: (undefined: ?string),
title: 'TextInput',
documentationURL: 'https://reactnative.dev/docs/textinput',
category: 'Basic',
description: 'Single and multi-line text inputs.',
examples,
}: RNTesterModule);