use-file-picker
Version:
Simple react hook to open browser file selector.
1 lines • 27.2 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/helpers/openFileDialog.ts","../src/validators/useValidators.ts","../src/useFilePicker.ts","../src/useImperativeFilePicker.ts"],"sourcesContent":["export function openFileDialog(\n accept: string,\n multiple: boolean,\n callback: (arg: Event) => void,\n initializeWithCustomAttributes?: (arg: HTMLInputElement) => void\n): void {\n // this function must be called from a user\n // activation event (ie an onclick event)\n\n // Create an input element\n const inputElement = document.createElement('input');\n // Hide element and append to body (required to run on iOS safari)\n inputElement.style.display = 'none';\n document.body.appendChild(inputElement);\n // Set its type to file\n inputElement.type = 'file';\n // Set accept to the file types you want the user to select.\n // Include both the file extension and the mime type\n // if accept is \"*\" then dont set the accept attribute\n if (accept !== '*') inputElement.accept = accept;\n // Accept multiple files\n inputElement.multiple = multiple;\n // set onchange event to call callback when user has selected file\n //inputElement.addEventListener('change', callback);\n inputElement.addEventListener('change', arg => {\n callback(arg);\n // remove element\n document.body.removeChild(inputElement);\n });\n\n inputElement.addEventListener('cancel', () => {\n // remove element\n document.body.removeChild(inputElement);\n });\n\n if (initializeWithCustomAttributes) {\n initializeWithCustomAttributes(inputElement);\n }\n // dispatch a click event to open the file dialog\n inputElement.dispatchEvent(new MouseEvent('click'));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback } from 'react';\nimport type {\n SelectedFilesOrErrors,\n ExtractContentTypeFromConfig,\n UseFilePickerConfig,\n SelectedFiles,\n FileErrors,\n} from '../interfaces.js';\n\nexport const useValidators = <ConfigType extends UseFilePickerConfig<CustomErrors>, CustomErrors>({\n onFilesSelected: onFilesSelectedProp,\n onFilesSuccessfullySelected: onFilesSuccessfullySelectedProp,\n onFilesRejected: onFilesRejectedProp,\n onClear: onClearProp,\n validators,\n}: ConfigType) => {\n // setup validators' event handlers\n const onFilesSelected = useCallback(\n (data: SelectedFilesOrErrors<ExtractContentTypeFromConfig<ConfigType>, CustomErrors>) => {\n onFilesSelectedProp?.(data as any);\n validators?.forEach(validator => {\n validator.onFilesSelected(data as any);\n });\n },\n [onFilesSelectedProp, validators]\n );\n const onFilesSuccessfullySelected = useCallback(\n (data: SelectedFiles<ExtractContentTypeFromConfig<ConfigType>>) => {\n onFilesSuccessfullySelectedProp?.(data as any);\n validators?.forEach(validator => {\n validator.onFilesSuccessfullySelected(data as any);\n });\n },\n [validators, onFilesSuccessfullySelectedProp]\n );\n const onFilesRejected = useCallback(\n (errors: FileErrors<CustomErrors>) => {\n onFilesRejectedProp?.(errors);\n validators?.forEach(validator => {\n validator.onFilesRejected(errors);\n });\n },\n [validators, onFilesRejectedProp]\n );\n const onClear = useCallback(() => {\n onClearProp?.();\n validators?.forEach(validator => {\n validator.onClear?.();\n });\n }, [validators, onClearProp]);\n\n return {\n onFilesSelected,\n onFilesSuccessfullySelected,\n onFilesRejected,\n onClear,\n };\n};\n","import { useState, useCallback } from 'react';\nimport { fromEvent, type FileWithPath } from 'file-selector';\nimport type {\n UseFilePickerConfig,\n FileContent,\n FilePickerReturnTypes,\n UseFilePickerError,\n ReaderMethod,\n ExtractContentTypeFromConfig,\n} from './interfaces.js';\nimport { openFileDialog } from './helpers/openFileDialog.js';\nimport { useValidators } from './validators/useValidators.js';\nimport { Validator } from './validators.js';\n\n// empty array reference in order to avoid re-renders when no validators are passed as props\nconst EMPTY_ARRAY: Validator[] = [];\n\nfunction useFilePicker<\n CustomErrors = unknown,\n ConfigType extends UseFilePickerConfig<CustomErrors> = UseFilePickerConfig<CustomErrors>,\n>(props: ConfigType = {} as ConfigType): FilePickerReturnTypes<ExtractContentTypeFromConfig<ConfigType>, CustomErrors> {\n const {\n accept = '*',\n multiple = true,\n readAs = 'Text',\n readFilesContent = true,\n validators = EMPTY_ARRAY,\n initializeWithCustomParameters,\n } = props;\n\n const [plainFiles, setPlainFiles] = useState<File[]>([]);\n const [filesContent, setFilesContent] = useState<FileContent<ExtractContentTypeFromConfig<ConfigType>>[]>([]);\n const [fileErrors, setFileErrors] = useState<UseFilePickerError<CustomErrors>[]>([]);\n const [loading, setLoading] = useState<boolean>(false);\n const { onFilesSelected, onFilesSuccessfullySelected, onFilesRejected, onClear } = useValidators<\n ConfigType,\n CustomErrors\n >(props);\n\n const clear: () => void = useCallback(() => {\n setPlainFiles([]);\n setFilesContent([]);\n setFileErrors([]);\n }, []);\n\n const clearWithEventListener: () => void = useCallback(() => {\n clear();\n onClear?.();\n }, [clear, onClear]);\n\n const parseFile = useCallback(\n (file: FileWithPath) =>\n new Promise<FileContent<ExtractContentTypeFromConfig<ConfigType>>>(\n (\n resolve: (fileContent: FileContent<ExtractContentTypeFromConfig<ConfigType>>) => void,\n reject: (reason: UseFilePickerError) => void\n ) => {\n const reader = new FileReader();\n\n //availible reader methods: readAsText, readAsBinaryString, readAsArrayBuffer, readAsDataURL\n const readStrategy = reader[`readAs${readAs}` as ReaderMethod] as typeof reader.readAsText;\n readStrategy.call(reader, file, props.readAs === 'Text' ? props.encoding : undefined);\n\n const addError = ({ ...others }: UseFilePickerError) => {\n reject({ ...others });\n };\n\n reader.onload = async () =>\n Promise.all(\n validators.map(validator =>\n validator\n .validateAfterParsing(props, file, reader)\n .catch((err: UseFilePickerError) => Promise.reject(addError(err)))\n )\n )\n .then(() =>\n resolve({\n content: reader.result as string,\n name: file.name,\n lastModified: file.lastModified,\n path: file.path,\n size: file.size,\n type: file.type,\n } as FileContent<ExtractContentTypeFromConfig<ConfigType>>)\n )\n .catch(() => {});\n\n reader.onerror = () => {\n addError({ name: 'FileReaderError', readerError: reader.error, causedByFile: file });\n };\n }\n ),\n [props, readAs, validators]\n );\n\n const openFilePicker = useCallback(() => {\n const fileExtensions = accept instanceof Array ? accept.join(',') : accept;\n openFileDialog(\n fileExtensions,\n multiple,\n async evt => {\n clear();\n setLoading(true);\n const plainFileObjects = (await fromEvent(evt)) as FileWithPath[];\n\n const validationsBeforeParsing = (\n await Promise.all(\n validators.map(validator =>\n validator\n .validateBeforeParsing(props, plainFileObjects)\n .catch((err: UseFilePickerError | UseFilePickerError[]) => (Array.isArray(err) ? err : [err]))\n )\n )\n )\n .flat(1)\n .filter(Boolean) as UseFilePickerError<CustomErrors>[];\n\n setPlainFiles(plainFileObjects);\n setFileErrors(validationsBeforeParsing);\n if (validationsBeforeParsing.length) {\n setPlainFiles([]);\n onFilesRejected?.({ errors: validationsBeforeParsing });\n onFilesSelected?.({ errors: validationsBeforeParsing });\n setLoading(false);\n return;\n }\n\n if (!readFilesContent) {\n onFilesSelected?.({ plainFiles: plainFileObjects, filesContent: [] });\n setLoading(false);\n return;\n }\n\n const validationsAfterParsing: UseFilePickerError<CustomErrors>[] = [];\n const filesContent = (await Promise.all(\n plainFileObjects.map(file =>\n parseFile(file).catch(\n (fileError: UseFilePickerError<CustomErrors> | UseFilePickerError<CustomErrors>[]) => {\n validationsAfterParsing.push(...(Array.isArray(fileError) ? fileError : [fileError]));\n }\n )\n )\n )) as FileContent<ExtractContentTypeFromConfig<ConfigType>>[];\n setLoading(false);\n\n if (validationsAfterParsing.length) {\n setPlainFiles([]);\n setFilesContent([]);\n setFileErrors(errors => [...errors, ...validationsAfterParsing]);\n onFilesRejected?.({ errors: validationsAfterParsing });\n onFilesSelected?.({\n errors: validationsBeforeParsing.concat(validationsAfterParsing),\n });\n return;\n }\n\n setFilesContent(filesContent);\n setPlainFiles(plainFileObjects);\n setFileErrors([]);\n onFilesSuccessfullySelected?.({ filesContent: filesContent, plainFiles: plainFileObjects });\n onFilesSelected?.({\n plainFiles: plainFileObjects,\n filesContent: filesContent,\n });\n },\n initializeWithCustomParameters\n );\n }, [\n props,\n accept,\n clear,\n initializeWithCustomParameters,\n multiple,\n onFilesRejected,\n onFilesSelected,\n onFilesSuccessfullySelected,\n parseFile,\n readFilesContent,\n validators,\n ]);\n\n return {\n openFilePicker,\n filesContent,\n errors: fileErrors,\n loading,\n plainFiles,\n clear: clearWithEventListener,\n };\n}\n\nexport default useFilePicker;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback, useState } from 'react';\nimport type {\n ExtractContentTypeFromConfig,\n FileContent,\n ImperativeFilePickerReturnTypes,\n SelectedFiles,\n SelectedFilesOrErrors,\n useImperativeFilePickerConfig,\n} from './interfaces.js';\nimport useFilePicker from './useFilePicker.js';\n\n/**\n * A version of useFilePicker hook that keeps selected files between selections. On top of that it allows to remove files from the selection.\n */\nfunction useImperativeFilePicker<\n CustomErrors = unknown,\n ConfigType extends useImperativeFilePickerConfig<CustomErrors> = useImperativeFilePickerConfig<CustomErrors>,\n>(props: ConfigType): ImperativeFilePickerReturnTypes<ExtractContentTypeFromConfig<ConfigType>, CustomErrors> {\n const { onFilesSelected, onFilesSuccessfullySelected, validators, onFileRemoved } = props;\n\n const [allPlainFiles, setAllPlainFiles] = useState<File[]>([]);\n const [allFilesContent, setAllFilesContent] = useState<FileContent<ExtractContentTypeFromConfig<ConfigType>>[]>([]);\n\n const { openFilePicker, loading, errors, clear } = useFilePicker<CustomErrors, ConfigType>({\n ...props,\n onFilesSelected: (data: SelectedFilesOrErrors<ExtractContentTypeFromConfig<ConfigType>, CustomErrors>) => {\n if (!onFilesSelected) return;\n if (data.errors?.length) {\n return onFilesSelected(data);\n }\n // override the files property to return all files that were selected previously and in the current batch\n onFilesSelected({\n errors: undefined,\n plainFiles: [...allPlainFiles, ...(data.plainFiles || [])],\n filesContent: [...allFilesContent, ...(data.filesContent || [])] as any,\n });\n },\n onFilesSuccessfullySelected: (data: SelectedFiles<any>) => {\n setAllPlainFiles(previousPlainFiles => previousPlainFiles.concat(data.plainFiles));\n setAllFilesContent(previousFilesContent => previousFilesContent.concat(data.filesContent));\n\n if (!onFilesSuccessfullySelected) return;\n // override the files property to return all files that were selected previously and in the current batch\n onFilesSuccessfullySelected({\n plainFiles: [...allPlainFiles, ...(data.plainFiles || [])],\n filesContent: [...allFilesContent, ...(data.filesContent || [])],\n });\n },\n });\n\n const clearAll = useCallback(() => {\n clear();\n // clear previous files\n setAllPlainFiles([]);\n setAllFilesContent([]);\n }, [clear]);\n\n const removeFileByIndex = useCallback(\n (index: number) => {\n setAllFilesContent(previousFilesContent => [\n ...previousFilesContent.slice(0, index),\n ...previousFilesContent.slice(index + 1),\n ]);\n setAllPlainFiles(previousPlainFiles => {\n const removedFile = previousPlainFiles[index];\n if (!removedFile) {\n return previousPlainFiles;\n }\n validators?.forEach(validator => validator.onFileRemoved?.(removedFile, index));\n onFileRemoved?.(removedFile, index);\n return [...previousPlainFiles.slice(0, index), ...previousPlainFiles.slice(index + 1)];\n });\n },\n [validators, onFileRemoved]\n );\n\n const removeFileByReference = useCallback(\n (file: File) => {\n const index = allPlainFiles.findIndex(f => f === file);\n if (index === -1) return;\n removeFileByIndex(index);\n },\n [removeFileByIndex, allPlainFiles]\n );\n\n return {\n openFilePicker,\n plainFiles: allPlainFiles,\n filesContent: allFilesContent,\n loading,\n errors,\n clear: clearAll,\n removeFileByIndex,\n removeFileByReference,\n };\n}\n\nexport default useImperativeFilePicker;\n"],"names":["__defProp","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","__defNormalProp","__spreadValues"],"mappings":"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"}