mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-02-21 20:20:34 +09:00
42 lines
1.2 KiB
JavaScript
42 lines
1.2 KiB
JavaScript
export default class FileUploader {
|
|
constructor(file, url, clientMessageId, progressCallback) {
|
|
this.file = file
|
|
this.url = url
|
|
this.clientMessageId = clientMessageId
|
|
this.progressCallback = progressCallback
|
|
}
|
|
|
|
upload() {
|
|
const formdata = new FormData()
|
|
formdata.append("message[attachment]", this.file)
|
|
formdata.append("message[client_message_id]", this.clientMessageId)
|
|
|
|
const req = new XMLHttpRequest()
|
|
req.open("POST", this.url)
|
|
req.setRequestHeader("X-CSRF-Token", document.querySelector("meta[name=csrf-token]").content)
|
|
req.upload.addEventListener("progress", this.#uploadProgress.bind(this))
|
|
|
|
const result = new Promise((resolve, reject) => {
|
|
req.addEventListener("readystatechange", () => {
|
|
if (req.readyState === XMLHttpRequest.DONE) {
|
|
if (req.status < 400) {
|
|
resolve(req.response)
|
|
} else {
|
|
reject()
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
req.send(formdata)
|
|
return result
|
|
}
|
|
|
|
#uploadProgress(event) {
|
|
if (event.lengthComputable) {
|
|
const percent = Math.round((event.loaded / event.total) * 100)
|
|
this.progressCallback(percent, this.clientMessageId, this.file)
|
|
}
|
|
}
|
|
}
|