UNPKG

appirio-tech-react-components-test10

Version:

Topcoder UI Kit library of components for our React apps.

125 lines (107 loc) 4.06 kB
import React from 'react' import PropTypes from 'prop-types' import _ from 'lodash' import * as filepicker from 'filestack-js/build/browser/filestack.min.js' require('./FilePicker.scss') class FilePicker extends React.Component { constructor(props) { super(props) this.state = { dragText: props.options.dragText, dropPaneId: _.uniqueId('filepicker-drag-drop-pane_') } this.onChange = this.onChange.bind(this) } onChange(event) { this.props.onSuccess(this.props.options.multiple ? event.fpfiles : event.fpfile) } componentWillReceiveProps(nextProps) { this.setState({dragText: nextProps.options.dragText}) } componentDidMount() { const filepickerElement = this.refs.filepicker const filepickerProgress = this.refs.filepickerProgress const apikey = this.props.apiKey const clientOptions = {} if (this.props.options.cname) { clientOptions.cname = this.props.options.cname } const client = filepicker.init(apikey, clientOptions) const opts = {} opts.displayMode = 'dropPane' opts.container = this.state.dropPaneId opts.maxFiles = 4 opts.storeTo = {} opts.storeTo.container = this.props.options.storeContainer opts.storeTo.region = 'us-east-1' opts.dropPane = {} opts.dropPane.customText = ' ' opts.dropPane.overlay = false opts.dropPane.showIcon = false opts.dropPane.disableClick = true opts.dropPane.onDragEnter = () => { this.setState({dragText: 'Drop to upload'}) filepickerElement.classList.add('drag-entered') } opts.dropPane.onDragLeave = () => { this.setState({dragText: this.props.options.dragText}) filepickerElement.classList.remove('drag-entered') } opts.dropPane.onSuccess = (files) => { this.setState({dragText: this.props.options.dragText}) filepickerElement.classList.remove('in-progress') this.props.onSuccess(this.props.options.multiple ? files : files[0]) } opts.dropPane.onError = () => { filepickerElement.classList.remove('in-progress') this.setState({dragText: this.props.options.dragText}) } opts.dropPane.onProgress = (percentage) => { filepickerElement.classList.remove('drag-entered') filepickerElement.classList.add('in-progress') filepickerProgress.style.width = percentage + '%' } opts.dropPane.onClick = () => { const overlayOpts = {} overlayOpts.maxFiles = opts.maxFiles overlayOpts.uploadInBackground = false overlayOpts.onFileUploadFinished = (files) => { this.props.onSuccess(this.props.options.multiple ? files : files[0]) } overlayOpts.storeTo = opts.storeTo overlayOpts.fromSources = this.props.options.fromSources client.picker(overlayOpts).open() } client.picker(opts).open() filepickerElement.addEventListener('change', this.onChange, false) } componentWillUnmount() { if (this.refs.filepicker) { this.refs.filepicker.removeEventListener('change', this.onChange, false) } } render() { const {mode, options} = this.props const {dragText} = this.state // add data-fp- prefix to all keys const opts = _.mapKeys(options, (v, k) => { const hyphenated = k.replace(/([a-zA-Z])(?=[A-Z])/g, '$1-').toLowerCase() return `data-fp-${hyphenated}` }) return ( <div ref="filepicker" className="filepicker"> <input type={mode} onChange={this.onChange} {...opts}/> <div className="filepicker-drag-drop-pane" id={this.state.dropPaneId} {...opts}> <span className="filepicker-drag-drop-text">{ dragText }</span> <button type="button" className="tc-btn tc-btn-secondary tc-btn-sm">Add File</button> </div> <div className="filepicker-progress" ref="filepickerProgress"></div> </div> ) } } FilePicker.propTypes = { apiKey: PropTypes.string.isRequired, mode: PropTypes.string.isRequired, options: PropTypes.object.isRequired, onSuccess: PropTypes.func.isRequired } export default FilePicker