8
8
query ,
9
9
orderBy ,
10
10
} from "firebase/firestore" ;
11
- import React , { useState , useEffect } from "react" ;
11
+ import React , { useState , useEffect , useMemo } from "react" ;
12
12
import {
13
13
View ,
14
14
Text ,
@@ -17,6 +17,7 @@ import {
17
17
FlatList ,
18
18
Pressable ,
19
19
} from "react-native" ;
20
+ import ImageView from "react-native-image-viewing" ;
20
21
21
22
import { auth , db } from "../config" ;
22
23
@@ -61,6 +62,19 @@ const Partner = () => {
61
62
const [ hasPartner , setHasPartner ] = useState ( false ) ;
62
63
const [ partner , setPartner ] = useState ( null ) ;
63
64
const [ todos , setTodos ] = useState ( [ ] ) ;
65
+ const images = useMemo ( ( ) => {
66
+ const images = [ ] ;
67
+ todos . forEach ( ( todo ) => {
68
+ if ( todo . status === "finished" ) {
69
+ images . push ( {
70
+ uri : todo . proof ,
71
+ } ) ;
72
+ }
73
+ } ) ;
74
+ return images ;
75
+ } , [ todos ] ) ;
76
+ const [ visible , setIsVisible ] = useState ( false ) ;
77
+ const [ imageIndex , setImageIndex ] = useState ( 0 ) ;
64
78
65
79
useEffect ( ( ) => {
66
80
const unsubHasPartner = onSnapshot (
@@ -75,6 +89,14 @@ const Partner = () => {
75
89
}
76
90
) ;
77
91
92
+ return unsubHasPartner ;
93
+ } , [ ] ) ;
94
+
95
+ useEffect ( ( ) => {
96
+ if ( ! partner ) {
97
+ return ;
98
+ }
99
+
78
100
const unsubPartnerTodos = onSnapshot (
79
101
query (
80
102
collection ( db , `users/${ partner } /todos` ) ,
@@ -98,53 +120,61 @@ const Partner = () => {
98
120
}
99
121
) ;
100
122
101
- return ( ) => {
102
- unsubHasPartner ( ) ;
103
- unsubPartnerTodos ( ) ;
104
- } ;
123
+ return unsubPartnerTodos ;
105
124
} , [ partner ] ) ;
106
125
107
126
const showImage = ( item ) => {
108
- alert ( "Show image" ) ;
127
+ const index = images . findIndex ( ( image ) => image . uri === item . proof ) ;
128
+ setImageIndex ( index ) ;
129
+ setIsVisible ( true ) ;
109
130
} ;
110
131
111
132
if ( hasPartner ) {
112
133
return (
113
- < View style = { { flex : 1 } } >
114
- < FlatList
115
- data = { todos }
116
- numColumns = { 1 }
117
- keyExtractor = { ( item ) => item . id }
118
- renderItem = { ( { item } ) => (
119
- < View style = { styles . container } >
120
- < Ionicons
121
- name = {
122
- {
123
- unfinished : "md-square-outline" ,
124
- finished : "md-alert-circle-outline" ,
125
- verified : "md-checkmark-circle-outline" ,
126
- } [ item . status ]
127
- }
128
- size = { 24 }
129
- color = "black"
130
- style = { styles . todoIcon }
131
- />
134
+ < >
135
+ < View style = { { flex : 1 } } >
136
+ < FlatList
137
+ data = { todos }
138
+ numColumns = { 1 }
139
+ keyExtractor = { ( item ) => item . id }
140
+ renderItem = { ( { item } ) => (
132
141
< Pressable
133
- style = { styles . innerContainer }
134
142
onPress = { ( ) => {
135
143
if ( item . status === "finished" ) {
136
144
showImage ( item ) ;
137
145
}
138
146
} }
147
+ style = { styles . container }
139
148
>
140
- < Text style = { styles . itemHeading } >
141
- { item . title . charAt ( 0 ) . toUpperCase ( ) + item . title . slice ( 1 ) }
142
- </ Text >
149
+ < Ionicons
150
+ name = {
151
+ {
152
+ unfinished : "md-square-outline" ,
153
+ finished : "md-alert-circle-outline" ,
154
+ verified : "md-checkmark-circle-outline" ,
155
+ } [ item . status ]
156
+ }
157
+ size = { 24 }
158
+ color = "black"
159
+ style = { styles . todoIcon }
160
+ />
161
+ < View style = { styles . innerContainer } >
162
+ < Text style = { styles . itemHeading } >
163
+ { item . title . charAt ( 0 ) . toUpperCase ( ) + item . title . slice ( 1 ) }
164
+ </ Text >
165
+ </ View >
143
166
</ Pressable >
144
- </ View >
145
- ) }
167
+ ) }
168
+ />
169
+ </ View >
170
+ < ImageView
171
+ images = { images }
172
+ imageIndex = { imageIndex }
173
+ onImageIndexChange = { setImageIndex }
174
+ visible = { visible }
175
+ onRequestClose = { ( ) => setIsVisible ( false ) }
146
176
/>
147
- </ View >
177
+ </ >
148
178
) ;
149
179
}
150
180
@@ -177,6 +207,7 @@ const styles = StyleSheet.create({
177
207
marginHorizontal : 10 ,
178
208
alignItems : "center" ,
179
209
justifyContent : "center" ,
210
+ flexDirection : "row" ,
180
211
height : "100%" ,
181
212
} ,
182
213
innerContainer : {
0 commit comments