diff --git a/src/components/CurrentlyReadingBook.tsx b/src/components/CurrentlyReadingBook.tsx index af51eaf..bf36256 100644 --- a/src/components/CurrentlyReadingBook.tsx +++ b/src/components/CurrentlyReadingBook.tsx @@ -1,12 +1,5 @@ import React from "react"; -import { - View, - Text, - StyleSheet, - Image, - TouchableOpacity, - Dimensions, -} from "react-native"; +import { View, Text, StyleSheet, Image, TouchableOpacity } from "react-native"; import { colors } from "../constants/colors"; import { sizes } from "../constants/sizes"; import { Ionicons } from "@expo/vector-icons"; @@ -25,6 +18,8 @@ type RootStackParamList = { rating: number; saveDate: Date; status: string; + favPage?: number; + favPageImage?: string; }; }; }; @@ -43,6 +38,8 @@ type CurrentlyReadingBookProps = { review: string; rating: number; status: string; + favPage?: number; + favPageImage?: string; }; const getSecureImageUrl = (url: string | undefined) => { @@ -59,6 +56,8 @@ export const CurrentlyReadingBook = ({ review, rating, status, + favPage, + favPageImage, }: CurrentlyReadingBookProps) => { const navigation = useNavigation(); @@ -74,6 +73,8 @@ export const CurrentlyReadingBook = ({ rating, saveDate: new Date(), status, + favPage, + favPageImage, }, }); }; diff --git a/src/components/book.tsx b/src/components/book.tsx index cc50eec..ed4ff41 100644 --- a/src/components/book.tsx +++ b/src/components/book.tsx @@ -19,6 +19,8 @@ type RootStackParamList = { rating: number; saveDate: Date; status: string; + favPage?: number; + favPageImage?: string; }; }; }; @@ -53,6 +55,8 @@ export const Book = ({ review, rating, status, + favPage, + favPageImage, style, }: { title: string; @@ -63,6 +67,8 @@ export const Book = ({ review: string; rating: number; status: string; + favPage?: number; + favPageImage?: string; style?: object; }) => { const navigation = useNavigation(); @@ -86,6 +92,8 @@ export const Book = ({ rating, saveDate: new Date(), status, + favPage, + favPageImage, }, }); }; diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 7ade3ab..bd61273 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -55,8 +55,6 @@ "book_already_in_library": "This book is already in your library!", "book_added_to_library": "Book added to library!", "failed_to_add_book": "Failed to add book to library", - "unknown_author": "Unknown Author", - "unknown_publisher": "Unknown Publisher", "book_updated_successfully": "Book updated successfully!", "book_saved_successfully": "Book saved successfully!", "permission_required": "Permission to access photos is required!", @@ -81,5 +79,8 @@ "clearFilters": "Clear Filters", "select_language": "Select Language", "english": "English", - "turkish": "Turkish" + "turkish": "Turkish", + "tap_to_change_fav_page_image": "Tap to change favorite page image", + "favPage": "Favorite Page", + "favPageNumber": "Favorite Page Number" } diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json index 24f0bf2..ae59d2e 100644 --- a/src/i18n/locales/tr.json +++ b/src/i18n/locales/tr.json @@ -56,8 +56,6 @@ "book_already_in_library": "Bu kitap zaten kütüphanenizde!", "book_added_to_library": "Book added to library!", "failed_to_add_book": "Kitap kütüphaneye eklenemedi", - "unknown_author": "Bilinmeyen Yazar", - "unknown_publisher": "Bilinmeyen Yayınevi", "book_updated_successfully": "Kitap başarıyla güncellendi!", "book_saved_successfully": "Kitap başarıyla kaydedildi!", "permission_required": "Fotoğraflara erişim izni gerekli!", @@ -82,5 +80,8 @@ "clearFilters": "Filtreleri Temizle", "select_language": "Uygulama Dil Seçimi", "english": "İngilizce", - "turkish": "Türkçe" + "turkish": "Türkçe", + "tap_to_change_fav_page_image": "Favori sayfa resmini değiştirmek için dokunun", + "favPage": "Favori Sayfa", + "favPageNumber": "Favori Sayfa Numarası" } diff --git a/src/screens/AddBookScreen.tsx b/src/screens/AddBookScreen.tsx index 5355fd8..13da6e1 100644 --- a/src/screens/AddBookScreen.tsx +++ b/src/screens/AddBookScreen.tsx @@ -45,6 +45,8 @@ export default function AddBookScreen({ const [review, setReview] = useState(""); const [rating, setRating] = useState(2.5); const [image, setImage] = useState(""); + const [favPageImage, setFavPageImage] = useState(""); + const [favPage, setFavPage] = useState(0); const [error, setError] = useState(""); const [errorFields, setErrorFields] = useState([]); const [status, setStatus] = useState(""); @@ -61,6 +63,8 @@ export default function AddBookScreen({ setRating(book.rating); setImage(book.image); setStatus(book.status); + setFavPageImage(book.favPageImage); + setFavPage(book.favPage); } }, [isEdit, book]); @@ -83,6 +87,8 @@ export default function AddBookScreen({ review, rating: rating || 2.5, image, + favPageImage, + favPage, saveDate: new Date(), status, }; @@ -111,6 +117,8 @@ export default function AddBookScreen({ setRating(2.5); setImage(""); setStatus(""); + setFavPageImage(""); + setFavPage(0); onBookAdded(newBook); navigation.navigate("BookPreview" as never, { book: newBook, @@ -146,6 +154,32 @@ export default function AddBookScreen({ } }; + const pickFavPageImage = async () => { + try { + const permissionResult = + await ImagePicker.requestMediaLibraryPermissionsAsync(); + if (permissionResult.status !== "granted") { + alert(t("permission_required")); + return; + } + let result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ImagePicker.MediaTypeOptions.Images, + allowsEditing: true, + aspect: [2, 3], + quality: 0.5, + }); + if (!result.canceled) { + const selectedAsset = result.assets[0]; + if (selectedAsset?.uri) { + setFavPageImage(selectedAsset.uri); + } + } + } catch (error) { + console.error("Error picking image:", error); + alert(t("error_picking_image")); + } + }; + return ( @@ -274,6 +308,37 @@ export default function AddBookScreen({ onChangeText={setPublication} /> + + + {t("favPageNumber")} + setFavPage(Number(text))} + keyboardType="numeric" + /> + + + + + + + {t("tap_to_change_fav_page_image")} + + + )} @@ -459,4 +524,13 @@ const styles = StyleSheet.create({ height: 100, textAlignVertical: "top", }, + favPageImage: { + width: 200, + height: 200, + borderRadius: sizes.borderRadius, + backgroundColor: colors.background, + margin: 10, + marginLeft: "20%", + marginRight: "20%", + }, }); diff --git a/src/screens/BookDetailScreen.tsx b/src/screens/BookDetailScreen.tsx index 62fcc77..a407d41 100644 --- a/src/screens/BookDetailScreen.tsx +++ b/src/screens/BookDetailScreen.tsx @@ -31,6 +31,8 @@ type BookDetailScreenRouteProp = RouteProp< publisher?: string; publishedDate?: string; categories?: string[]; + favPageImage?: string; + favPageNumber?: string; status?: string; }; }; diff --git a/src/screens/BookPreviewScreen.tsx b/src/screens/BookPreviewScreen.tsx index 9b553a5..56d1f13 100644 --- a/src/screens/BookPreviewScreen.tsx +++ b/src/screens/BookPreviewScreen.tsx @@ -22,6 +22,8 @@ type BookPreviewScreenRouteProp = RouteProp< image: string; saveDate: Date; status: string; + favPage?: number; + favPageImage?: string; }; }; }, @@ -58,6 +60,7 @@ export default function BookPreviewScreen() { ...book, saveDate: new Date(book.saveDate), status: book.status ? book.status : t("to_read"), + favPage: book.favPage ? book.favPage : 0, }; const handleEdit = () => { @@ -124,7 +127,10 @@ export default function BookPreviewScreen() { handleEdit={handleEdit} handleDelete={handleDelete} > - + - {t("pages")} - - {parsedBook.pages ? parsedBook.pages : "-"} - - {t("publication")} - - {parsedBook.publication - ? parsedBook.publication - : t("unknown_publisher")} - - {t("review")} - - {parsedBook.review ? parsedBook.review : t("no_review")} - + {parsedBook.pages && ( + <> + {t("pages")} + {parsedBook.pages} + + )} + {parsedBook.publication && ( + <> + {t("publication")} + {parsedBook.publication} + + )} + {parsedBook.review && ( + <> + {t("review")} + {parsedBook.review} + + )} + {parsedBook.favPageImage && ( + <> + + {t("favPage") + " | "} + + {parsedBook.favPage ? parsedBook.favPage : "-"} + + + + + )} @@ -242,6 +272,15 @@ const styles = StyleSheet.create({ backgroundColor: colors.background, marginBottom: 10, }, + favPageImage: { + width: 200, + height: 200, + borderRadius: sizes.borderRadius, + backgroundColor: colors.background, + margin: 10, + marginLeft: "20%", + marginRight: "20%", + }, status: { marginBottom: 5, borderRadius: sizes.borderRadius, @@ -279,4 +318,12 @@ const styles = StyleSheet.create({ paddingVertical: 10, backgroundColor: colors.background, }, + scrollView: { + flex: 1, + }, + scrollViewContent: { + padding: 20, + alignItems: "center", + justifyContent: "center", + }, }); diff --git a/src/screens/LibraryScreen.tsx b/src/screens/LibraryScreen.tsx index c2041fe..db64f7d 100644 --- a/src/screens/LibraryScreen.tsx +++ b/src/screens/LibraryScreen.tsx @@ -34,6 +34,8 @@ export default function LibraryScreen() { review?: string; rating: number; status: string; + favPage?: number; + favPageImage?: string; }[] >([]); const [isFilterModalVisible, setFilterModalVisible] = useState(false); @@ -95,6 +97,8 @@ export default function LibraryScreen() { publication: string; rating: number; status: string; + favPage?: number; + favPageImage?: string; }) => { setBooks((prevBooks) => { const updatedBooks = [newBook, ...prevBooks]; @@ -164,6 +168,8 @@ export default function LibraryScreen() { review={book.review || ""} rating={book.rating} status={book.status} + favPage={book.favPage} + favPageImage={book.favPageImage} /> ))} @@ -202,6 +208,8 @@ export default function LibraryScreen() { review={book.review || ""} rating={book.rating} status={book.status} + favPage={book.favPage} + favPageImage={book.favPageImage} /> ))}