import React, { useState, createRef } from 'react'; import { StyleSheet, Text, View, ViewStyle } from 'react-native'; import { responsiveFontSize, responsiveWidth } from 'react-native-responsive-dimensions'; import Modal from 'react-native-modal'; import { Button } from 'react-native-paper'; import _isEmpty from 'lodash/isEmpty'; import _omit from 'lodash/omit'; import { Dictionary, ErrorField } from '../../types'; import { ConnectorCredential } from 'pluggy-js/dist/types'; import ConnnectCredential from './ConnectCredential'; import { colors } from '../../theme/colors'; type ConnectFormProps = { credentials: ConnectorCredential[]; onSubmit: Function; color: string; inputErrors: ErrorField[] | undefined; showModal: boolean; onModalOk: () => void; modalMessage: String; onClean: Function; isLoading: boolean; }; type InputRef = { focus: Function; blur: Function; }; const ConnectForm = (props: ConnectFormProps) => { const { credentials, onSubmit, onClean, inputErrors, showModal, onModalOk, modalMessage, isLoading, color, } = props; const refs = credentials?.map(_ => createRef()); const [form, setForm] = useState>({}); const [formErrors, setFormErrors] = useState>(); const handleUpdate = (name: string, text: string) => { setForm(prevForm => ({ ...prevForm, [name]: text })); if (formErrors) { setFormErrors(prevFormErrors => _omit(prevFormErrors, name)); } if (inputErrors) { onClean(name); } }; const handleSubmitEditing = (index: number) => { return () => { const nextRef = refs[index + 1]; if (nextRef) { nextRef.current!.focus(); } else { refs[index].current!.blur(); } }; }; const handleSubmit = () => { const validations = credentials.reduce((dict: Dictionary, credential) => { //@ts-ignore const { name, validation, validationMessage } = credential; const value = form[name]; if (!RegExp(validation).test(value)) { dict[name] = validationMessage; } return dict; }, {}); if (_isEmpty(validations)) { onSubmit(form); } else { setFormErrors(validations); } }; const getErrorMessage = (name: string) => { // onSubmit validations (FE) if (formErrors) { return formErrors[name]; } // response validations (BE) if (inputErrors) { return inputErrors.find(e => e.parameter === name)?.message; } }; const containerStyles: ViewStyle = { flex: 1, justifyContent: 'space-evenly', alignItems: 'center', backgroundColor: color, }; return ( {credentials.map(({ label, name, type }, index) => { const isLast = index === credentials.length - 1; const submitBtn = isLast ? 'done' : 'next'; const error = getErrorMessage(name); return ( ); })}