aboutsummaryrefslogtreecommitdiffstats
path: root/app/javascript/activetext/attachment_upload.js
diff options
context:
space:
mode:
authorJavan Makhmali <javan@javan.us>2018-02-14 14:35:34 -0500
committerJavan Makhmali <javan@javan.us>2018-02-14 14:35:34 -0500
commit55e2df15cdf86671801a22caaa4ea26d4e8497d5 (patch)
treed97b5cff03a91ab7bd86df1944b4de97c63ccb95 /app/javascript/activetext/attachment_upload.js
parentba71c73836c084c95ca89021f9c9a455d8c94134 (diff)
downloadrails-55e2df15cdf86671801a22caaa4ea26d4e8497d5.tar.gz
rails-55e2df15cdf86671801a22caaa4ea26d4e8497d5.tar.bz2
rails-55e2df15cdf86671801a22caaa4ea26d4e8497d5.zip
Extract AttachmentUpload
Diffstat (limited to 'app/javascript/activetext/attachment_upload.js')
-rw-r--r--app/javascript/activetext/attachment_upload.js45
1 files changed, 45 insertions, 0 deletions
diff --git a/app/javascript/activetext/attachment_upload.js b/app/javascript/activetext/attachment_upload.js
new file mode 100644
index 0000000000..a716f1f589
--- /dev/null
+++ b/app/javascript/activetext/attachment_upload.js
@@ -0,0 +1,45 @@
+import { DirectUpload } from "activestorage"
+
+export class AttachmentUpload {
+ constructor(attachment, element) {
+ this.attachment = attachment
+ this.element = element
+ this.directUpload = new DirectUpload(attachment.file, this.directUploadUrl, this)
+ }
+
+ start() {
+ this.directUpload.create(this.directUploadDidComplete.bind(this))
+ }
+
+ directUploadWillStoreFileWithXHR(xhr) {
+ xhr.upload.addEventListener("progress", event => {
+ const progress = event.loaded / event.total * 100
+ this.attachment.setUploadProgress(progress)
+ })
+ }
+
+ directUploadDidComplete(error, attributes) {
+ if (error) {
+ throw new Error(`Direct upload failed: ${error}`)
+ }
+
+ this.attachment.setAttributes({
+ sgid: attributes.attachable_sgid,
+ url: this.createBlobUrl(attributes.signed_id, attributes.filename)
+ })
+ }
+
+ createBlobUrl(signedId, filename) {
+ return this.blobUrlTemplate
+ .replace(":signed_id", signedId)
+ .replace(":filename", encodeURIComponent(filename))
+ }
+
+ get directUploadUrl() {
+ return this.element.dataset.directUploadUrl
+ }
+
+ get blobUrlTemplate() {
+ return this.element.dataset.blobUrlTemplate
+ }
+}