UNPKG

instantjob-recruiter-client

Version:

a set of tools for creating an instantjob recruiter react client

117 lines (106 loc) 3.48 kB
import React, {Component} from 'react' import classNames from 'classnames/bind' import {MdInsertDriveFile, MdEdit, MdFileUpload} from 'react-icons/lib/md' import Field from './field' import TimeAgo from 'components/utils/time_ago' import ProgressIndicator from './progress_indicator' import auto_bind from 'common/auto_bind' import {action_upload_entity_file} from 'common/fields' import {download_file} from 'common/utilities' const cx = classNames.bind(require('../styles/field.scss')) // copy pasted from react-dropzone/src/getDataTransferItems function get_file(event) { let dataTransferItemsList = []; if (event.dataTransfer) { const dt = event.dataTransfer; if (dt.files && dt.files.length) { dataTransferItemsList = dt.files; } else if (dt.items && dt.items.length) { // During the drag, even the dataTransfer.files is null // but Chrome implements some drag store, which is accesible via dataTransfer.items dataTransferItemsList = dt.items; } } else if (event.target && event.target.files) { dataTransferItemsList = event.target.files; } return dataTransferItemsList[0] } class FileField extends Component { constructor(props) { super(props) this.state = { uploading: false, } auto_bind(this) } view() { let {file: {url, name}} = this.props download_file(url, name) } open(e) { this.input.click() } upload(e) { e.preventDefault() this.props.upload_file(get_file(e, false)) .on('progress', ({percent: uploading}) => { this.setState({uploading}) }) .then(() => this.setState({uploading: false})) .then(() => this.input.value = "") } render() { let {file: {updated_at, url}, ...props} = this.props let {uploading} = this.state let display, className, onClick if (uploading) { className = 'field__display_uploading' display = [ <ProgressIndicator small key={'uploading'} completed={uploading} total={100} text="##%"/> ] } else if (url) { display = [ <div key={'file'} className={cx('field__display-file')}> <div onClick={this.view} className={cx('field__display-file-preview')}> <MdInsertDriveFile /> </div> <div className={cx('field__display-file-edit')} onClick={this.open}> <MdEdit /> </div> </div>, <div key={'updated_at'} className={cx('field__display-updated-at')}> Mis à jour <TimeAgo>{updated_at}</TimeAgo> </div> ] } else { className = 'field__display_upload' onClick = this.open display = [ <MdFileUpload key={'upload'} /> ] } return ( <Field {...props} category="file"> <input ref={(input) => this.input = input} type="file" className={cx('field__input')} onChange={this.upload} accept={["jpg", "jpeg", "gif", "png", "tif", "tiff", "txt", "doc", "pps", "pdf", "mp3", "wav", "avi", "mpg", "mpeg", "wmv", "iso", "flv", "mov", "dvr-ms", "vob", "zip", "rar", "r00", "r01"].map((extension) => '.' + extension).join(",")} multiple={false} /> <div className={cx('field__display', className)} onClick={onClick}> {display} </div> </Field> ) } } FileField.defaultProps = { file: {url: "", updated_at: ""}, show_label: true, editable: true, } export default FileField