Skip to content

Commit 3033632

Browse files
committed
RU-T46 Watchdog Term fix
1 parent f2412fd commit 3033632

File tree

5 files changed

+60
-6
lines changed

5 files changed

+60
-6
lines changed

src/components/calls/__tests__/call-files-modal.test.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { CallFilesModal } from '../call-files-modal';
77

88
// Mock the zustand store
99
const mockFetchCallFiles = jest.fn();
10+
const mockClearFiles = jest.fn();
1011
const defaultMockFiles = [
1112
{
1213
Id: 'file-1',
@@ -41,6 +42,7 @@ let mockStoreState: any = {
4142
isLoadingFiles: false,
4243
errorFiles: null,
4344
fetchCallFiles: mockFetchCallFiles,
45+
clearFiles: mockClearFiles,
4446
};
4547

4648
jest.mock('@/stores/calls/detail-store', () => ({
@@ -304,6 +306,7 @@ describe('CallFilesModal', () => {
304306
isLoadingFiles: false,
305307
errorFiles: null,
306308
fetchCallFiles: mockFetchCallFiles,
309+
clearFiles: mockClearFiles,
307310
};
308311
});
309312

@@ -423,6 +426,7 @@ describe('CallFilesModal', () => {
423426
isLoadingFiles: true,
424427
errorFiles: null,
425428
fetchCallFiles: mockFetchCallFiles,
429+
clearFiles: mockClearFiles,
426430
};
427431
});
428432

@@ -444,6 +448,7 @@ describe('CallFilesModal', () => {
444448
isLoadingFiles: false,
445449
errorFiles: 'Network error occurred',
446450
fetchCallFiles: mockFetchCallFiles,
451+
clearFiles: mockClearFiles,
447452
};
448453
});
449454

@@ -476,6 +481,7 @@ describe('CallFilesModal', () => {
476481
isLoadingFiles: false,
477482
errorFiles: null,
478483
fetchCallFiles: mockFetchCallFiles,
484+
clearFiles: mockClearFiles,
479485
};
480486
});
481487

@@ -590,6 +596,7 @@ describe('CallFilesModal', () => {
590596
isLoadingFiles: false,
591597
errorFiles: null,
592598
fetchCallFiles: mockFetchCallFiles,
599+
clearFiles: mockClearFiles,
593600
};
594601
});
595602

@@ -623,6 +630,7 @@ describe('CallFilesModal', () => {
623630
isLoadingFiles: false,
624631
errorFiles: null,
625632
fetchCallFiles: mockFetchCallFiles,
633+
clearFiles: mockClearFiles,
626634
};
627635
});
628636

src/components/calls/call-files-modal.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ interface CallFilesModalProps {
3131
export const CallFilesModal: React.FC<CallFilesModalProps> = ({ isOpen, onClose, callId }) => {
3232
const { t } = useTranslation();
3333
const { trackEvent } = useAnalytics();
34-
const { callFiles, isLoadingFiles, errorFiles, fetchCallFiles } = useCallDetailStore();
34+
const { callFiles, isLoadingFiles, errorFiles, fetchCallFiles, clearFiles } = useCallDetailStore();
3535
const [downloadingFiles, setDownloadingFiles] = useState<Record<string, number>>({});
3636

3737
// Bottom sheet ref and snap points
@@ -46,7 +46,16 @@ export const CallFilesModal: React.FC<CallFilesModalProps> = ({ isOpen, onClose,
4646
} else {
4747
bottomSheetRef.current?.close();
4848
}
49-
}, [isOpen, callId, fetchCallFiles]);
49+
50+
// Cleanup when modal closes to free memory
51+
return () => {
52+
if (!isOpen) {
53+
setDownloadingFiles({});
54+
// Clear files from store to free memory
55+
clearFiles();
56+
}
57+
};
58+
}, [isOpen, callId, fetchCallFiles, clearFiles]);
5059

5160
// Track when call files modal is opened/rendered
5261
useEffect(() => {

src/components/calls/call-images-modal.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Image } from 'expo-image';
33
import * as ImageManipulator from 'expo-image-manipulator';
44
import * as ImagePicker from 'expo-image-picker';
55
import { CameraIcon, ChevronLeftIcon, ChevronRightIcon, ImageIcon, PlusIcon, XIcon } from 'lucide-react-native';
6-
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6+
import React, { useCallback, useEffect, useMemo, useRef, useState, memo } from 'react';
77
import { useTranslation } from 'react-i18next';
88
import { Alert, Dimensions, Platform, StyleSheet, TouchableOpacity, View } from 'react-native';
99
import { KeyboardAwareScrollView } from 'react-native-keyboard-controller';
@@ -61,7 +61,7 @@ const CallImagesModal: React.FC<CallImagesModalProps> = ({ isOpen, onClose, call
6161
const [fullScreenImage, setFullScreenImage] = useState<{ source: any; name?: string } | null>(null);
6262
const flatListRef = useRef<any>(null); // FlashList ref type
6363

64-
const { callImages, isLoadingImages, errorImages, fetchCallImages, uploadCallImage } = useCallDetailStore();
64+
const { callImages, isLoadingImages, errorImages, fetchCallImages, uploadCallImage, clearImages } = useCallDetailStore();
6565

6666
// Filter out images without proper data or URL
6767
const validImages = useMemo(() => {
@@ -82,7 +82,18 @@ const CallImagesModal: React.FC<CallImagesModalProps> = ({ isOpen, onClose, call
8282
setActiveIndex(0); // Reset active index when opening
8383
setImageErrors(new Set()); // Reset image errors
8484
}
85-
}, [isOpen, callId, fetchCallImages]);
85+
86+
// Cleanup when modal closes to free memory
87+
return () => {
88+
if (!isOpen) {
89+
setFullScreenImage(null);
90+
setSelectedImageInfo(null);
91+
setImageErrors(new Set());
92+
// Clear images from store to free memory
93+
clearImages();
94+
}
95+
};
96+
}, [isOpen, callId, fetchCallImages, clearImages]);
8697

8798
// Track when call images modal is opened/rendered
8899
useEffect(() => {
@@ -244,6 +255,8 @@ const CallImagesModal: React.FC<CallImagesModalProps> = ({ isOpen, onClose, call
244255
contentFit="contain"
245256
transition={200}
246257
pointerEvents="none"
258+
cachePolicy="memory-disk"
259+
recyclingKey={item.Id}
247260
onError={() => {
248261
handleImageError(item.Id, 'expo-image load error');
249262
}}
@@ -341,7 +354,7 @@ const CallImagesModal: React.FC<CallImagesModalProps> = ({ isOpen, onClose, call
341354

342355
{selectedImageInfo ? (
343356
<Box className="flex-1 items-center justify-center">
344-
<Image source={{ uri: selectedImageInfo.uri }} style={styles.previewImage} contentFit="contain" transition={200} />
357+
<Image source={{ uri: selectedImageInfo.uri }} style={styles.previewImage} contentFit="contain" transition={200} cachePolicy="memory-disk" />
345358
</Box>
346359
) : (
347360
<VStack className="flex-1 justify-center space-y-4">

src/components/calls/full-screen-image-modal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ const FullScreenImageModal: React.FC<FullScreenImageModalProps> = ({ isOpen, onC
161161
maxHeight: screenHeight * 0.8,
162162
}}
163163
contentFit="contain"
164+
cachePolicy="memory-disk"
164165
alt={imageName || t('callImages.image_alt')}
165166
testID="full-screen-image"
166167
/>

src/stores/calls/detail-store.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ interface CallDetailState {
2121
isNotesLoading: boolean;
2222
fetchCallDetail: (callId: string) => Promise<void>;
2323
reset: () => void;
24+
clearImages: () => void;
25+
clearFiles: () => void;
2426
fetchCallNotes: (callId: string) => Promise<void>;
2527
addNote: (callId: string, note: string, userId: string, latitude: number | null, longitude: number | null) => Promise<void>;
2628
searchNotes: (query: string) => CallNoteResultData[];
@@ -56,9 +58,30 @@ export const useCallDetailStore = create<CallDetailState>((set, get) => ({
5658
call: null,
5759
callExtraData: null,
5860
callPriority: null,
61+
callNotes: [],
62+
callImages: null,
63+
callFiles: null,
5964
isLoading: false,
6065
isNotesLoading: false,
66+
isLoadingImages: false,
67+
isLoadingFiles: false,
6168
error: null,
69+
errorImages: null,
70+
errorFiles: null,
71+
}),
72+
// Clear images data to free memory
73+
clearImages: () =>
74+
set({
75+
callImages: null,
76+
isLoadingImages: false,
77+
errorImages: null,
78+
}),
79+
// Clear files data to free memory
80+
clearFiles: () =>
81+
set({
82+
callFiles: null,
83+
isLoadingFiles: false,
84+
errorFiles: null,
6285
}),
6386
fetchCallDetail: async (callId: string) => {
6487
set({ isLoading: true, error: null });

0 commit comments

Comments
 (0)