diff --git a/example/index.html b/example/index.html index 9ac865a4..a9ff161e 100644 --- a/example/index.html +++ b/example/index.html @@ -9,7 +9,7 @@ window.repoFiles = { _posts: { "2015-02-14-this-is-a-post.md": { - content: "---\ntitle: This is a post\ndate: 2015-02-14T00:00:00.000Z\n---\n\n# I Am a Title in Markdown\n\nHello, world\n" + content: "---\ntitle: This is a post\nimage: /nf-logo.png\ndate: 2015-02-14T00:00:00.000Z\n---\n\n# I Am a Title in Markdown\n\nHello, world\n" } }, _faqs: { diff --git a/example/nf-logo.png b/example/nf-logo.png new file mode 100644 index 00000000..55be9e73 Binary files /dev/null and b/example/nf-logo.png differ diff --git a/src/components/Widgets/ImageControl.js b/src/components/Widgets/ImageControl.js index 40e1ffe9..68d9c884 100644 --- a/src/components/Widgets/ImageControl.js +++ b/src/components/Widgets/ImageControl.js @@ -3,14 +3,112 @@ import React from 'react'; export default class ImageControl extends React.Component { constructor(props) { super(props); + + this.state = { + currentImage: props.value + }; + + this.revokeCurrentImage = this.revokeCurrentImage.bind(this); 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); + } + + componentWillUnmount() { + this.revokeCurrentImage(); + } + + revokeCurrentImage() { + if (this.state.currentImage instanceof File) { + window.URL.revokeObjectURL(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(); } handleChange(e) { - this.props.onChange(e.target.value); + e.stopPropagation(); + e.preventDefault(); + this.revokeCurrentImage(); + const fileList = e.dataTransfer ? e.dataTransfer.files : e.target.files; + const files = [...fileList]; + const imageType = /^image\//; + + // 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) { + // Custom toString function on file, so it can be used on regular image fields + file.toString = function() { + return window.URL.createObjectURL(file); + }; + } + + this.props.onChange(file); + this.setState({currentImage: file}); + } + + renderImageName() { + if (!this.state.currentImage) return null; + + if (this.state.currentImage instanceof File) { + return this.state.currentImage.name; + } else if (typeof this.state.currentImage === 'string') { + const fileName = this.state.currentImage; + return fileName.substring(fileName.lastIndexOf('/') + 1); + } + + return null; } render() { - return ; + const imageName = this.renderImageName(); + return ( +