Home Reference Source Repository

src/components/admin/FormMediaEditor/FormMediaEditor.js

/*!
 * Codefolio
 * Copyright(c) 2016 MSMFSD
 * MIT Licensed
 */
import React, { Component, PropTypes } from 'react'
import Dropzone from 'react-dropzone'
import CssModules from 'react-css-modules'
import __CONFIG__ from '../../../../config'
import styles from './FormMediaEditor.css'

/**
 * @class FormMediaEditor
 * @extends {Component}
 */
class FormMediaEditor extends Component {

  constructor (props) {
    super(props)
    this.state = { files: [] }
  }

  /**
   * On files selected for update
   * @param {array} files
   */
  onDrop (files) {
    this.setState({ files: files })
    this.props.uploadAsyncFunc(files, this.props.auth.token)
  }

  /**
   * Remove media from store/form
   * @param {number} index
   * @param {object} e - event object
   */
  removeMediaItem (index, e) {
    e.preventDefault()
    this.props.removeMediaItemFunc(index)
  }

  render () {
    const { editProject } = this.props
    const API_URL = process.env.NODE_ENV !== 'production' ? __CONFIG__.API_DEV_URL : __CONFIG__.API_PROD_URL
    return (
      <div styleName="form-media-editor">
        <ul styleName="media-items" className={editProject.media.length > 0 ? 'show' : 'hide'}>{editProject.media.map((obj, index) => {
          return (
            <li key={index}>
              <figure>
                <img src={API_URL + '/uploads/projects/' + obj} width="50" />
                <button data-index={index} onClick={this.removeMediaItem.bind(this, index)} className="btn-floating btn-small right"><i className="material-icons">delete</i></button>
              </figure>
            </li>
          )
        })}</ul>
        <div styleName="dropzone-loader">
          <div className={editProject.editProjectFilesLoading ? 'show' : 'hide'} styleName="loading-div">
            <div styleName="cf-progress"><div className="progress"><div className="indeterminate"></div></div></div>
          </div>
          <Dropzone styleName="dropzone" onDrop={this.onDrop.bind(this)}>
            <div>Drop JPG/PNG file/s here, or click to browse your files.</div>
          </Dropzone>
        </div>
        <ul className={this.state.files && !editProject.editProjectFilesError && !editProject.editProjectFilesSuccess ? 'show' : 'hide'}>{this.state.files.map((obj, index) => {
          return (
            <li key={index}>
              <figure>
                <img src={obj.preview} width="40" />
              </figure>
            </li>
          )
        })}</ul>
        <div styleName="form-messages">{editProject.editProjectFilesError && editProject.editProjectFilesErrMessage}</div>
        <div styleName="form-messages" className={editProject.editProjectFilesSuccess ? 'show' : 'hide'}>Files uploaded successfully</div>
      </div>
    )
  }

}

FormMediaEditor.propTypes = {
  auth: PropTypes.object.isRequired,
  editProject: PropTypes.object.isRequired,
  uploadAsyncFunc: PropTypes.func.isRequired,
  removeMediaItemFunc: PropTypes.func.isRequired
}

FormMediaEditor = CssModules(FormMediaEditor, styles)
export default FormMediaEditor