generated from github/codespaces-blank
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBooksScreen.tsx
90 lines (83 loc) · 2.03 KB
/
BooksScreen.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import React, { useEffect } from "react";
import {
FlatList,
StyleSheet,
Text,
View,
TouchableOpacity,
Alert,
} from "react-native";
import { useNavigation } from "@react-navigation/native";
import { useSelector, useDispatch } from "react-redux";
import {
getBooksDone,
getBooksError,
selectBook,
updateFavourite,
} from "./bookSlice";
import Icon from "react-native-vector-icons/FontAwesome";
interface BookItemProps {
book: book.Book;
}
const BooksScreen = (): JSX.Element => {
const books = useSelector((state) => state.books);
const dispatch = useDispatch();
const navigation = useNavigation();
useEffect(() => {
getBooks();
}, []);
async function getBooks() {
dispatch(getBooks());
try {
const response = await fetch("https://example.com/api/books");
const books: book.Book[] = await response.json();
dispatch(getBooksDone(books));
} catch (e) {
dispatch(getBooksError());
Alert.alert("Fetch books failed with error: ", e);
}
}
const BookItem = ({ book }: BookItemProps) => {
return (
<View>
<TouchableOpacity
onPress={() => {
dispatch(selectBook(book.id));
navigation.navigate("BooksDetail");
}}
>
<Text>{book.title}</Text>
<Text>Favourite:</Text>
<TouchableOpacity
onPress={() =>
dispatch(updateFavourite(book.id, book.isFavourited))
}
>
<Icon
name="star"
size={30}
color={book.isFavourited ? Colors.yellow : Colors.gray}
/>
</TouchableOpacity>
</TouchableOpacity>
</View>
);
};
return (
<View style={styles.screen}>
<FlatList
style={{ flexGrow: 1 }}
data={books}
renderItem={({ item }) => <BookItem book={item} />}
/>
</View>
);
};
export default BooksScreen;
const styles = StyleSheet.create({
screen: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});