import { ref } from '@vue/composition-api' // @ts-ignore import { slug } from '@@/starpad/project.json' import { useCurrentUser } from '../user/currentUser' const url = process.env.CLOUDINARY_UNSIGNED_UPLOAD_URL export function useUploadFile () { const progress = ref(0) const uploading = ref(false) const { user } = useCurrentUser() function uploadFile (file: File, tags: string[] = [], folder = []) { if (!user.value) throw new Error('User not logged in') return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() const fd = new FormData() xhr.open('POST', url, true) xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest') progress.value = 0 uploading.value = true // Update progress (can be used to show progress indicator) xhr.upload.addEventListener('progress', (e) => { progress.value = e.loaded / e.total }) xhr.onreadystatechange = (e) => { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { // File uploaded successfully const response = JSON.parse(xhr.responseText) resolve({ provider: 'cloudinary', providerAssetId: response.public_id, publicUrl: response.secure_url, signature: response.signature, filename: response.original_filename, bytes: response.bytes, width: response.width, height: response.height, format: response.format, providerData: { cloudinary: { publicId: response.public_id, }, }, rawResponse: response, }) } else { const error = new Error('Upload failed') // @ts-ignore error.event = e reject(error) } uploading.value = false } } const folders = [ 'public', slug, // @ts-ignore user.value.id, ...folder, ] fd.append('upload_preset', 'starpad_unsigned') fd.append('tags', ['browser_upload', ...tags].join(',')) fd.append('file', file) fd.append('folder', folders.filter(Boolean).join('/')) xhr.send(fd) }) } return { uploadFile, progress, uploading, } }