static-cms/src/components/Widgets/ImageControl.js

106 lines
2.6 KiB
JavaScript
Raw Normal View History

2016-05-30 16:55:32 -07:00
import React from 'react';
2016-06-07 21:27:34 -03:00
import { truncateMiddle } from '../../lib/textHelper';
import ImageProxy from '../../valueObjects/ImageProxy';
2016-05-30 16:55:32 -07:00
2016-06-07 20:15:28 -03:00
const MAX_DISPLAY_LENGTH = 50;
2016-05-30 16:55:32 -07:00
export default class ImageControl extends React.Component {
constructor(props) {
super(props);
this.state = {
currentImage: props.value ? new ImageProxy(props.value, null, true) : null
};
2016-06-07 11:38:19 -03:00
this.revokeCurrentImage = this.revokeCurrentImage.bind(this);
2016-05-30 16:55:32 -07:00
this.handleChange = this.handleChange.bind(this);
this.handleFileInputRef = this.handleFileInputRef.bind(this);
this.handleClick = this.handleClick.bind(this);
this.handleDragEnter = this.handleDragEnter.bind(this);
this.handleDragOver = this.handleDragOver.bind(this);
this.renderImageName = this.renderImageName.bind(this);
}
2016-06-07 11:38:19 -03:00
revokeCurrentImage() {
2016-06-07 20:15:28 -03:00
if (this.state.currentImage && !this.state.currentImage.uploaded) {
this.props.onRemoveMedia(this.state.currentImage);
}
}
handleFileInputRef(el) {
this._fileInput = el;
}
handleClick(e) {
this._fileInput.click();
}
handleDragEnter(e) {
e.stopPropagation();
e.preventDefault();
}
handleDragOver(e) {
e.stopPropagation();
e.preventDefault();
2016-05-30 16:55:32 -07:00
}
handleChange(e) {
e.stopPropagation();
e.preventDefault();
2016-06-07 11:38:19 -03:00
this.revokeCurrentImage();
let imageRef = null;
const fileList = e.dataTransfer ? e.dataTransfer.files : e.target.files;
const files = [...fileList];
const imageType = /^image\//;
2016-06-05 23:37:19 -03:00
// Iterate through the list of files and return the first image on the list
const file = files.find((currentFile) => {
if (imageType.test(currentFile.type)) {
return currentFile;
}
});
if (file) {
2016-06-07 20:15:28 -03:00
imageRef = new ImageProxy(file.name, file);
this.props.onAddMedia(imageRef);
}
this.props.onChange(imageRef);
2016-06-07 20:15:28 -03:00
this.setState({currentImage: imageRef});
}
renderImageName() {
2016-06-07 20:15:28 -03:00
if (!this.state.currentImage) return null;
2016-06-07 21:33:12 -03:00
return truncateMiddle(this.state.currentImage.uri, MAX_DISPLAY_LENGTH);
2016-05-30 16:55:32 -07:00
}
render() {
const imageName = this.renderImageName();
return (
<div
onDragEnter={this.handleDragEnter}
onDragOver={this.handleDragOver}
onDrop={this.handleChange}
>
<span onClick={this.handleClick}>
{imageName ? imageName : 'Click or drop imag here.'}
</span>
<input
type="file"
accept="image/*"
onChange={this.handleChange}
style={styles.input}
ref={this.handleFileInputRef}
/>
</div>
);
2016-05-30 16:55:32 -07:00
}
}
const styles = {
input: {
display: 'none'
}
};