LendUp nested form(React)

by VeryGoodFiddle

HTML

<script src="https://js.verygoodvault.io/vgs-collect/1/vgs-collect-examples.js"></script>
<div id="app"></div>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

form {
  margin-bottom: 10px;
  width: 305px;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

label {
  font-size: 12px;
  display: block;
}

.fake-input iframe, input {
  height: 32px;
  max-width: 100%;
  border: solid 1px #ccc;
  border-radius: 4px;
  padding-left: 4px;
  margin-bottom: 5px;
}

input {
  margin-bottom: 5px;
  height: 30px;
}

.error-message {
  width: 100%;
  display: block;
  text-align: right;
  width: 100%;
  color: red;
  font-size: 10px;
}

React

const initErrorState = {
	card_name: '',
  card_number: '',
  card_cvc: '',
  card_exp: '',
}

class CheckoutForm extends React.Component {
  constructor(props) {
    super(props);
    this.form = {};
    this.paymentAmount = React.createRef();
    this.cardFee = React.createRef();
    this.handleSubmit = this.handleSubmit.bind(this);
    this.state = {
    	formErrors: initErrorState,
      initValidation: false,
    }
  }
  
  componentDidMount() {
    let that = this;
  	this.form = VGSCollect.create('tntq4dwvhri', function(state) {
     if(that.state.initValidation) {
        let form_errors = Object.assign({}, that.state.formErrors);
        for(let error in state) {
          form_errors[error] = state[error].errorMessages[0]; 
        }
        that.setState({formErrors: form_errors});
      }     
    });
  	
    this.form.field('#cc-name .fake-input', {
      type: 'text',
      name: 'card_name',
      placeholder: 'Joe Business',
      validations: ['required'],
		});

    this.form.field('#cc-number .fake-input', {
      type: 'card-number',
      name: 'card_number',
      successColor: '#4F8A10',
      errorColor: '#D8000C',
      placeholder: '4111 1111 1111 1111',
      validations: ['required', 'validCardNumber'],
    });

    this.form.field('#cc-cvc .fake-input', {
      type: 'card-security-code',
      name: 'card_cvc',
      placeholder: '344',
      validations: ['required', 'validCardSecurityCode'],
    });

    this.form.field('#cc-expiration-date .fake-input', {
      type: 'card-expiration-date',
      name: 'card_exp',
      placeholder: '01 / 20',
      serializers: [this.form.SERIALIZERS.separate({monthName: 'month', yearName: 'year'})],
      validations: ['required', 'validCardExpirationDate']
		});
  }
  
  handleSubmit(e){
  	e.preventDefault();
    this.setState({ formErrors: initErrorState, initValidation: true});
    let that = this;
  	this.form.submit('/post', {
    	data: {
      	paymentAmount:...