manifold/web/lib/firebase/storage.ts

50 lines
1.2 KiB
TypeScript
Raw Normal View History

import {
getStorage,
ref,
uploadBytesResumable,
getDownloadURL,
} from 'firebase/storage'
const storage = getStorage()
export const uploadImage = async (
username: string,
file: File,
onProgress?: (progress: number, isRunning: boolean) => void
) => {
const storageRef = ref(storage, `user-images/${username}/${file.name}`)
const uploadTask = uploadBytesResumable(storageRef, file)
let resolvePromise: (url: string) => void
let rejectPromise: (reason?: any) => void
const promise = new Promise<string>((resolve, reject) => {
resolvePromise = resolve
rejectPromise = reject
})
const unsubscribe = uploadTask.on(
'state_changed',
(snapshot) => {
const progress = snapshot.bytesTransferred / snapshot.totalBytes
const isRunning = snapshot.state === 'running'
if (onProgress) onProgress(progress, isRunning)
},
(error) => {
// A full list of error codes is available at
// https://firebase.google.com/docs/storage/web/handle-errors
rejectPromise(error)
unsubscribe()
},
() => {
getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => {
resolvePromise(downloadURL)
})
unsubscribe()
}
)
return await promise
}