Files
once-campfire/app/javascript/models/file_uploader.js
Kevin McConnell df76a227dc Hello world
First open source release of Campfire 🎉
2025-08-21 09:31:59 +01:00

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)
}
}
}