2025-03-27 23:25:57 -08:00

140 lines
4.3 KiB
JavaScript

import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import GoldenRetriever from '@uppy/golden-retriever'
import AwsS3 from '@uppy/aws-s3'
// @see https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/uppy/s3-multipart.js
const UppyHook = {
mounted() {
let live = this
const element = live.el;
// Get the value of the `data-endpoint` attribute
// const endpoint = element.getAttribute('data-endpoint');
new Uppy()
.use(Dashboard, {
inline: true,
target: '#uppy-dashboard',
theme: 'dark',
proudlyDisplayPoweredByUppy: false
})
.use(AwsS3, {
signPart(file, partData) {
return new Promise((resolve) => {
live.pushEvent('sign_part', partData, (reply, ref) => {
// console.log(`We got a response from sign_part pushEvent. reply=${JSON.stringify(reply)}`)
let { url, headers } = reply
// console.log(`got url=${url} and headers=${headers} from reply`)
resolve({
url,
headers
})
})
})
},
createMultipartUpload(file) {
console.log(`createMultipartUpload with file ${JSON.stringify(file)}`)
let { name, type } = file.meta
let size = file.size
let payload = { name, type, size }
return new Promise((resolve) => {
live.pushEvent('initiate_multipart_upload', payload, (reply, ref) => {
console.log(`payload=${JSON.stringify(payload)}`)
console.log(`initiate_multipart_upload pushEvent response callback.`)
console.log(`got reply=${JSON.stringify(reply)}`)
console.log(`got ref=${JSON.stringify(ref)}`)
let output = {
uploadId: reply?.upload_id,
key: reply?.key
}
resolve(output)
})
})
},
completeMultipartUpload(file, { key, uploadId, parts }) {
// console.log(`completeMultipartUpload with file ${JSON.stringify(file)}, parts=${JSON.stringify(parts)}`)
// parts = parts.map((part) => Object.assign({}, part, { etag: part.etag.replace(/^"|"$/, "") } ))
parts = parts.map((part) => ({
etag: part.ETag.replace(/"/g, ""),
part_number: part.PartNumber
}));
// console.log(parts)
let payload = { key, uploadId, parts }
return new Promise((resolve) => {
live.pushEvent('complete_multipart_upload', payload, (reply, ref) => {
// console.log(`payload=${JSON.stringify(payload)}`)
// console.log(`complete_multipart_upload pushEvent response callback.`)
// console.log(`got reply=${JSON.stringify(reply)}`)
// console.log(`got ref=${JSON.stringify(ref)}`)
let output = {
location
}
resolve(output)
})
})
},
getUploadParameters(file, options) {
// console.log(`getUploadParameters with file=${JSON.stringify(file)}, options=${JSON.stringify(options)}`)
return new Promise((resolve) => {
let payload = { type: file.type, name: file.name }
live.pushEvent('get_upload_parameters', payload, (reply, ref) => {
// console.log(`reply=${JSON.stringify(reply)}`)
let { type, method, url } = reply
let output = {
type, method, url
}
resolve(output)
})
})
},
listParts(file, { uploadId, key }) {
// console.log('pushing list_parts event')
let payload = {
uploadId,
key
}
live.pushEvent('list_parts', payload, (reply) => {
return reply
})
},
shouldUseMultipart(file) {
// Use multipart only for files larger than 100MiB.
// return file.size > 100 * 2 ** 20;
return file.size > 100 * 2;
},
});
},
beforeUpdate() { },
updated() {
// console.log("UppyHook updated");
},
destroyed() { },
disconnected() { },
reconnected() { }
}
export default UppyHook