Skip to content

Commit a66ed89

Browse files
authored
Merge pull request #43249 from Krishna2323/krishna2323/issue/42657
fix: mWeb - Chat - Uploading an image while offline briefly shows an offline message in the preview.
2 parents c85ebdf + 1047f73 commit a66ed89

File tree

5 files changed

+23
-8
lines changed

5 files changed

+23
-8
lines changed

src/components/ImageView/index.tsx

+7-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import useNetwork from '@hooks/useNetwork';
1212
import useStyleUtils from '@hooks/useStyleUtils';
1313
import useThemeStyles from '@hooks/useThemeStyles';
1414
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
15+
import * as FileUtils from '@libs/fileDownload/FileUtils';
1516
import CONST from '@src/CONST';
1617
import viewRef from '@src/types/utils/viewRef';
1718
import type ImageViewProps from './types';
@@ -195,6 +196,8 @@ function ImageView({isAuthTokenRequired = false, url, fileName, onError}: ImageV
195196
};
196197
}, [canUseTouchScreen, trackMovement, trackPointerPosition]);
197198

199+
const isLocalFile = FileUtils.isLocalFile(url);
200+
198201
if (canUseTouchScreen) {
199202
return (
200203
<View
@@ -213,8 +216,8 @@ function ImageView({isAuthTokenRequired = false, url, fileName, onError}: ImageV
213216
onLoad={imageLoad}
214217
onError={onError}
215218
/>
216-
{((isLoading && !isOffline) || (!isLoading && zoomScale === 0)) && <FullscreenLoadingIndicator style={[styles.opacity1, styles.bgTransparent]} />}
217-
{isLoading && <AttachmentOfflineIndicator />}
219+
{((isLoading && (!isOffline || isLocalFile)) || (!isLoading && zoomScale === 0)) && <FullscreenLoadingIndicator style={[styles.opacity1, styles.bgTransparent]} />}
220+
{isLoading && !isLocalFile && <AttachmentOfflineIndicator />}
218221
</View>
219222
);
220223
}
@@ -247,8 +250,8 @@ function ImageView({isAuthTokenRequired = false, url, fileName, onError}: ImageV
247250
/>
248251
</PressableWithoutFeedback>
249252

250-
{isLoading && !isOffline && <FullscreenLoadingIndicator style={[styles.opacity1, styles.bgTransparent]} />}
251-
{isLoading && <AttachmentOfflineIndicator />}
253+
{isLoading && (!isOffline || isLocalFile) && <FullscreenLoadingIndicator style={[styles.opacity1, styles.bgTransparent]} />}
254+
{isLoading && !isLocalFile && <AttachmentOfflineIndicator />}
252255
</View>
253256
);
254257
}

src/components/Lightbox/index.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {getCanvasFitScale} from '@components/MultiGestureCanvas/utils';
1212
import useNetwork from '@hooks/useNetwork';
1313
import useStyleUtils from '@hooks/useStyleUtils';
1414
import useThemeStyles from '@hooks/useThemeStyles';
15+
import * as FileUtils from '@libs/fileDownload/FileUtils';
1516
import NUMBER_OF_CONCURRENT_LIGHTBOXES from './numberOfConcurrentLightboxes';
1617

1718
const cachedImageDimensions = new Map<string, ContentSize | undefined>();
@@ -197,6 +198,8 @@ function Lightbox({isAuthTokenRequired = false, uri, onScaleChanged: onScaleChan
197198
[onScaleChangedContext, onScaleChangedProp],
198199
);
199200

201+
const isLocalFile = FileUtils.isLocalFile(uri);
202+
200203
return (
201204
<View
202205
style={[StyleSheet.absoluteFill, style]}
@@ -248,13 +251,13 @@ function Lightbox({isAuthTokenRequired = false, uri, onScaleChanged: onScaleChan
248251
)}
249252

250253
{/* Show activity indicator while the lightbox is still loading the image. */}
251-
{isLoading && !isOffline && (
254+
{isLoading && (!isOffline || isLocalFile) && (
252255
<ActivityIndicator
253256
size="large"
254257
style={StyleSheet.absoluteFill}
255258
/>
256259
)}
257-
{isLoading && <AttachmentOfflineIndicator />}
260+
{isLoading && !isLocalFile && <AttachmentOfflineIndicator />}
258261
</>
259262
)}
260263
</View>

src/libs/ReceiptUtils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ function getThumbnailAndImageURIs(transaction: OnyxEntry<Transaction>, receiptPa
5656
return {thumbnail: `${path.substring(0, path.length - 4)}.jpg.1024.jpg`, image: path, filename};
5757
}
5858

59-
const isLocalFile = typeof path === 'number' || path.startsWith('blob:') || path.startsWith('file:') || path.startsWith('/');
59+
const isLocalFile = FileUtils.isLocalFile(path);
6060
const {fileExtension} = FileUtils.splitExtensionFromFileName(filename);
6161
return {isThumbnail: true, fileExtension: Object.values(CONST.IOU.FILE_TYPES).find((type) => type === fileExtension), image: path, isLocalFile, filename};
6262
}

src/libs/fileDownload/FileUtils.ts

+8
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,13 @@ function validateImageForCorruption(file: FileObject): Promise<void> {
252252
});
253253
}
254254

255+
function isLocalFile(receiptUri?: string | number): boolean {
256+
if (!receiptUri) {
257+
return false;
258+
}
259+
return typeof receiptUri === 'number' || receiptUri?.startsWith('blob:') || receiptUri?.startsWith('file:') || receiptUri?.startsWith('/');
260+
}
261+
255262
export {
256263
showGeneralErrorAlert,
257264
showSuccessAlert,
@@ -264,5 +271,6 @@ export {
264271
appendTimeToFileName,
265272
readFileAsync,
266273
base64ToFile,
274+
isLocalFile,
267275
validateImageForCorruption,
268276
};

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import useNetwork from '@hooks/useNetwork';
1313
import useThemeStyles from '@hooks/useThemeStyles';
1414
import useWindowDimensions from '@hooks/useWindowDimensions';
1515
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
16+
import * as FileUtils from '@libs/fileDownload/FileUtils';
1617
import getCurrentPosition from '@libs/getCurrentPosition';
1718
import * as IOUUtils from '@libs/IOUUtils';
1819
import Log from '@libs/Log';
@@ -204,7 +205,7 @@ function IOURequestStepConfirmation({
204205
// skip this in case user is moving the transaction as the receipt path will be valid in that case
205206
useEffect(() => {
206207
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
207-
const isLocalFile = typeof receiptPath === 'number' || receiptPath?.startsWith('blob:') || receiptPath?.startsWith('file:') || receiptPath?.startsWith('/');
208+
const isLocalFile = FileUtils.isLocalFile(receiptPath);
208209

209210
if (!isLocalFile) {
210211
setReceiptFile(transaction?.receipt);

0 commit comments

Comments
 (0)