nzediegwu1/EventManager

View on GitHub
client/src/components/addCenterComponent.js

Summary

Maintainability
D
1 day
Test Coverage
import React from 'react';
import { ModalHeader } from './modalHeader';
import { FormGroup } from './formGroup';
import { Option } from './selectOption';
import { apiLink, Transactions } from '../services';
import { connect } from 'react-redux';
import { setCenterDetails } from '../actions/centerActions';
import { setSubmitState } from '../actions/submitAction';
import { setCenterDefaults } from '../actions/pageActions';
import PropTypes from 'prop-types';
import { ModalFooter } from './modalFooter';
import { initialState } from '../reducers/pageReducer';

const inputAttrs = (inputType, inputName, placeholder, className, ref, required, autocomplete) => ({
  inputType,
  inputName,
  placeholder,
  className,
  ref,
  required,
  autocomplete,
});
const actionCreators = {
  setCenterDetails,
  setSubmitState,
  setCenterDefaults,
};

const mapStateToProps = state => ({
  modalTitle: state.page.modalTitle,
  required: state.page.required,
  centerDefaults: state.page.centerDefaults,
  disabled: state.process.disabled,
  visibility: state.process.visibility,
});

let centerId;
const folder = apiLink === 'http://localhost:8080' ? 'dev/centers' : 'prod/centers';
export class AddCenterComponent extends React.Component {
  handleSubmit = event => {
    event.preventDefault();
    const props = this.props;
    props.setSubmitState('processing');
    const closeModal = this.closeModal;
    const transactions = new Transactions(this.props, 'center');
    const saveCenter = res => {
      const centerData = {
        name: this.name.value,
        address: this.address.value,
        location: this.location.value,
        capacity: this.capacity.value,
        price: this.price.value,
        availability: this.availability.value,
        token: JSON.parse(localStorage.token).value,
        picture: res ? res.data.secure_url : undefined,
        publicId: res ? res.data.public_id : undefined,
      };
      transactions.addOrUpdate(centerId, centerData, err => {
        props.setSubmitState('initial');
        if (!err) {
          closeModal();
        }
      });
    };
    if (this.picture.files[0]) {
      const imageData = new FormData();
      const publicId = `${Date.now()}-${this.picture.files[0].name}`;
      imageData.append('file', this.picture.files[0]);
      imageData.append('tags', 'center, facilities, events');
      imageData.append('upload_preset', `${process.env.UPLOAD_PRESET}`);
      imageData.append('api_key', `${process.env.API_KEY}`);
      imageData.append('timestamp', (Date.now() / 1000) | 0);
      imageData.append('folder', folder);
      imageData.append('public_id', publicId);
      transactions.uploadImage(imageData, saveCenter, () => {
        props.setSubmitState('initial');
      });
    } else {
      saveCenter(undefined);
    }
  };
  closeModal = () => {
    this.picture.value = '';
    this.props.setCenterDefaults(initialState);
  };
  componentWillReceiveProps(nextState) {
    const centerDefaults = nextState.centerDefaults;
    if (centerDefaults.name !== null) {
      this.name.value = centerDefaults.name || '';
      this.address.value = centerDefaults.address || '';
      this.location.value = centerDefaults.location || '';
      this.capacity.value = centerDefaults.capacity;
      this.price.value = centerDefaults.price;
      this.availability.value = centerDefaults.availability;
    }
    centerId = centerDefaults.id;
  }
  render() {
    const { modalTitle, required } = this.props;
    return (
      <div
        className="modal fade"
        role="dialog"
        id="addNewCenter"
        tabIndex="-1"
        aria-labelledby="addNewCenterLabel"
        aria-hidden="true"
        data-keyboard="false"
        data-backdrop="static"
      >
        <div className="modal-dialog">
          <div className="modal-content eventModal">
            <ModalHeader id="addNewCenterTitle" title={modalTitle} action={this.closeModal} />
            <div className="modal-body mx-sm-auto col-sm-10">
              <form role="form" onSubmit={this.handleSubmit}>
                <FormGroup
                  image="glyphicons-21-home.png"
                  alt="centername"
                  inputProps={inputAttrs(
                    'text',
                    'centername',
                    'Center Name',
                    'form-control input-sm center-name',
                    input => (this.name = input),
                    'required'
                  )}
                />
                <FormGroup
                  image="glyphicons-139-picture.png"
                  alt="centerImage"
                  inputProps={inputAttrs(
                    'file',
                    'centerImage',
                    'Center Image',
                    'form-control input-sm center-image',
                    input => (this.picture = input),
                    required
                  )}
                />
                <FormGroup
                  image="glyphicons-243-map-marker.png"
                  alt="address"
                  inputProps={inputAttrs(
                    'text',
                    'street',
                    'Address',
                    'form-control input-sm center-address',
                    input => (this.address = input),
                    'required',
                    'street-address'
                  )}
                />
                <FormGroup
                  image="glyphicons-740-cadastral-map.png"
                  alt="city"
                  inputProps={inputAttrs(
                    'text',
                    'city',
                    'State/City',
                    'form-control input-sm center-city',
                    input => (this.location = input),
                    'required',
                    'address-level2'
                  )}
                />
                <FormGroup
                  image="glyphicons-44-group.png"
                  alt="capacity"
                  inputProps={inputAttrs(
                    'number',
                    'capacity',
                    'Capacity',
                    'form-control input-sm center-capacity',
                    input => (this.capacity = input),
                    'required'
                  )}
                />
                <FormGroup
                  image="glyphicons-228-usd.png"
                  alt="bookingAmount"
                  inputProps={inputAttrs(
                    'number',
                    'bookingAmount',
                    'Booking price(per day)',
                    'form-control input-sm center-price',
                    input => (this.price = input),
                    'required'
                  )}
                />
                <div className="form-group">
                  <select
                    required
                    ref={input => (this.availability = input)}
                    className="custom-select-sm center-availability"
                    id="set-availability"
                  >
                    <Option value="" text="Availability" disabled selected />
                    <Option value="open" text="open" />
                    <Option value="close" text="close" />
                  </select>
                </div>
                <ModalFooter
                  id="add-center-button"
                  type="submit"
                  disabled={this.props.disabled}
                  display={this.props.visibility}
                  closeModal={this.closeModal}
                />
              </form>
            </div>
          </div>
        </div>
      </div>
    );
  }
}
export const AddCenter = connect(mapStateToProps, actionCreators)(AddCenterComponent);
AddCenterComponent.propTypes = {
  modalTitle: PropTypes.string,
  required: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
  disabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
  visibility: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
};