uploader.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import React from "react"
  2. import moment from "moment"
  3. import misago from "misago"
  4. import ajax from "misago/services/ajax"
  5. import snackbar from "misago/services/snackbar"
  6. export default class extends React.Component {
  7. onChange = event => {
  8. const file = event.target.files[0]
  9. if (!file) {
  10. return
  11. }
  12. let upload = {
  13. id: null,
  14. key: getRandomKey(),
  15. progress: 0,
  16. error: null,
  17. filename: file.name
  18. }
  19. this.props.onAttachmentsChange([upload].concat(this.props.attachments))
  20. const data = new FormData()
  21. data.append("upload", file)
  22. ajax
  23. .upload(misago.get("ATTACHMENTS_API"), data, progress => {
  24. upload.progress = progress
  25. this.props.onAttachmentsChange(this.props.attachments.concat())
  26. })
  27. .then(
  28. data => {
  29. data.uploaded_on = moment(data.uploaded_on)
  30. Object.assign(upload, data)
  31. this.props.onAttachmentsChange(this.props.attachments.concat())
  32. },
  33. rejection => {
  34. if (rejection.status === 400 || rejection.status === 413) {
  35. upload.error = rejection.detail
  36. this.props.onAttachmentsChange(this.props.attachments.concat())
  37. } else {
  38. snackbar.apiError(rejection)
  39. }
  40. }
  41. )
  42. }
  43. render() {
  44. return (
  45. <input id="editor-upload-field" onChange={this.onChange} type="file" />
  46. )
  47. }
  48. }
  49. export function getRandomKey() {
  50. return "upld-" + Math.round(new Date().getTime())
  51. }