Skip to content

Commit 9a4d030

Browse files
committed
Upgrade Filestack v2 -> v3
1 parent 45bba08 commit 9a4d030

File tree

2 files changed

+107
-73
lines changed

2 files changed

+107
-73
lines changed
Lines changed: 102 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,117 @@
1-
import React, { PropTypes } from 'react'
1+
import React, {PropTypes} from 'react'
22
import _ from 'lodash'
3-
import filepicker from 'filepicker-js'
3+
import * as filepicker from 'filestack-js'
4+
45
require('./FilePicker.scss')
56

67
class FilePicker extends React.Component {
7-
constructor(props) {
8-
super(props)
9-
this.state = { dragText : props.options.dragText }
10-
this.onChange = this.onChange.bind(this)
11-
}
12-
13-
onChange(event) {
14-
this.props.onSuccess(this.props.options.multiple ? event.fpfiles : event.fpfile)
15-
}
16-
17-
componentWillReceiveProps(nextProps) {
18-
this.setState({ dragText : nextProps.options.dragText })
19-
}
20-
21-
componentDidMount() {
22-
const filepickerElement = this.refs.filepicker
23-
const filepickerButton = this.refs.filepickerButton
24-
const filepickerProgress = this.refs.filepickerProgress
25-
filepicker.setKey(this.props.apiKey)
26-
const opts = _.assign({}, this.props.options)
27-
opts.container = opts.storeContainer
28-
opts.dragEnter = () => {
29-
this.setState({ dragText : 'Drop to upload'})
30-
filepickerElement.classList.add('drag-entered')
8+
constructor(props) {
9+
super(props)
10+
this.state = {dragText: props.options.dragText}
11+
this.onChange = this.onChange.bind(this)
3112
}
32-
opts.dragLeave = () => {
33-
this.setState({ dragText : opts.dragText })
34-
filepickerElement.classList.remove('drag-entered')
13+
14+
onChange(event) {
15+
this.props.onSuccess(this.props.options.multiple ? event.fpfiles : event.fpfile)
3516
}
36-
opts.onSuccess = (files) => {
37-
this.setState({ dragText : opts.dragText })
38-
filepickerElement.classList.remove('in-progress')
39-
this.props.onSuccess(this.props.options.multiple ? files : files[0])
17+
18+
componentWillReceiveProps(nextProps) {
19+
this.setState({dragText: nextProps.options.dragText})
4020
}
41-
opts.onError = () => {
42-
filepickerElement.classList.remove('in-progress')
43-
this.setState({ dragText : opts.dragText })
21+
22+
componentDidMount() {
23+
24+
const filepickerElement = this.refs.filepicker
25+
const filepickerButton = this.refs.filepickerButton
26+
const filepickerProgress = this.refs.filepickerProgress
27+
28+
const apikey = this.props.apiKey
29+
const clientOptions = this.props.options.cname ? {cname: this.props.options.cname} : {}
30+
const client = filepicker.init(apikey, clientOptions)
31+
32+
const opts = {}
33+
opts.displayMode = 'dropPane'
34+
opts.container = 'filepicker-drag-drop-pane'
35+
opts.maxFiles = 4
36+
37+
opts.storeTo = {}
38+
opts.storeTo.container = this.props.options.storeContainer
39+
opts.storeTo.region = 'us-east-1'
40+
41+
opts.dropPane = {}
42+
opts.dropPane.customText = ' '
43+
opts.dropPane.overlay = false
44+
opts.dropPane.showIcon = false
45+
opts.dropPane.disableClick = true
46+
opts.dropPane.onDragEnter = () => {
47+
this.setState({dragText: 'Drop to upload'})
48+
filepickerElement.classList.add('drag-entered')
49+
}
50+
opts.dropPane.onDragLeave = () => {
51+
this.setState({dragText: this.props.options.dragText})
52+
filepickerElement.classList.remove('drag-entered')
53+
}
54+
opts.dropPane.onSuccess = (files) => {
55+
this.setState({dragText: this.props.options.dragText})
56+
filepickerElement.classList.remove('in-progress')
57+
this.props.onSuccess(this.props.options.multiple ? files : files[0])
58+
}
59+
opts.dropPane.onError = () => {
60+
filepickerElement.classList.remove('in-progress')
61+
this.setState({dragText: this.props.options.dragText})
62+
}
63+
opts.dropPane.onProgress = (percentage) => {
64+
filepickerElement.classList.remove('drag-entered')
65+
filepickerElement.classList.add('in-progress')
66+
filepickerProgress.style.width = percentage + '%'
67+
}
68+
opts.dropPane.onClick = () => {
69+
const overlayOpts = {}
70+
overlayOpts.maxFiles = opts.maxFiles
71+
overlayOpts.uploadInBackground = false
72+
overlayOpts.onFileUploadFinished = (files) => {
73+
this.props.onSuccess(this.props.options.multiple ? files : files[0])
74+
}
75+
overlayOpts.storeTo = opts.storeTo
76+
client.picker(overlayOpts).open()
77+
}
78+
79+
client.picker(opts).open();
80+
81+
filepickerElement.addEventListener('change', this.onChange, false)
4482
}
45-
opts.onProgress = (percentage) => {
46-
filepickerElement.classList.remove('drag-entered')
47-
filepickerElement.classList.add('in-progress')
48-
filepickerProgress.style.width = percentage + '%'
83+
84+
componentWillUnmount() {
85+
this.refs.filepicker.removeEventListener('change', this.onChange, false)
86+
}
87+
88+
render() {
89+
const {mode, options} = this.props
90+
const {dragText} = this.state
91+
92+
// add data-fp- prefix to all keys
93+
const opts = _.mapKeys(options, (v, k) => {
94+
const hyphenated = k.replace(/([a-zA-Z])(?=[A-Z])/g, '$1-').toLowerCase()
95+
return `data-fp-${hyphenated}`
96+
})
97+
return (
98+
<div ref="filepicker" className="filepicker">
99+
<input type={mode} onChange={this.onChange} {...opts}/>
100+
<div className="filepicker-drag-drop-pane" id="filepicker-drag-drop-pane" {...opts}>
101+
<span className="filepicker-drag-drop-text">{ dragText }</span>
102+
<button type="button" className="tc-btn tc-btn-secondary tc-btn-sm">Add File</button>
103+
</div>
104+
<div className="filepicker-progress" ref="filepickerProgress"></div>
105+
</div>
106+
)
49107
}
50-
filepicker.makeDropPane(filepickerElement, opts)
51-
filepicker.constructWidget(filepickerButton)
52-
filepickerElement.addEventListener('change', this.onChange, false)
53-
}
54-
55-
componentWillUnmount() {
56-
this.refs.filepicker.removeEventListener('change', this.onChange, false)
57-
}
58-
59-
render() {
60-
const { mode, options } = this.props
61-
const { dragText } = this.state
62-
63-
// add data-fp- prefix to all keys
64-
const opts = _.mapKeys(options, (v, k) => {
65-
const hyphenated = k.replace(/([a-zA-Z])(?=[A-Z])/g, '$1-').toLowerCase()
66-
return `data-fp-${hyphenated}`
67-
})
68-
return (
69-
<div ref="filepicker" className="filepicker">
70-
<input type={mode} onChange={this.onChange} {...opts} />
71-
<div className="filepicker-drag-drop-pane">
72-
<span className="filepicker-drag-drop-text">{ dragText }</span>
73-
<input type="filepicker" ref="filepickerButton" className="filepicker-picker" {...opts} />
74-
</div>
75-
<div className="filepicker-progress" ref="filepickerProgress"></div>
76-
</div>
77-
)
78-
}
79108
}
80109

81110
FilePicker.propTypes = {
82-
apiKey: PropTypes.string.isRequired,
83-
mode: PropTypes.string.isRequired,
84-
options: PropTypes.object.isRequired,
85-
onSuccess: PropTypes.func.isRequired
111+
apiKey: PropTypes.string.isRequired,
112+
mode: PropTypes.string.isRequired,
113+
options: PropTypes.object.isRequired,
114+
onSuccess: PropTypes.func.isRequired
86115
}
87116

88117
export default FilePicker

components/FilePicker/FilePicker.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@
5252
width: 0;
5353
background-color: $tc-dark-blue-70;
5454
}
55+
56+
.fsp-drop-pane__container {
57+
background-color: transparent;
58+
border-style: none;
59+
}
5560
}
5661
}
5762

0 commit comments

Comments
 (0)