@@ -3,7 +3,7 @@ import { Image } from 'expo-image';
33import * as ImageManipulator from 'expo-image-manipulator' ;
44import * as ImagePicker from 'expo-image-picker' ;
55import { 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' ;
77import { useTranslation } from 'react-i18next' ;
88import { Alert , Dimensions , Platform , StyleSheet , TouchableOpacity , View } from 'react-native' ;
99import { 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" >
0 commit comments