1
- import React , { useState } from "react" ;
1
+ import React , { useCallback , useState } from "react" ;
2
2
import {
3
3
ScrollView ,
4
4
View ,
@@ -36,6 +36,26 @@ const SubjectBadge = ({ emoji, color }: { emoji: string; color: string }) => (
36
36
const ReelThumbnail = ( { reel, onPress, width } : { reel : Reel ; onPress : ( ) => void ; width : number } ) => {
37
37
const { colors } = useTheme ( ) ;
38
38
39
+ // Vérification de sécurité pour l'image
40
+ const imageSource = reel . imagewithouteffect
41
+ ? { uri : `data:image/jpeg;base64,${ reel . imagewithouteffect } ` }
42
+ : null ; // Vous pouvez aussi mettre une image par défaut ici
43
+
44
+ if ( ! imageSource ) {
45
+ return (
46
+ < View style = { [ styles . item , {
47
+ backgroundColor : colors . card ,
48
+ width : width ,
49
+ height : width * 1.5 ,
50
+ margin : 4 ,
51
+ justifyContent : "center" ,
52
+ alignItems : "center"
53
+ } ] } >
54
+ < Text style = { { color : colors . text } } > Image non disponible</ Text >
55
+ </ View >
56
+ ) ;
57
+ }
58
+
39
59
return (
40
60
< TouchableOpacity
41
61
style = { [
@@ -50,9 +70,10 @@ const ReelThumbnail = ({ reel, onPress, width }: { reel: Reel; onPress: () => vo
50
70
onPress = { onPress }
51
71
>
52
72
< Image
53
- source = { { uri : `data:image/jpeg;base64, ${ reel . imagewithouteffect } ` } }
73
+ source = { imageSource }
54
74
style = { styles . thumbnail }
55
75
resizeMode = "cover"
76
+ defaultSource = { require ( "@/../assets/images/service_unknown.png" ) } // Ajoutez une image par défaut
56
77
/>
57
78
< View style = { [ styles . infoContainer , { backgroundColor : colors . card } ] } >
58
79
< SubjectBadge
@@ -73,29 +94,38 @@ interface ReelGalleryProps {
73
94
reels : Reel [ ] ;
74
95
}
75
96
97
+ // Sécurisation du composant principal
76
98
const ReelGallery = ( { reels } : ReelGalleryProps ) => {
77
99
const [ selectedReel , setSelectedReel ] = useState < Reel | null > ( null ) ;
78
100
const windowWidth = Dimensions . get ( "window" ) . width ;
79
101
const padding = 40 ;
80
102
const gap = 8 ;
81
103
const numColumns = 2 ;
82
104
105
+ // Vérification des reels valides
106
+ const validReels = reels . filter ( reel =>
107
+ reel &&
108
+ typeof reel . id === "string" &&
109
+ reel . grade &&
110
+ reel . subjectdata
111
+ ) ;
112
+
83
113
const itemWidth = ( Math . min ( 500 , windowWidth ) - ( padding * 2 ) - ( gap * ( numColumns - 1 ) ) ) / numColumns ;
84
114
85
- const deleteReel = ( reelId : string ) => {
115
+ const deleteReel = useCallback ( ( reelId : string ) => {
86
116
useGradesStore . setState ( ( store ) => {
87
117
const updatedReels = { ...store . reels } ;
88
118
delete updatedReels [ reelId ] ;
89
119
return { reels : updatedReels } ;
90
120
} ) ;
91
121
setSelectedReel ( null ) ;
92
- } ;
122
+ } , [ ] ) ;
93
123
94
124
return (
95
125
< ScrollView showsVerticalScrollIndicator = { false } >
96
126
< View style = { styles . container } >
97
127
< View style = { [ styles . galleryContent , { gap } ] } >
98
- { reels . map ( ( reel ) => (
128
+ { validReels . map ( ( reel ) => (
99
129
< ReelThumbnail
100
130
key = { reel . id }
101
131
reel = { reel }
@@ -109,9 +139,9 @@ const ReelGallery = ({ reels }: ReelGalleryProps) => {
109
139
{ selectedReel && (
110
140
< GradeModal
111
141
isVisible = { ! ! selectedReel }
112
- imageBase64 = { selectedReel . image }
142
+ imageBase64 = { selectedReel . image || "" }
113
143
onClose = { ( ) => setSelectedReel ( null ) }
114
- DeleteGrade = { ( ) => deleteReel ( selectedReel . id ) }
144
+ DeleteGrade = { ( ) => selectedReel . id && deleteReel ( selectedReel . id ) }
115
145
/>
116
146
) }
117
147
</ ScrollView >
0 commit comments