import React from 'react'; import { TextInput, TextInputProps } from 'react-native'; import { PasswordField, PhoneNumberField, TextField, } from '../../../primitives'; import { platform } from '../../../utils'; import { FieldProps } from './types'; const { IS_IOS } = platform; // to prevent issues with iOS when multiple `TextInput` components have `secureTextEntry` // set to `true`, insert a "hidden" `TextInput` after each `PasswordField` // Issue reference: https://github.com/facebook/react-native/issues/21911 const HIDDEN_INPUT_PROPS: TextInputProps = { // prevent iOS screen reader from picking up element accessibilityElementsHidden: true, // prevent `TextInput` from capturing touch events pointerEvents: 'none', // this workaround requires the `height` and `width` applied to the `TextInput` // are greater than `0` // NOTE: do not attempt to set an opacity value here to further hide the element, // it will cause the issues mitigated by this workaround to re-surface style: { backgroundColor: 'transparent', height: 0.1, width: 0.1 }, }; const HiddenInput = () => ; const Field = ({ type, ...rest }: FieldProps): JSX.Element => { const isPassword = type === 'password'; const Field = isPassword ? PasswordField : type === 'phone' ? PhoneNumberField : TextField; return IS_IOS && isPassword ? ( <> ) : ( ); }; Field.displayName = 'Field'; export default Field;