Skip to content

Latest commit

 

History

History
185 lines (172 loc) · 7.74 KB

custom-input.md

File metadata and controls

185 lines (172 loc) · 7.74 KB

CustomInput

This is custom TextInput component, this component helps on managing blur, error, input type such as email, password, phone, number, text, text-area

How to use

To help maintain keyboard I suggest to install react-native-keyboard-aware-scroll-view (link).

  import { CustomInput, Styled } from 'react-native-awesome-component'
  import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'

  class CustomInputScreen extends Component {
  constructor(props) {
    super(props)
    this.state = {
      userId: '',
      userIdError: true,
      password: '',
      confirmPassword: '',
      email: '',
      phoneNumber: '',
      description: '',
      qty: '',
      showPassword: false,
    }
  }

  render() {
    const { userId, password, confirmPassword, email, phoneNumber, description, qty, showPassword } = this.state

    return (
      <KeyboardAwareScrollView style={{ flex: 1 }} extraScrollHeight={30}>
        <Styled.Container padded isCard >
          <CustomInput
            placeholder={'Enter Id'}
            label={'User ID'}
            labelType={'top-label'}
            underlineWidth={1}
            isRequired={true}
            maxLength={10}
            minLength={5}
            value={userId}
            onChangeText={(text) => this.setState({ userId: text })}
            onChangeValidation={(status) => this.setState({userIdError: status});}
            renderLeftAction={() => {
              return (
                <View style={{ marginRight: 10 }}>
                  <Icons name={'envelope'} color={Colors.steel} size={20} />
                </View>
              )
            }}
          />
          <CustomInput
            placeholder={'Enter Password'}
            label={'Password'}
            labelType={'top-label'}
            underlineWidth={1}
            inputType={'password'}
            isRequired={true}
            value={password}
            onChangeText={(text) => this.setState({ password: text })}
            secureTextEntry={showPassword ? false : true}
            renderRightAction={() => {
              return (
                <TouchableOpacity activeOpacity={0.8} style={{ marginLeft: 10 }} onPress={() => this.setState({ showPassword: !showPassword })}>
                  <Icons name={showPassword ? 'eye' : 'eye-slash'} color={Colors.steel} size={20} />
                </TouchableOpacity>
              )
            }}
          />
          <CustomInput
            placeholder={'Re Enter Password'}
            label={'Confirm password'}
            labelType={'top-label'}
            underlineWidth={1}
            inputType={'password'}
            isRequired={true}
            value={confirmPassword}
            onChangeText={(text) => this.setState({ confirmPassword: text })}
            forceErrorMessage={password !== confirmPassword && 'Confirmation password do not match'}
          />
          <CustomInput
            placeholder={'Enter Email'}
            label={'Email'}
            labelType={'top-label'}
            underlineWidth={1}
            inputType={'email'}
            isRequired={true}
            value={email}
            onChangeText={(text) => this.setState({ email: text })}
          />
          <CustomInput
            placeholder={'Enter Phone Number'}
            label={'Phone number'}
            labelType={'top-label'}
            underlineWidth={1}
            inputType={'phone'}
            isRequired={true}
            value={phoneNumber}
            onChangeText={(text) => this.setState({ phoneNumber: text })}
          />
          <CustomInput
            placeholder={'Enter Description'}
            label={'Description'}
            labelType={'top-label'}
            underlineWidth={1}
            inputType={'text-area'}
            isRequired={true}
            value={description}
            onChangeText={(text) => this.setState({ description: text })}
          />
          <CustomInput
            placeholder={'Enter qty'}
            label={'Qty'}
            labelType={'top-label'}
            underlineWidth={1}
            inputType={'number'}
            isRequired={true}
            value={qty}
            onChangeText={(text) => this.setState({ qty: text })}
          />
        </Styled.Container>
      </KeyboardAwareScrollView>
    )
  }
}

Global Setup

Global const used to set global value. it used to set the style for all of this component. for more detail check here

Props

type CustomInputLabelType = 'top-label' | 'default' | 'left-label' | 'right-label'
type CustomInputType = 'email' | 'password' | 'phone' | 'phone-country' | 'number' | 'text' | 'text-area'
  const defaultCountryValue = {
    id: 101,
    name: 'Indonesia',
    nameWithFlag: '🇮🇩 Indonesia',
    flag: '🇮🇩',
    code: 'ID',
    callingCode: '62',
  }

Basically this component using TextInput props, and adding few new props that listed below.

Props Description Default
setRef: (ref) => void props to set input ref undefined
minLength: number props to set min length undefined
labelType: CustomInputLabelType props to set custom input label type check global const
label: string props to set label value check global const
inputType: CustomInputType props to set type of input text
labelStyle: TextStyle props to set label style check global const
errorLabelStyle: TextStyle props to set error label style check global const
underlineWidth: number props to set underline width check global const
underlineColor: string props to set underline color check global const
isRequired: boolean props to set if input required false
focusColor: string props to set focus color check global const
errorColor: string props to set error color check global const
validateOnChange: boolean props to set, do validation if onchange trigger check global const
passwordRegex: any props to set password regex validation check global const
forceErrorMessage: string props to force show error message, if no error exist check global const
errorEmail: string props to set error message once email is invalid check global const
errorPassword: string props to set error message once password is not match with regex validation check global const
errorRequired: (label: string) => string or string props to set error of required message check global const
errorMinimum: (label: string, min: number) => string or string props to set error of minimum length message check global const
errorMaximum: (label: string, max: number) => string or string props to set error of maximum length message check global const
renderLeftAction: () => any props to render left action undefined
renderRightAction: () => any props to render right action undefined
onChangeValidation: (status: boolean) => void props to get status of validation true
valueCountry: ISimpleCountryFlagResponse props to set default country code {id: 101, name: 'Indonesia', nameWithFlag: '🇮🇩 Indonesia', flag: '🇮🇩', code: 'ID', callingCode: '62',}
onSelectCountry: () => void props to get value of selected county ISimpleCountryFlagResponse
countryPlaceholder: string props to set select country placeholder -
countrySelectionLabel: string props to set select country selection label
countryValueLabel: string props to set label value of counrty input -
renderCountry: ({item, index, onPressItem, isSelected}) props to custom render country list item -
renderCountryHeader: ({label, leftAction, rightAction}) props to custom render header country list -