diff --git a/src/navigation/Router.js b/src/navigation/Router.js index 393533d1..66c642ad 100644 --- a/src/navigation/Router.js +++ b/src/navigation/Router.js @@ -13,9 +13,7 @@ import Search from "../screens/Search"; import NovelItem from "../screens/NovelItem"; import ChapterItem from "../screens/ChapterItem"; import About from "../screens/About"; -import LibraryNovelItem from "../screens/LibraryNovelItem"; import { theme } from "../theming/theme"; -import NovelItemRewrite from "../screens/NovelItemRewrite"; const Stack = createStackNavigator(); @@ -173,15 +171,6 @@ const MainStack = () => { - - - { rippleColor="rgba(256,256,256,0.3)" style={styles.opac} onPress={() => - navigation.navigate( - "NovelItemRewrite", - item - ) + navigation.navigate("NovelItem", item) } > diff --git a/src/screens/LibraryNovelItem.js b/src/screens/LibraryNovelItem.js deleted file mode 100644 index e3b3f342..00000000 --- a/src/screens/LibraryNovelItem.js +++ /dev/null @@ -1,510 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { - StyleSheet, - View, - Image, - ImageBackground, - Text, - FlatList, - ScrollView, - RefreshControl, - ToastAndroid, -} from "react-native"; -import { - Appbar, - TouchableRipple, - IconButton, - Button, -} from "react-native-paper"; -import { LinearGradient } from "expo-linear-gradient"; - -import { theme } from "../theming/theme"; - -import * as SQLite from "expo-sqlite"; -const db = SQLite.openDatabase("lnreader.db"); - -const NovelItem = ({ route, navigation }) => { - const item = route.params; - - const [loading, setLoading] = useState(true); - const [refreshing, setRefreshing] = useState(false); - const [libraryStatus, setlibraryStatus] = useState(); - - const [novel, setNovel] = useState(); - const [chapters, setChapters] = useState(); - const [more, setMore] = useState(false); - - const fetchNovel = () => { - db.transaction((tx) => { - tx.executeSql( - "SELECT * FROM LibraryTable WHERE novelUrl=?", - [item.novelUrl], - (txObj, { rows: { _array } }) => { - setNovel(_array); - }, - (txObj, error) => console.log("Error ", error) - ); - tx.executeSql( - "SELECT * FROM ChapterTable WHERE novelUrl=?", - [item.novelUrl], - (txObj, { rows: { _array } }) => { - setChapters(_array); - // !_array.length && getChapters(); - setRefreshing(false); - setLoading(false); - }, - (txObj, error) => console.log("Error ", error) - ); - }); - }; - - // const getChapters = () => { - // fetch(`http://192.168.1.39:5000/api/novel/${item.novelUrl}`) - // .then((response) => response.json()) - // .then((json) => { - // setChapters(json.novelChapters); - // }) - // .catch((error) => console.error(error)); - // }; - - const checkIfExistsInLibrary = (id) => { - db.transaction((tx) => { - tx.executeSql( - "SELECT * FROM LibraryTable WHERE novelUrl=?", - [id], - (txObj, res) => { - // console.log(res.rows.length); - if (res.rows.length === 0) { - // console.log("Not In Library"); - setlibraryStatus(0); - } else { - // console.log("In Library"); - setlibraryStatus(1); - } - }, - (txObj, error) => console.log("Error ", error) - ); - }); - }; - - const sortChapters = () => { - db.transaction((tx) => { - tx.executeSql( - "SELECT * FROM ChapterTable WHERE novelUrl=? ORDER BY chapterName ASC", - [item.novelUrl], - (txObj, { rows: { _array } }) => { - setChapters(_array); - setLoading(false); - }, - (txObj, error) => console.log("Error ", error) - ); - }); - }; - - const insertToLibrary = () => { - if (libraryStatus === 0) { - db.transaction((tx) => { - tx.executeSql( - "INSERT INTO LibraryTable (novelUrl, novelName, novelCover, novelSummary, alternative, author, genre, type, releaseDate, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - [ - item.novelUrl, - item.novelName, - item.novelCover, - item.novelSummary, - item.Alternative, - item["Author(s)"], - item["Genres(s)"], - item.Type, - item.Release, - item.Status, - ], - (txObj, res) => { - console.log("Novel Inserted"); - }, - (txObj, error) => console.log("Error ", error) - ); - - chapters.map((chap) => - tx.executeSql( - "INSERT INTO ChapterTable (chapterUrl, chapterName, releaseDate, novelUrl) values (?, ?, ?, ?)", - [ - chap.chapterUrl, - chap.chapterName, - chap.releaseDate, - item.novelUrl, - ], - (txObj, res) => { - // console.log("Chapters Inserted"); - }, - (txObj, error) => console.log("Error ", error) - ) - ); - setlibraryStatus(1); - ToastAndroid.show("Added to library", ToastAndroid.SHORT); - }); - } else { - db.transaction((tx) => { - tx.executeSql( - "DELETE FROM LibraryTable WHERE novelUrl=?", - [item.novelUrl], - (txObj, res) => { - console.log("DELETED NOVEL FROM TABLE"); - }, - (txObj, error) => console.log("Error ", error) - ); - tx.executeSql( - "DELETE FROM ChapterTable WHERE novelUrl=?", - [item.novelUrl], - (txObj, res) => { - console.log("DELETED Chapters FROM TABLE"); - }, - (txObj, error) => console.log("Error ", error) - ); - console.log("Removed Novel"); - setlibraryStatus(0); - ToastAndroid.show("Removed from library", ToastAndroid.SHORT); - }); - } - }; - - useEffect(() => { - fetchNovel(); - checkIfExistsInLibrary(item.novelUrl); - }, []); - - const onRefresh = async () => { - setRefreshing(true); - fetchNovel(); - }; - - return ( - <> - - { - navigation.goBack(); - }} - color={"white"} - size={26} - style={{ marginRight: 0 }} - /> - - - - - } - > - - - - - - - {item.novelName} - - {!loading && ( - <> - - {item.Alternative.replace( - ",", - ", " - )} - - - {item["Author(s)"].replace( - ",", - ", " - )} - - - {item.Release} - - - {item.Status + " • " + item.Type} - - - )} - - - - - {!loading && ( - <> - - {item.novelSummary.length > 0 && ( - - - About - - setMore(!more)} - ellipsizeMode="clip" - > - {item.novelSummary} - - setMore(!more)} - > - {more ? "Less" : "More"} - - - )} - item} - renderItem={({ item }) => ( - - {item} - - )} - /> - - - setChapters((chapters) => chapters.reverse()) - } - rippleColor={theme.rippleColorDark} - > - <> - - {chapters.length + " Chapters"} - - sortChapters()} - /> - - - - item.chapterUrl - ? item.chapterUrl - : item.chapterUrl - } - removeClippedSubviews={true} - maxToRenderPerBatch={10} - initialNumToRender={10} - renderItem={({ item }) => ( - - navigation.navigate("ChapterItem", { - chapterUrl: item.chapterUrl, - }) - } - rippleColor={theme.rippleColorDark} - > - <> - - {item.chapterName} - - - {item.releaseDate} - - - - )} - /> - - )} - - - ); -}; - -export default NovelItem; - -const styles = StyleSheet.create({ - container: { - flex: 1, - // backgroundColor: "#202125", - backgroundColor: "#000000", - }, - nameContainer: { - flex: 1, - width: "100%", - marginHorizontal: 15, - // justifyContent: "center", - }, - background: { - height: 240, - }, - linearGradient: { - height: "100%", - backgroundColor: "rgba(256, 256, 256, 0.5)", - }, - detailsContainer: { - flex: 1, - flexDirection: "row", - margin: 15, - }, - logo: { - height: 180, - width: 120, - margin: 3.2, - borderRadius: 6, - }, - genre: { - borderRadius: 24, - borderWidth: 1, - paddingHorizontal: 10, - marginHorizontal: 2, - fontSize: 13, - paddingVertical: 2, - justifyContent: "center", - flex: 1, - }, - name: { - fontWeight: "bold", - fontSize: 20, - }, -}); diff --git a/src/screens/NovelItem.js b/src/screens/NovelItem.js index f1ea6839..8f9a1005 100644 --- a/src/screens/NovelItem.js +++ b/src/screens/NovelItem.js @@ -26,13 +26,14 @@ const NovelItem = ({ route, navigation }) => { const item = route.params; const [loading, setLoading] = useState(true); - const [refreshing, setRefreshing] = useState(true); + const [refreshing, setRefreshing] = useState(false); - const [novel, setNovel] = useState(); + const [novel, setNovel] = useState(item); const [chapters, setChapters] = useState(); const [more, setMore] = useState(false); const [libraryStatus, setlibraryStatus] = useState(); + // const [dbFlag, setDbFlag] = useState(0); const getNovel = () => { fetch(`http://192.168.1.39:5000/api/novel/${item.novelUrl}`) @@ -40,7 +41,6 @@ const NovelItem = ({ route, navigation }) => { .then((json) => { setNovel(json); setChapters(json.novelChapters); - checkIfExistsInLibrary(json.novelUrl); }) .catch((error) => console.error(error)) .finally(() => { @@ -49,34 +49,62 @@ const NovelItem = ({ route, navigation }) => { }); }; + const getNovelFromDb = () => { + db.transaction((tx) => { + tx.executeSql( + "SELECT * FROM LibraryTable WHERE novelUrl=?", + [item.novelUrl], + (txObj, results) => { + let len = results.rows.length; + for (let i = 0; i < len; i++) { + let row = results.rows.item(i); + setNovel(row); + } + }, + (txObj, error) => console.log("Error ", error) + ); + tx.executeSql( + "SELECT * FROM ChapterTable WHERE novelUrl=?", + [item.novelUrl], + (txObj, { rows: { _array } }) => { + setChapters(_array); + setRefreshing(false); + setLoading(false); + }, + (txObj, error) => console.log("Error ", error) + ); + }); + }; + const insertToLibrary = () => { if (libraryStatus === 0) { db.transaction((tx) => { tx.executeSql( - "INSERT INTO LibraryTable (novelId, novelName, novelCover, novelSummary, alternative, author, genre, type, releaseDate, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "INSERT INTO LibraryTable (novelUrl, novelName, novelCover, novelSummary, Alternative, `Author(s)`, `Genre(s)`, Type, `Release`, Status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", [ - novel.novelUrl, + item.novelUrl, novel.novelName, novel.novelCover, novel.novelSummary, - novel.novelDetails.Alternative, - novel.novelDetails["Author(s)"], - novel.novelDetails["Genre(s)"], - novel.novelDetails.Type, - novel.novelDetails.Release, - novel.novelDetails.Status, - ] + novel.Alternative, + novel["Author(s)"], + novel["Genre(s)"], + novel.Type, + novel.Release, + novel.Status, + ], + (tx, res) => console.log("Inserted Novel"), + (txObj, error) => console.log("Error ", error) ); - console.log("Inserted Novel"); - novel.novelChapters.map((chap) => + chapters.map((chap) => tx.executeSql( - "INSERT INTO ChapterTable (chapterId, chapterName, releaseDate, novelId) values (?, ?, ?, ?)", + "INSERT INTO ChapterTable (chapterUrl, chapterName, releaseDate, novelUrl) values (?, ?, ?, ?)", [ chap.chapterUrl, chap.chapterName, chap.releaseDate, - novel.novelUrl, + item.novelUrl, ] ) ); @@ -85,15 +113,15 @@ const NovelItem = ({ route, navigation }) => { } else { db.transaction((tx) => { tx.executeSql( - "DELETE FROM LibraryTable WHERE novelId=?", - [novel.novelUrl], + "DELETE FROM LibraryTable WHERE novelUrl=?", + [item.novelUrl], (txObj, res) => { console.log("DELETED NOVEL FROM TABLE"); }, (txObj, error) => console.log("Error ", error) ); - tx.executeSql("DELETE FROM ChapterTable WHERE novelId=?", [ - novel.novelUrl, + tx.executeSql("DELETE FROM ChapterTable WHERE novelUrl=?", [ + item.novelUrl, ]); console.log("Removed Novel"); setlibraryStatus(0); @@ -104,15 +132,18 @@ const NovelItem = ({ route, navigation }) => { const checkIfExistsInLibrary = (id) => { db.transaction((tx) => { tx.executeSql( - "SELECT * FROM LibraryTable WHERE novelId=?", + "SELECT * FROM LibraryTable WHERE novelUrl=?", [id], (txObj, res) => { console.log(res.rows.length); if (res.rows.length === 0) { + setRefreshing(true); console.log("Not In Library"); + getNovel(); setlibraryStatus(0); } else { console.log("In Library"); + getNovelFromDb(); setlibraryStatus(1); } }, @@ -122,12 +153,12 @@ const NovelItem = ({ route, navigation }) => { }; useEffect(() => { - getNovel(); + checkIfExistsInLibrary(item.novelUrl); }, []); const onRefresh = async () => { setRefreshing(true); - getNovel(); + checkIfExistsInLibrary(item.novelUrl); }; return ( @@ -196,9 +227,10 @@ const NovelItem = ({ route, navigation }) => { }} numberOfLines={1} > - {novel.novelDetails[ - "Alternative" - ].replace(",", ", ")} + {novel.Alternative.replace( + ",", + ", " + )} { fontSize: 15, }} > - {novel.novelDetails[ - "Author(s)" - ].replace(",", ", ")} + {novel["Author(s)"].replace( + ",", + ", " + )} { fontSize: 15, }} > - {novel.novelDetails["Release"]} + {novel["Release"]} { fontSize: 15, }} > - {novel.novelDetails["Status"] + + {novel["Status"] + " • " + - novel.novelDetails["Type"]} + novel["Type"]} )} @@ -323,7 +356,7 @@ const NovelItem = ({ route, navigation }) => { marginBottom: 15, }} horizontal - data={novel.novelDetails["Genre(s)"].split(",")} + data={novel["Genre(s)"].split(",")} keyExtractor={(item) => item} renderItem={({ item }) => ( { justifyContent: "space-between", alignItems: "center", }} - onPress={() => - setChapters((chapters) => chapters.reverse()) - } + // onPress={() => + // setChapters((chapters) => chapters.reverse()) + // } rippleColor={theme.rippleColorDark} > <> @@ -367,11 +400,11 @@ const NovelItem = ({ route, navigation }) => { icon="filter-variant" color={theme.textColorPrimaryDark} size={20} - onPress={() => - setChapters((chapters) => - chapters.reverse() - ) - } + // onPress={() => + // setChapters((chapters) => + // chapters.reverse() + // ) + // } /> @@ -379,7 +412,7 @@ const NovelItem = ({ route, navigation }) => { data={chapters} extraData={chapters} showsVerticalScrollIndicator={false} - keyExtractor={(item) => item.chapterUrl} + keyExtractor={(item) => novel.chapterUrl} removeClippedSubviews={true} maxToRenderPerBatch={10} initialNumToRender={10} diff --git a/src/screens/NovelItemRewrite.js b/src/screens/NovelItemRewrite.js deleted file mode 100644 index b0bd9ace..00000000 --- a/src/screens/NovelItemRewrite.js +++ /dev/null @@ -1,507 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { - StyleSheet, - View, - Image, - ImageBackground, - Text, - FlatList, - ScrollView, - RefreshControl, -} from "react-native"; -import { - Appbar, - TouchableRipple, - IconButton, - Button, -} from "react-native-paper"; -import { LinearGradient } from "expo-linear-gradient"; - -import { theme } from "../theming/theme"; - -import * as SQLite from "expo-sqlite"; -const db = SQLite.openDatabase("lnreader.db"); - -const NovelItem = ({ route, navigation }) => { - const item = route.params; - - const [loading, setLoading] = useState(true); - const [refreshing, setRefreshing] = useState(false); - - const [novel, setNovel] = useState(item); - const [chapters, setChapters] = useState(); - const [more, setMore] = useState(false); - - const [libraryStatus, setlibraryStatus] = useState(); - // const [dbFlag, setDbFlag] = useState(0); - - const getNovel = () => { - fetch(`http://192.168.1.39:5000/api/novel/${item.novelUrl}`) - .then((response) => response.json()) - .then((json) => { - setNovel(json); - setChapters(json.novelChapters); - }) - .catch((error) => console.error(error)) - .finally(() => { - setRefreshing(false); - setLoading(false); - }); - }; - - const getNovelFromDb = () => { - db.transaction((tx) => { - // tx.executeSql( - // "SELECT * FROM LibraryTable WHERE novelUrl=?", - // [item.novelUrl], - // (txObj, { rows: _array }) => { - // // setNovel(_array); - // // console.log(_array); - // }, - // (txObj, error) => console.log("Error ", error) - // ); - tx.executeSql( - "SELECT * FROM ChapterTable WHERE novelUrl=?", - [item.novelUrl], - (txObj, { rows: { _array } }) => { - setChapters(_array); - // console.log(_array); - setRefreshing(false); - setLoading(false); - }, - (txObj, error) => console.log("Error ", error) - ); - }); - }; - - const insertToLibrary = () => { - if (libraryStatus === 0) { - db.transaction((tx) => { - tx.executeSql( - "INSERT INTO LibraryTable (novelUrl, novelName, novelCover, novelSummary, Alternative, `Author(s)`, `Genre(s)`, Type, `Release`, Status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - [ - item.novelUrl, - novel.novelName, - novel.novelCover, - novel.novelSummary, - novel.Alternative, - novel["Author(s)"], - novel["Genre(s)"], - novel.Type, - novel.Release, - novel.Status, - ], - (tx, res) => console.log("Inserted Novel"), - (txObj, error) => console.log("Error ", error) - ); - - chapters.map((chap) => - tx.executeSql( - "INSERT INTO ChapterTable (chapterUrl, chapterName, releaseDate, novelUrl) values (?, ?, ?, ?)", - [ - chap.chapterUrl, - chap.chapterName, - chap.releaseDate, - item.novelUrl, - ] - ) - ); - setlibraryStatus(1); - }); - } else { - db.transaction((tx) => { - tx.executeSql( - "DELETE FROM LibraryTable WHERE novelUrl=?", - [item.novelUrl], - (txObj, res) => { - console.log("DELETED NOVEL FROM TABLE"); - }, - (txObj, error) => console.log("Error ", error) - ); - tx.executeSql("DELETE FROM ChapterTable WHERE novelUrl=?", [ - item.novelUrl, - ]); - console.log("Removed Novel"); - setlibraryStatus(0); - }); - } - }; - - const checkIfExistsInLibrary = (id) => { - db.transaction((tx) => { - tx.executeSql( - "SELECT * FROM LibraryTable WHERE novelUrl=?", - [id], - (txObj, res) => { - console.log(res.rows.length); - if (res.rows.length === 0) { - console.log("Not In Library"); - getNovel(); - setlibraryStatus(0); - } else { - console.log("In Library"); - getNovelFromDb(); - setlibraryStatus(1); - } - }, - (txObj, error) => console.log("Error ", error) - ); - }); - }; - - useEffect(() => { - checkIfExistsInLibrary(item.novelUrl); - }, []); - - const onRefresh = async () => { - setRefreshing(true); - checkIfExistsInLibrary(item.novelUrl); - }; - - return ( - <> - - { - navigation.goBack(); - }} - color={"white"} - size={26} - style={{ marginRight: 0 }} - /> - - - - - } - > - - - - - - - {item.novelName} - - {!loading && ( - <> - - {novel.Alternative.replace( - ",", - ", " - )} - - - {novel["Author(s)"].replace( - ",", - ", " - )} - - - {novel["Release"]} - - - {novel["Status"] + - " • " + - novel["Type"]} - - - )} - - - - - {!loading && ( - <> - - {/* */} - {novel.novelSummary.length > 0 && ( - - - About - - setMore(!more)} - ellipsizeMode="clip" - > - {novel.novelSummary} - - setMore(!more)} - > - {more ? "Less" : "More"} - - - )} - item} - renderItem={({ item }) => ( - - {item} - - )} - /> - - - // setChapters((chapters) => chapters.reverse()) - // } - rippleColor={theme.rippleColorDark} - > - <> - - {chapters.length + " Chapters"} - - - // setChapters((chapters) => - // chapters.reverse() - // ) - // } - /> - - - novel.chapterUrl} - removeClippedSubviews={true} - maxToRenderPerBatch={10} - initialNumToRender={10} - renderItem={({ item }) => ( - - navigation.navigate("ChapterItem", { - chapterUrl: item.chapterUrl, - }) - } - rippleColor={theme.rippleColorDark} - > - <> - - {item.chapterName} - - - {item.releaseDate} - - - - )} - /> - - )} - - - ); -}; - -export default NovelItem; - -const styles = StyleSheet.create({ - container: { - flex: 1, - // backgroundColor: "#202125", - backgroundColor: "#000000", - }, - nameContainer: { - flex: 1, - width: "100%", - marginHorizontal: 15, - // justifyContent: "center", - }, - background: { - height: 240, - }, - linearGradient: { - height: "100%", - backgroundColor: "rgba(256, 256, 256, 0.5)", - }, - detailsContainer: { - flex: 1, - flexDirection: "row", - margin: 15, - }, - logo: { - height: 180, - width: 120, - margin: 3.2, - borderRadius: 6, - }, - genre: { - borderRadius: 24, - borderWidth: 1, - paddingHorizontal: 10, - marginHorizontal: 2, - fontSize: 13, - paddingVertical: 2, - justifyContent: "center", - flex: 1, - }, - name: { - fontWeight: "bold", - fontSize: 20, - }, -}); diff --git a/src/screens/Updates.js b/src/screens/Updates.js index 6b0a625e..6a89f444 100644 --- a/src/screens/Updates.js +++ b/src/screens/Updates.js @@ -116,10 +116,7 @@ const AllNovels = ({ navigation }) => { rippleColor="rgba(256,256,256,0.3)" style={styles.opac} onPress={() => - navigation.navigate( - "NovelItemRewrite", - item - ) + navigation.navigate("NovelItem", item) } >