use-file-picker
Version:
Simple react hook to open browser file selector.
1 lines • 17.9 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../src/validators/validatorBase.ts","../../src/validators/fileAmountLimitValidator/index.ts","../../src/validators/fileSizeValidator/index.ts","../../src/validators/imageDimensionsValidator/index.ts","../../src/validators/persistentFileAmountLimitValidator/index.ts","../../src/validators/FileTypeValidator/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { type FileWithPath } from 'file-selector';\nimport type {\n ExtractContentTypeFromConfig,\n FileErrors,\n SelectedFiles,\n SelectedFilesOrErrors,\n UseFilePickerConfig,\n} from '../interfaces.js';\n\nexport abstract class Validator<\n CustomErrors = unknown,\n ConfigType extends UseFilePickerConfig<CustomErrors> = UseFilePickerConfig<any>,\n> {\n protected invokerHookId: string | undefined;\n\n /**\n * This method is called before parsing the selected files. It is called once per selection.\n * @param config passed to the useFilePicker hook\n * @param plainFiles files selected by the user\n */\n abstract validateBeforeParsing(config: ConfigType, plainFiles: File[]): Promise<void>;\n /**\n * This method is called after parsing the selected files. It is called once per every parsed file.\n * @param config passed to the useFilePicker hook\n * @param file parsed file selected by the user\n * @param reader instance that was used to parse the file\n */\n abstract validateAfterParsing(config: ConfigType, file: FileWithPath, reader: FileReader): Promise<void>;\n\n /**\n * lifecycle method called after user selection (regardless of validation result)\n */\n onFilesSelected(\n _data: SelectedFilesOrErrors<ExtractContentTypeFromConfig<ConfigType>, CustomErrors>\n ): Promise<void> | void {}\n /**\n * lifecycle method called after successful validation\n */\n onFilesSuccessfullySelected(_data: SelectedFiles<ExtractContentTypeFromConfig<ConfigType>>): Promise<void> | void {}\n /**\n * lifecycle method called after failed validation\n */\n onFilesRejected(_data: FileErrors<CustomErrors>): Promise<void> | void {}\n /**\n * lifecycle method called after the selection is cleared\n */\n onClear(): Promise<void> | void {}\n\n /**\n * This method is called when file is removed from the list of selected files.\n * Invoked only by the useImperativeFilePicker hook\n * @param _removedFile removed file\n * @param _removedIndex index of removed file\n */\n onFileRemoved(_removedFile: File, _removedIndex: number): Promise<void> | void {}\n}\n","import type { FileAmountLimitError, FileAmountLimitConfig, UseFilePickerConfig } from '../../interfaces.js';\nimport { Validator } from '../validatorBase.js';\n\nexport default class FileAmountLimitValidator extends Validator {\n constructor(private limitAmountOfFilesConfig: FileAmountLimitConfig) {\n super();\n }\n\n validateBeforeParsing(_config: UseFilePickerConfig, plainFiles: File[]): Promise<void> {\n const { min, max } = this.limitAmountOfFilesConfig;\n if (max && plainFiles.length > max) {\n return Promise.reject({\n name: 'FileAmountLimitError',\n reason: 'MAX_AMOUNT_OF_FILES_EXCEEDED',\n } as FileAmountLimitError);\n }\n\n if (min && plainFiles.length < min) {\n return Promise.reject({\n name: 'FileAmountLimitError',\n reason: 'MIN_AMOUNT_OF_FILES_NOT_REACHED',\n } as FileAmountLimitError);\n }\n return Promise.resolve();\n }\n validateAfterParsing(): Promise<void> {\n return Promise.resolve();\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { type FileWithPath } from 'file-selector';\nimport type { FileSizeError, FileSizeRestrictions, UseFilePickerConfig } from '../../interfaces.js';\nimport { Validator } from '../validatorBase.js';\n\nexport default class FileSizeValidator extends Validator {\n constructor(private fileSizeRestrictions: FileSizeRestrictions) {\n super();\n }\n\n async validateBeforeParsing(_config: UseFilePickerConfig, plainFiles: File[]): Promise<void> {\n const { minFileSize, maxFileSize } = this.fileSizeRestrictions;\n\n if (!minFileSize && !maxFileSize) {\n return Promise.resolve();\n }\n\n const errors = plainFiles\n .map(file => getFileSizeError({ minFileSize, maxFileSize, file }))\n .filter(error => !!error) as FileSizeError[];\n\n return errors.length > 0 ? Promise.reject(errors) : Promise.resolve();\n }\n async validateAfterParsing(_config: UseFilePickerConfig, _file: FileWithPath): Promise<void> {\n return Promise.resolve();\n }\n}\n\nconst getFileSizeError = ({\n file,\n maxFileSize,\n minFileSize,\n}: {\n minFileSize: number | undefined;\n maxFileSize: number | undefined;\n file: FileWithPath;\n}): FileSizeError | undefined => {\n if (minFileSize) {\n const minBytes = minFileSize;\n if (file.size < minBytes) {\n return { name: 'FileSizeError', reason: 'FILE_SIZE_TOO_SMALL', causedByFile: file };\n }\n }\n if (maxFileSize) {\n const maxBytes = maxFileSize;\n if (file.size > maxBytes) {\n return { name: 'FileSizeError', reason: 'FILE_SIZE_TOO_LARGE', causedByFile: file };\n }\n }\n};\n","import { type FileWithPath } from 'file-selector';\nimport type { ImageDimensionError, ImageDimensionRestrictionsConfig, UseFilePickerConfig } from '../../interfaces.js';\nimport { Validator } from '../validatorBase.js';\n\nexport default class ImageDimensionsValidator extends Validator {\n constructor(private imageSizeRestrictions: ImageDimensionRestrictionsConfig) {\n super();\n }\n\n validateBeforeParsing(): Promise<void> {\n return Promise.resolve();\n }\n validateAfterParsing(config: UseFilePickerConfig, file: FileWithPath, reader: FileReader): Promise<void> {\n const { readAs } = config;\n if (readAs === 'DataURL' && this.imageSizeRestrictions && isImage(file.type)) {\n return checkImageDimensions(file, reader.result as string, this.imageSizeRestrictions);\n }\n return Promise.resolve();\n }\n}\n\nconst isImage = (fileType: string) => fileType.startsWith('image');\n\nconst checkImageDimensions = (\n file: FileWithPath,\n imgDataURL: string,\n imageSizeRestrictions: ImageDimensionRestrictionsConfig\n) =>\n new Promise<void>((resolve, reject) => {\n const img = new Image();\n const error: ImageDimensionError = {\n name: 'ImageDimensionError',\n causedByFile: file,\n reasons: [],\n };\n img.onload = function () {\n const { maxHeight, maxWidth, minHeight, minWidth } = imageSizeRestrictions;\n const { width, height } = this as unknown as typeof img;\n\n if (maxHeight && maxHeight < height) error.reasons.push('IMAGE_HEIGHT_TOO_BIG');\n if (minHeight && minHeight > height) error.reasons.push('IMAGE_HEIGHT_TOO_SMALL');\n if (maxWidth && maxWidth < width) error.reasons.push('IMAGE_WIDTH_TOO_BIG');\n if (minWidth && minWidth > width) error.reasons.push('IMAGE_WIDTH_TOO_SMALL');\n\n if (error.reasons.length) {\n reject(error);\n } else {\n resolve();\n }\n };\n img.onerror = function () {\n error.reasons.push('IMAGE_NOT_LOADED');\n reject(error);\n };\n img.src = imgDataURL;\n });\n","import type { FileAmountLimitConfig, FileAmountLimitError, UseFilePickerConfig } from '../../interfaces.js';\nimport { Validator } from '../validatorBase.js';\n\nclass PersistentFileAmountLimitValidator extends Validator {\n private previousPlainFiles: File[] = [];\n\n constructor(private limitFilesConfig: FileAmountLimitConfig) {\n super();\n }\n\n override onClear(): void {\n this.previousPlainFiles = [];\n }\n\n override onFileRemoved(_removedFile: File, removedIndex: number): void {\n this.previousPlainFiles.splice(removedIndex, 1);\n }\n\n validateBeforeParsing(_config: UseFilePickerConfig, plainFiles: File[]): Promise<void> {\n const fileAmount = this.previousPlainFiles.length + plainFiles.length;\n const { min, max } = this.limitFilesConfig;\n if (max && fileAmount > max) {\n return Promise.reject({\n name: 'FileAmountLimitError',\n reason: 'MAX_AMOUNT_OF_FILES_EXCEEDED',\n } as FileAmountLimitError);\n }\n\n if (min && fileAmount < min) {\n return Promise.reject({\n name: 'FileAmountLimitError',\n reason: 'MIN_AMOUNT_OF_FILES_NOT_REACHED',\n } as FileAmountLimitError);\n }\n\n this.previousPlainFiles = [...this.previousPlainFiles, ...plainFiles];\n\n return Promise.resolve();\n }\n\n validateAfterParsing(): Promise<void> {\n return Promise.resolve();\n }\n}\n\nexport default PersistentFileAmountLimitValidator;\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { FileWithPath, UseFilePickerConfig } from '../../interfaces.js';\nimport { Validator } from '../validatorBase.js';\n\nexport default class FileTypeValidator extends Validator {\n constructor(private readonly acceptedFileExtensions: string[]) {\n super();\n }\n\n validateBeforeParsing(_config: UseFilePickerConfig, plainFiles: File[]): Promise<void> {\n const fileExtensionErrors = plainFiles.reduce<{ name: string; reason: string; causedByFile: File }[]>(\n (errors, currentFile) => {\n const fileExtension = currentFile.name.split('.').pop();\n if (!fileExtension) {\n return [\n ...errors,\n {\n name: 'FileTypeError',\n reason: 'FILE_EXTENSION_NOT_FOUND',\n causedByFile: currentFile,\n },\n ];\n }\n if (!this.acceptedFileExtensions.includes(fileExtension)) {\n return [\n ...errors,\n {\n name: 'FileTypeError',\n reason: 'FILE_TYPE_NOT_ACCEPTED',\n causedByFile: currentFile,\n },\n ];\n }\n\n return errors;\n },\n []\n );\n\n return fileExtensionErrors.length > 0 ? Promise.reject(fileExtensionErrors) : Promise.resolve();\n }\n\n validateAfterParsing(_config: UseFilePickerConfig, _file: FileWithPath, _reader: FileReader): Promise<void> {\n return Promise.resolve();\n }\n}\n"],"names":["__defProp","__defNormalProp","__publicField"],"mappings":"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"}