Skip to content

Commit f987f58

Browse files
authored
Merge pull request #85574 from software-mansion-labs/jakubkalinski0/Odometer_unexpected_error_when_submit_expense_with_image
[Odometer] Unexpected error when submit expense with image
2 parents 322c66f + b023c9b commit f987f58

5 files changed

Lines changed: 48 additions & 7 deletions

File tree

src/CONST/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,6 +2301,7 @@ const CONST = {
23012301
TIF: 'image/tif',
23022302
TIFF: 'image/tiff',
23032303
HEIC: 'image/heic',
2304+
HEIF: 'image/heif',
23042305
IMG: 'image/*',
23052306
PDF: 'application/pdf',
23062307
MSWORD: 'application/msword',

src/libs/fileDownload/FileUtils.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,27 @@ function getMimeType(fileExtension: string): string {
170170
return MIME_TYPES[ext] ?? 'application/octet-stream';
171171
}
172172

173+
/**
174+
* Derives an image MIME type from a file URI or filename.
175+
* Returns undefined for unrecognized extensions so callers can apply their own fallback.
176+
*/
177+
function getMimeTypeFromUri(uri: string): string | undefined {
178+
const {fileExtension} = splitExtensionFromFileName(uri.split('/').pop() ?? uri);
179+
const ext = fileExtension.toLowerCase();
180+
const IMAGE_EXTENSION_TO_MIME: Record<string, string> = {
181+
jpg: CONST.SHARE_FILE_MIMETYPE.JPEG,
182+
jpeg: CONST.SHARE_FILE_MIMETYPE.JPEG,
183+
png: CONST.SHARE_FILE_MIMETYPE.PNG,
184+
heic: CONST.SHARE_FILE_MIMETYPE.HEIC,
185+
heif: CONST.SHARE_FILE_MIMETYPE.HEIF,
186+
webp: CONST.SHARE_FILE_MIMETYPE.WEBP,
187+
gif: CONST.SHARE_FILE_MIMETYPE.GIF,
188+
tif: CONST.SHARE_FILE_MIMETYPE.TIF,
189+
tiff: CONST.SHARE_FILE_MIMETYPE.TIFF,
190+
};
191+
return ext ? IMAGE_EXTENSION_TO_MIME[ext] : undefined;
192+
}
193+
173194
/**
174195
* Returns the filename replacing special characters with underscore
175196
*/
@@ -874,6 +895,7 @@ export {
874895
createFile,
875896
validateReceipt,
876897
normalizeFileObject,
898+
getMimeTypeFromUri,
877899
isValidReceiptExtension,
878900
getFileValidationErrorText,
879901
hasHeicOrHeifExtension,

src/libs/stitchOdometerImages/index.native.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Skia} from '@shopify/react-native-skia';
1+
import {ImageFormat, Skia} from '@shopify/react-native-skia';
22
import RNFS from 'react-native-fs';
33
import Log from '@libs/Log';
44
import type {FileObject} from '@src/types/utils/Attachment';
@@ -41,7 +41,7 @@ async function stitchOdometerImages(image1: FileObject | string | undefined, ima
4141
surface.flush();
4242

4343
snapshot = surface.makeImageSnapshot();
44-
const base64 = snapshot.encodeToBase64();
44+
const base64 = snapshot.encodeToBase64(ImageFormat.JPEG, 100);
4545

4646
// Delete any previously stitched files before creating a new one
4747
try {

src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {setMoneyRequestDistance, setMoneyRequestOdometerReading, setMoneyRequest
2929
import {handleMoneyRequestStepDistanceNavigation} from '@libs/actions/IOU/MoneyRequest';
3030
import {setDraftSplitTransaction} from '@libs/actions/IOU/Split';
3131
import DistanceRequestUtils from '@libs/DistanceRequestUtils';
32+
import {getMimeTypeFromUri} from '@libs/fileDownload/FileUtils';
3233
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
3334
import {shouldUseTransactionDraft} from '@libs/IOUUtils';
3435
import Log from '@libs/Log';
@@ -396,7 +397,12 @@ function IOURequestStepDistanceOdometer({
396397
(typeof odometerStartImage !== 'string' ? odometerStartImage?.name : odometerStartImage?.split('/').pop()) ??
397398
(typeof odometerEndImage !== 'string' ? odometerEndImage?.name : odometerEndImage?.split('/').pop()) ??
398399
'';
399-
setMoneyRequestReceipt(transactionID, uri, name, isTransactionDraft);
400+
const type =
401+
stitchedImage?.type ??
402+
(typeof odometerStartImage !== 'string' ? odometerStartImage?.type : getMimeTypeFromUri(odometerStartImage)) ??
403+
(typeof odometerEndImage !== 'string' ? odometerEndImage?.type : getMimeTypeFromUri(odometerEndImage)) ??
404+
'image/jpeg';
405+
setMoneyRequestReceipt(transactionID, uri, name, isTransactionDraft, type);
400406
}
401407

402408
if (isEditing) {

src/pages/iou/request/step/IOURequestStepOdometerImage/index.native.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,10 @@ function IOURequestStepOdometerImage({
183183
}
184184

185185
const file = files.at(0);
186-
const imageUri = (file as {uri?: string}).uri ?? '';
187-
setMoneyRequestOdometerImage(transactionID, imageType, imageUri, isTransactionDraft);
186+
if (!file) {
187+
return;
188+
}
189+
setMoneyRequestOdometerImage(transactionID, imageType, file, isTransactionDraft);
188190
navigateBack();
189191
};
190192

@@ -237,8 +239,18 @@ function IOURequestStepOdometerImage({
237239
.then((photo: PhotoFile) => {
238240
const imageObject: ImageObject = {file: photo, filename: photo.path, source: getPhotoSource(photo.path)};
239241
cropImageToAspectRatio(imageObject, viewfinderLayout.current?.width, viewfinderLayout.current?.height, undefined, photo.orientation)
240-
.then(({source}) => {
241-
setMoneyRequestOdometerImage(transactionID, imageType, source, isTransactionDraft);
242+
.then(({file, filename, source}) => {
243+
setMoneyRequestOdometerImage(
244+
transactionID,
245+
imageType,
246+
{
247+
uri: source,
248+
name: filename,
249+
type: (file as FileObject | undefined)?.type ?? 'image/jpeg',
250+
size: (file as FileObject | undefined)?.size,
251+
},
252+
isTransactionDraft,
253+
);
242254
navigateBack();
243255
})
244256
.catch((error: unknown) => {

0 commit comments

Comments
 (0)