Skip to content

Commit 8a9c854

Browse files
committed
Add image viewing
Former-commit-id: 5fd991d Former-commit-id: c77fb80
1 parent 1d02d87 commit 8a9c854

File tree

3 files changed

+80
-32
lines changed

3 files changed

+80
-32
lines changed

package-lock.json

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"react-dom": "18.1.0",
2929
"react-native": "0.70.5",
3030
"react-native-gesture-handler": "~2.8.0",
31+
"react-native-image-viewing": "^0.2.2",
3132
"react-native-safe-area-context": "^4.4.1",
3233
"react-native-screens": "~3.18.0",
3334
"react-native-web": "~0.18.9"

screens/Partner.js

Lines changed: 63 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
query,
99
orderBy,
1010
} from "firebase/firestore";
11-
import React, { useState, useEffect } from "react";
11+
import React, { useState, useEffect, useMemo } from "react";
1212
import {
1313
View,
1414
Text,
@@ -17,6 +17,7 @@ import {
1717
FlatList,
1818
Pressable,
1919
} from "react-native";
20+
import ImageView from "react-native-image-viewing";
2021

2122
import { auth, db } from "../config";
2223

@@ -61,6 +62,19 @@ const Partner = () => {
6162
const [hasPartner, setHasPartner] = useState(false);
6263
const [partner, setPartner] = useState(null);
6364
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);
6478

6579
useEffect(() => {
6680
const unsubHasPartner = onSnapshot(
@@ -75,6 +89,14 @@ const Partner = () => {
7589
}
7690
);
7791

92+
return unsubHasPartner;
93+
}, []);
94+
95+
useEffect(() => {
96+
if (!partner) {
97+
return;
98+
}
99+
78100
const unsubPartnerTodos = onSnapshot(
79101
query(
80102
collection(db, `users/${partner}/todos`),
@@ -98,53 +120,61 @@ const Partner = () => {
98120
}
99121
);
100122

101-
return () => {
102-
unsubHasPartner();
103-
unsubPartnerTodos();
104-
};
123+
return unsubPartnerTodos;
105124
}, [partner]);
106125

107126
const showImage = (item) => {
108-
alert("Show image");
127+
const index = images.findIndex((image) => image.uri === item.proof);
128+
setImageIndex(index);
129+
setIsVisible(true);
109130
};
110131

111132
if (hasPartner) {
112133
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 }) => (
132141
<Pressable
133-
style={styles.innerContainer}
134142
onPress={() => {
135143
if (item.status === "finished") {
136144
showImage(item);
137145
}
138146
}}
147+
style={styles.container}
139148
>
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>
143166
</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)}
146176
/>
147-
</View>
177+
</>
148178
);
149179
}
150180

@@ -177,6 +207,7 @@ const styles = StyleSheet.create({
177207
marginHorizontal: 10,
178208
alignItems: "center",
179209
justifyContent: "center",
210+
flexDirection: "row",
180211
height: "100%",
181212
},
182213
innerContainer: {

0 commit comments

Comments
 (0)