import React from 'react' import ReactCrop, { makeAspectCrop } from 'react-image-crop' import RandomImage from './RandomImage' import PhotoCredit from './PhotoCredit' import { fileToDataURL } from '../lib/util' const getCroppedImg = (imageDataURL, pixelCrop) => { const canvas = document.createElement('canvas') canvas.width = pixelCrop.width canvas.height = pixelCrop.height const ctx = canvas.getContext('2d') return new Promise(resolve => { const image = new Image() image.src = imageDataURL image.onload = () => { ctx.drawImage( image, pixelCrop.x, pixelCrop.y, pixelCrop.width, pixelCrop.height, 0, 0, pixelCrop.width, pixelCrop.height ) resolve(canvas.toDataURL('image/jpeg')) } }) } const INITIAL_STATE = { crop: null, imageAspectRatio: null, pixelCrop: null, photographer: null } export default class extends React.Component { constructor(props) { super(props) this.state = INITIAL_STATE this.selectImage = this.selectImage.bind(this) this.removeImage = this.removeImage.bind(this) this.onImageLoaded = this.onImageLoaded.bind(this) this.onCropChange = this.onCropChange.bind(this) this.onDragEnd = this.onDragEnd.bind(this) } componentWillReceiveProps(nextProps) { if (this.state.crop && this.props.aspectRatio !== nextProps.aspectRatio) { // update crop for editor container aspect-ratio change this.setState({ crop: makeAspectCrop( { ...this.state.crop, aspect: nextProps.aspectRatio }, this.state.imageAspectRatio ) }) } } async onDragEnd() { if (this.state.pixelCrop) { const croppedImg = await getCroppedImg(this.props.imageDataURL, this.state.pixelCrop) this.props.onChange({ backgroundImageSelection: croppedImg }) } } onCropChange(crop, pixelCrop) { this.setState({ crop: { ...crop, aspect: this.props.aspectRatio }, pixelCrop }) } onImageLoaded(image) { const imageAspectRatio = image.width / image.height const initialCrop = { x: 0, y: 0, width: 100, aspect: this.props.aspectRatio } this.setState({ imageAspectRatio, crop: makeAspectCrop(initialCrop, imageAspectRatio) }) } selectImage(e, { photographer }) { const file = e.target ? e.target.files[0] : e return fileToDataURL(file).then(dataURL => this.setState({ photographer }, () => { this.props.onChange({ backgroundImage: dataURL, backgroundImageSelection: null, photographer }) }) ) } removeImage() { this.setState(INITIAL_STATE, () => { this.props.onChange({ backgroundImage: null, backgroundImageSelection: null }) }) } render() { let content = (
Click the button below to upload a background image:

Or use a random Unsplash image:
) if (this.props.imageDataURL) { content = (
Background image ×
{this.state.photographer && }
) } return (
{content}
) } }