import type { ImageResponse, OnUploadImageResponse } from '../../data/image'; import { globalState } from '../../app/global-state'; import PowerduckState from '../../app/powerduck-state'; import NotificationProvider from '../../components/ui/notification'; import { AppHttpProvider } from '../api-http'; import { BrowserImageCompression } from './broswer-image-compression'; import { isNullOrEmpty } from './is-null-or-empty'; import StringUtils from './string-utils'; export class UploadImageHelperConfig { /** * The base path for uploaded files. */ static basePath: string = 'files'; /** * Indicates whether to include credentials such as cookies in the upload request. */ static includeCredentials: boolean = false; } export class UploadImageHelper { static async postImage( file: File, attractionType: string, disableCompression: boolean = false, compressionMaxMb: number = 0.5, url?: string, ): Promise { if (!(disableCompression || file.type == 'image/svg+xml')) { file = await BrowserImageCompression.compress(file, { maxSizeMB: compressionMaxMb, }); } const formData: FormData = new FormData(); const fileObj = new File([file], StringUtils.normalizeFileName(file.name)); url = !isNullOrEmpty(url) ? url : `${AppHttpProvider.enforceDomain}${UploadImageHelperConfig.basePath}`; formData.append('pathToFolder', `photos/${attractionType}/`); formData.append('file', fileObj); const response = await fetch(url, { method: 'POST', body: formData, headers: { [AppHttpProvider.authorizationHeaderName]: `Bearer ${AppHttpProvider.bearerToken}`, 'Accept-Language': PowerduckState.getCurrentLanguage(), }, credentials: UploadImageHelperConfig.includeCredentials ? PowerduckState.getIsDebugMode() ? 'include' : 'same-origin' : 'omit', }); if (!response.ok) { NotificationProvider.showErrorMessage(PowerduckState.getResourceValue('uploadFailed')); return null; } return (await response.json()) as ImageResponse; } static onUploadImage(e: File): OnUploadImageResponse { const urlCreator = globalState.URL || globalState.webkitURL; const imageUrl = urlCreator.createObjectURL(e); return { file: e, imagePath: imageUrl, }; } }