Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions src/hooks/useFilesValidation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer
const styles = useThemeStyles();
const {translate} = useLocalize();

const [isValidatingReceipts, setIsValidatingReceipts] = useState(DEFAULT_IS_VALIDATING_RECEIPTS);
const [isValidatingReceipts, setIsValidatingReceipts] = useState<boolean>();
const [isValidatingMultipleFiles, setIsValidatingMultipleFiles] = useState(false);

const [isErrorModalVisible, setIsErrorModalVisible] = useState(false);
Expand Down Expand Up @@ -81,11 +81,12 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer
}, []);

const resetValidationState = useCallback(() => {
setIsValidatingReceipts(undefined);
setIsValidatingMultipleFiles(false);
setIsErrorModalVisible(false);
setPdfFilesToRender([]);
setIsLoaderVisible(false);
setValidFilesToUpload([]);
setIsValidatingMultipleFiles(false);
setFileError(null);
setInvalidFileExtension('');
setErrorQueue([]);
Expand Down Expand Up @@ -200,7 +201,7 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer

Promise.all(
files.map((file, index) =>
isValidFile(file, items.at(index), {isCheckingMultipleFiles: files.length > 1, isValidatingReceipts: validationOptions?.isValidatingReceipts ?? isValidatingReceipts}).then(
isValidFile(file, items.at(index), {isValidatingMultipleFiles: files.length > 1, isValidatingReceipts: validationOptions?.isValidatingReceipts ?? isValidatingReceipts}).then(
(isValid) => (isValid ? file : null),
),
),
Expand Down Expand Up @@ -282,7 +283,7 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer
};

const validateFiles = (files: FileObject[], items?: DataTransferItem[], validationOptions?: ValidationOptions) => {
if (validationOptions?.isValidatingReceipts) {
if (validationOptions?.isValidatingReceipts !== undefined) {
setIsValidatingReceipts(validationOptions.isValidatingReceipts);
}

Expand All @@ -300,7 +301,7 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer
}
};

const onConfirm = () => {
const onConfirmError = () => {
if (fileError === CONST.FILE_VALIDATION_ERRORS.MAX_FILE_LIMIT_EXCEEDED) {
setIsErrorModalVisible(false);
validateAndResizeFiles(filesToValidate.current, dataTransferItemList.current);
Expand All @@ -324,7 +325,7 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer
const sortedFiles = sortFilesByOriginalOrder(validFilesToUpload, originalFileOrder.current);
// If we're validating attachments we need to use InteractionManager to ensure
// the error modal is dismissed before opening the attachment modal
if (!isValidatingReceipts && fileError) {
if (isValidatingReceipts === false && fileError) {
setIsErrorModalVisible(false);
// eslint-disable-next-line @typescript-eslint/no-deprecated
InteractionManager.runAfterInteractions(() => {
Expand Down Expand Up @@ -354,7 +355,7 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer
}}
onPassword={() => {
validatedPDFs.current.push(file);
if (isValidatingReceipts) {
if (isValidatingReceipts === true) {
collectedErrors.current.push({error: CONST.FILE_VALIDATION_ERRORS.PROTECTED_FILE});
} else {
validFiles.current.push(file);
Expand All @@ -374,7 +375,7 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer
if (!fileError) {
return '';
}
const prompt = getFileValidationErrorText(fileError, {fileType: invalidFileExtension}, isValidatingReceipts).reason;
const prompt = getFileValidationErrorText(fileError, {fileType: invalidFileExtension}, isValidatingReceipts === true).reason;
if (fileError === CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE_MULTIPLE || fileError === CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE) {
return (
<Text>
Expand All @@ -388,8 +389,8 @@ function useFilesValidation(onFilesValidated: (files: FileObject[], dataTransfer

const ErrorModal = (
<ConfirmModal
title={getFileValidationErrorText(fileError, {fileType: invalidFileExtension}, isValidatingReceipts).title}
onConfirm={onConfirm}
title={getFileValidationErrorText(fileError, {fileType: invalidFileExtension}, isValidatingReceipts === true).title}
onConfirm={onConfirmError}
onCancel={hideModalAndReset}
isVisible={isErrorModalVisible}
prompt={getModalPrompt()}
Expand Down
6 changes: 3 additions & 3 deletions src/libs/fileDownload/FileUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -552,18 +552,18 @@ const normalizeFileObject = (file: FileObject): Promise<FileObject> => {

type ValidateAttachmentOptions = {
isValidatingReceipts?: boolean;
isCheckingMultipleFiles?: boolean;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Canges in this file are unrelated to the fix and just a refactor to make the parameter more consistent with other parts of this logic

isValidatingMultipleFiles?: boolean;
};

const validateAttachment = (file: FileObject, validationOptions?: ValidateAttachmentOptions) => {
const maxFileSize = validationOptions?.isValidatingReceipts ? CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE : CONST.API_ATTACHMENT_VALIDATIONS.MAX_SIZE;

if (validationOptions?.isValidatingReceipts && !isValidReceiptExtension(file)) {
return validationOptions?.isCheckingMultipleFiles ? CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE_MULTIPLE : CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE;
return validationOptions?.isValidatingMultipleFiles ? CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE_MULTIPLE : CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE;
}

if (!Str.isImage(file.name ?? '') && !hasHeicOrHeifExtension(file) && (file?.size ?? 0) > maxFileSize) {
return validationOptions?.isCheckingMultipleFiles ? CONST.FILE_VALIDATION_ERRORS.FILE_TOO_LARGE_MULTIPLE : CONST.FILE_VALIDATION_ERRORS.FILE_TOO_LARGE;
return validationOptions?.isValidatingMultipleFiles ? CONST.FILE_VALIDATION_ERRORS.FILE_TOO_LARGE_MULTIPLE : CONST.FILE_VALIDATION_ERRORS.FILE_TOO_LARGE;
}

if (validationOptions?.isValidatingReceipts && (file?.size ?? 0) < CONST.API_ATTACHMENT_VALIDATIONS.MIN_SIZE) {
Expand Down
14 changes: 7 additions & 7 deletions tests/unit/FileUtilsTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ describe('FileUtils', () => {
describe('validateAttachment', () => {
it('should not return FILE_TOO_SMALL when validating small attachment', () => {
const file = createMockFile('file.csv', CONST.API_ATTACHMENT_VALIDATIONS.MIN_SIZE - 1);
const error = FileUtils.validateAttachment(file, {isCheckingMultipleFiles: false, isValidatingReceipts: false});
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here...

const error = FileUtils.validateAttachment(file, {isValidatingMultipleFiles: false, isValidatingReceipts: false});
expect(error).not.toBe(CONST.FILE_VALIDATION_ERRORS.FILE_TOO_SMALL);
});

it('should return FILE_TOO_SMALL when validating small receipt', () => {
const file = createMockFile('receipt.jpg', CONST.API_ATTACHMENT_VALIDATIONS.MIN_SIZE - 1);
const error = FileUtils.validateAttachment(file, {isCheckingMultipleFiles: false, isValidatingReceipts: true});
const error = FileUtils.validateAttachment(file, {isValidatingMultipleFiles: false, isValidatingReceipts: true});
expect(error).toBe(CONST.FILE_VALIDATION_ERRORS.FILE_TOO_SMALL);
});

Expand All @@ -65,31 +65,31 @@ describe('FileUtils', () => {

it('should return FILE_TOO_LARGE_MULTIPLE when checking multiple files', () => {
const file = createMockFile('file.pdf', CONST.API_ATTACHMENT_VALIDATIONS.MAX_SIZE + 1);
const error = FileUtils.validateAttachment(file, {isCheckingMultipleFiles: true, isValidatingReceipts: false});
const error = FileUtils.validateAttachment(file, {isValidatingMultipleFiles: true, isValidatingReceipts: false});
expect(error).toBe(CONST.FILE_VALIDATION_ERRORS.FILE_TOO_LARGE_MULTIPLE);
});

it('should return WRONG_FILE_TYPE for invalid receipt extension', () => {
const file = createMockFile('receipt.exe', CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE - 1);
const error = FileUtils.validateAttachment(file, {isCheckingMultipleFiles: false, isValidatingReceipts: true});
const error = FileUtils.validateAttachment(file, {isValidatingMultipleFiles: false, isValidatingReceipts: true});
expect(error).toBe(CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE);
});

it('should prioritize WRONG_FILE_TYPE over FILE_TOO_LARGE for receipts', () => {
const file = createMockFile('receipt.exe', CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE + 10);
const error = FileUtils.validateAttachment(file, {isCheckingMultipleFiles: false, isValidatingReceipts: true});
const error = FileUtils.validateAttachment(file, {isValidatingMultipleFiles: false, isValidatingReceipts: true});
expect(error).toBe(CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE);
});

it('should return WRONG_FILE_TYPE_MULTIPLE when checking multiple invalid receipt files', () => {
const file = createMockFile('receipt.exe', CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE + 10);
const error = FileUtils.validateAttachment(file, {isCheckingMultipleFiles: true, isValidatingReceipts: true});
const error = FileUtils.validateAttachment(file, {isValidatingMultipleFiles: true, isValidatingReceipts: true});
expect(error).toBe(CONST.FILE_VALIDATION_ERRORS.WRONG_FILE_TYPE_MULTIPLE);
});

it('should return empty string for valid image receipt', () => {
const file = createMockFile('receipt.jpg', CONST.API_ATTACHMENT_VALIDATIONS.RECEIPT_MAX_SIZE - 1);
const error = FileUtils.validateAttachment(file, {isCheckingMultipleFiles: false, isValidatingReceipts: true});
const error = FileUtils.validateAttachment(file, {isValidatingMultipleFiles: false, isValidatingReceipts: true});
expect(error).toBe('');
});
});
Expand Down
Loading