@totalsoft/rocket-ui
Version:
A set of reusable and composable React components built on top of Material UI core for developing fast and friendly web applications interfaces.
50 lines (40 loc) • 2.21 kB
text/typescript
import accepts from 'attr-accept'
import { curry, filter, flip, gt, gte, isEmpty, lt, lte, map, not, pipe, prop, sum } from 'ramda'
import { Validator } from './types'
const verifiedFileType = curry(flip(accepts))
const invalidFileType = curry(pipe(verifiedFileType, not)) as (arg1: string) => (arg2: File) => boolean
const getSize = prop<any>('size') as (file: File) => number
const totalSize = pipe(map(getSize), sum) as (files: unknown) => number
const biggerItems = curry((maxItemSize, file) => lt(maxItemSize, getSize(file)))
const smallerItems = curry((minItemSize, file) => gt(minItemSize, getSize(file)))
export const validFileTypes = curry<Validator>((accept, files, onError?) => {
const badFiles = filter(invalidFileType(accept as string), [...files])
if (isEmpty(badFiles)) return true
if (onError) onError({ message: 'Bad file type', files: badFiles })
return false
})
export const validMaxTotalSize = curry<Validator>((maxTotalSize, files, onError?) => {
const totalFileSize = totalSize(files) as number
if (gte(maxTotalSize as number, totalFileSize)) return true
if (onError) onError({ message: 'Total size exceeded', totalFileSize })
return false
})
export const validMaxItemSize = curry<Validator>((maxItemSize, files, onError?): boolean => {
const badFiles = filter(biggerItems(maxItemSize), Array.from(files))
if (isEmpty(badFiles)) return true
if (onError) onError({ message: 'File size exceeded', files: badFiles })
return false
}) as Validator
export const validMinTotalSize = curry<Validator>((minTotalSize, files, onError?): boolean => {
const totalFileSize = totalSize(files) as number
if (lte(minTotalSize as number, totalFileSize)) return true
if (onError) onError({ message: 'Total size too small', totalFileSize })
return false
})
export const validMinItemSize = curry<Validator>((minItemSize, files, onError?): boolean => {
const badFiles = filter(smallerItems(minItemSize), Array.from(files))
if (isEmpty(badFiles)) return true
if (onError) onError({ message: 'File size too small', files: badFiles })
return false
})
export default { validFileTypes, validMaxItemSize, validMaxTotalSize, validMinItemSize, validMinTotalSize }