import color from 'color'; import * as React from 'react'; import { Animated, LayoutChangeEvent, StyleProp, StyleSheet, TextStyle, } from 'react-native'; import { withTheme } from '../core/theming'; import type { $Omit } from '../types'; import isNativeAnimationSupported from '../utils/isNativeAnimationSupported'; import AnimatedText from './Typography/AnimatedText'; type Props = $Omit< $Omit, 'padding'>, 'type' > & { /** * Type of the helper text. */ type: 'error' | 'info'; /** * Whether to display the helper text. */ visible?: boolean; /** * Whether to apply padding to the helper text. */ padding?: 'none' | 'normal'; /** * Text content of the HelperText. */ children: React.ReactNode; style?: StyleProp; /** * @optional */ theme: ReactNativePaper.Theme; /** * TestID used for testing purposes */ testID?: string; }; /** * Helper text is used in conjuction with input elements to provide additional hints for the user. * *
* *
* * ## Usage * ```js * import * as React from 'react'; * import { View } from 'react-native'; * import { HelperText, TextInput } from 'react-native-paper'; * * const MyComponent = () => { * const [text, setText] = React.useState(''); * * const onChangeText = text => setText(text); * * const hasErrors = () => { * return !text.includes('@'); * }; * * return ( * * * * Email address is invalid! * * * ); * }; * * export default MyComponent; * ``` */ const HelperText = ({ style, type = 'info', visible = true, theme, onLayout, padding = 'normal', ...rest }: Props) => { const { current: shown } = React.useRef( new Animated.Value(visible ? 1 : 0) ); let { current: textHeight } = React.useRef(0); const { scale } = theme.animation; const { maxFontSizeMultiplier = 1.5 } = rest; React.useEffect(() => { if (visible) { // show text Animated.timing(shown, { toValue: 1, duration: 150 * scale, useNativeDriver: isNativeAnimationSupported(), }).start(); } else { // hide text Animated.timing(shown, { toValue: 0, duration: 180 * scale, useNativeDriver: isNativeAnimationSupported(), }).start(); } }, [visible, scale, shown]); const handleTextLayout = (e: LayoutChangeEvent) => { onLayout?.(e); textHeight = e.nativeEvent.layout.height; }; const { colors, dark } = theme; const textColor = type === 'error' ? colors.error : color(colors.text) .alpha(dark ? 0.7 : 0.54) .rgb() .string(); return ( {rest.children} ); }; const styles = StyleSheet.create({ text: { fontSize: 12, paddingVertical: 4, }, padding: { paddingHorizontal: 12, }, }); export default withTheme(HelperText);