summaryrefslogtreecommitdiff
path: root/frontend/app/common/uploadImage.component.js
blob: 3ae41c8f6da1dfddb85c7ba6e3f3550f88579a54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import React, { Component } from 'react'

import { renderThumbnail } from './upload.helpers'

export default class UploadImageComponent extends Component {
  constructor(props) {
    super(props)
    document.body.addEventListener("dragover", this.dragOver.bind(this))
    document.body.addEventListener("dragleave", this.dragLeave.bind(this))
    document.body.addEventListener("drop", this.upload.bind(this))
  }
  
  dragOver(e) {
    e.stopPropagation()
    e.preventDefault()
    document.body.className = 'dragging'
  }

  dragLeave(e) {
    e.stopPropagation()
    e.preventDefault()
    document.body.className = ''
  }

  upload(e) {
    e.preventDefault()
    document.body.className = ''
    const files = e.dataTransfer ? e.dataTransfer.files : e.target.files
    let i
    let file
    for (i = 0; i < files.length; i++) {
      file = files[i]
      if (file && file.type.match('image.*')) break
    }
    if (!file) {
      console.log('No file specified')
      return
    }
    const fr = new FileReader()
    fr.onload = fileReaderEvent => {
      fr.onload = null
      const img = new Image()
      img.onload = () => {
        img.onload = null
        this.resizeAndUpload(file, img)
      }
      img.src = fileReaderEvent.target.result
    }
    fr.readAsDataURL(file)
  }

  resizeAndUpload(file, img) {
    const canvas = renderThumbnail(img, this.props)
    canvas.toBlob(blob => {
      this.props.onUpload({ file, img, canvas, blob, freshen: true })
    }, 'image/jpeg', this.props.quality || 80)
  }

  render() {
    return (
      <div className='uploadButton'>
        <input
          type="file"
          accept="image/*"
          onChange={this.upload.bind(this)}
          required
        />
        <div className='dragCurtain'>
          <div className='dragLabel'>Drop image here</div>
        </div>
      </div>
    )
  }
}