import { useAppDispatch } from 'domains/store' import { clearAllUploads } from 'domains/store/slice' import { useCallback, useContext } from 'preact/hooks' import SeamlyFileUploadContext from 'ui/components/core/seamly-file-upload-context' import { useSeamlyStateContext } from './seamly-state-hooks' const useSeamlyFileUploadContext = () => { const upload = useContext(SeamlyFileUploadContext) if (!upload) { throw new Error( 'useSeamlyFileUploadContext has to be used within ', ) } return upload } export const useFileUploadMeta = () => { const { showFileUpload, entryMeta: { options, optionsOverride }, options: { features: { uploads: uploadsFeature }, }, } = useSeamlyStateContext() const { allowedMimeTypes: allowedMimeTypesOverride, maxSize: maxSizeOverride, } = optionsOverride?.upload || {} const { enabled: uploadsEnabled, enabledFromEntry: uploadsEnabledFromEntry } = uploadsFeature || {} const { allowedMimeTypes, maxSize } = { ...(options.upload || { allowedMimeTypes: [], maxSize: 0, }), ...(allowedMimeTypesOverride ? { allowedMimeTypes: allowedMimeTypesOverride } : {}), ...(maxSizeOverride ? { maxSize: maxSizeOverride } : {}), } return { showFileUpload, accountAllowsUploads: !!uploadsFeature, serviceAllowsUploads: uploadsEnabledFromEntry || uploadsEnabled, allowedMimeTypes, maxSize, } } export const useFileUploads = () => { const { currentUploads } = useSeamlyStateContext() const dispatch = useAppDispatch() const upload = useSeamlyFileUploadContext() const uploadFile = useCallback( (file) => { upload(file) }, [upload], ) const clearUploads = useCallback(() => { dispatch(clearAllUploads()) }, [dispatch]) return { uploadFile, clearUploads, currentUploads, isUploading: currentUploads.some((file) => file.uploading), isComplete: currentUploads.every((file) => file.complete), } }