2023-10-27 18:50:13 +00:00
|
|
|
import { UploadFile } from '@solid-primitives/upload'
|
2024-06-24 17:50:27 +00:00
|
|
|
import { thumborUrl } from '../config/config'
|
2023-11-14 15:10:00 +00:00
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
export const handleImageUpload = async (uploadFile: UploadFile, token: string) => {
|
2023-10-27 18:50:13 +00:00
|
|
|
const formData = new FormData()
|
|
|
|
formData.append('media', uploadFile.file, uploadFile.name)
|
|
|
|
const response = await fetch(`${thumborUrl}/image`, {
|
|
|
|
method: 'POST',
|
2023-11-14 15:10:00 +00:00
|
|
|
body: formData,
|
2024-06-24 17:50:27 +00:00
|
|
|
headers: token ? { Authorization: token } : {},
|
2023-10-27 18:50:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
const location = response.headers.get('Location')
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
const url = `${thumborUrl}/unsafe/production${location?.slice(0, location.lastIndexOf('/'))}`
|
|
|
|
const originalFilename = location?.slice(location.lastIndexOf('/') + 1)
|
2023-10-27 18:50:13 +00:00
|
|
|
|
2023-11-02 16:47:57 +00:00
|
|
|
// check that image is available
|
|
|
|
await new Promise<void>((resolve, reject) => {
|
|
|
|
let retryCount = 0
|
|
|
|
const checkUploadedImage = () => {
|
|
|
|
const uploadedImage = new Image()
|
|
|
|
uploadedImage.addEventListener('load', () => resolve())
|
|
|
|
uploadedImage.addEventListener('error', () => {
|
|
|
|
retryCount++
|
|
|
|
if (retryCount >= 3) {
|
|
|
|
return reject()
|
|
|
|
}
|
|
|
|
setTimeout(() => checkUploadedImage(), 1000)
|
|
|
|
})
|
|
|
|
uploadedImage.src = url
|
|
|
|
}
|
|
|
|
checkUploadedImage()
|
|
|
|
})
|
|
|
|
|
2023-10-27 18:50:13 +00:00
|
|
|
return {
|
|
|
|
originalFilename,
|
2023-11-14 15:10:00 +00:00
|
|
|
url,
|
2023-10-27 18:50:13 +00:00
|
|
|
}
|
|
|
|
}
|