From 40dfebe96452adeefee1268798452719f18803bf Mon Sep 17 00:00:00 2001 From: Rajarshee Chatterjee Date: Wed, 30 Dec 2020 12:43:58 +0530 Subject: [PATCH] Break into components --- App.js | 4 +- assets/sourceCovers/BoxNovel.png | Bin 0 -> 33059 bytes assets/sourceCovers/ReadLightNovel.png | Bin 0 -> 13962 bytes src/components/Appbar.js | 13 + src/components/ChapterCard.js | 88 +++++ src/components/HistoryCard.js | 118 +++++++ src/components/NovelInfoHeader.js | 423 +++++++++++++++++++++++++ src/navigation/Router.js | 136 ++------ src/screens/Browse.js | 150 ++++----- src/screens/History/History.js | 136 +------- src/screens/Library.js | 118 +++---- src/screens/More.js | 39 --- src/screens/{ => More}/About.js | 10 +- src/screens/More/More.js | 54 ++++ src/screens/NovelItem.js | 412 ++++-------------------- 15 files changed, 950 insertions(+), 751 deletions(-) create mode 100644 assets/sourceCovers/BoxNovel.png create mode 100644 assets/sourceCovers/ReadLightNovel.png create mode 100644 src/components/Appbar.js create mode 100644 src/components/ChapterCard.js create mode 100644 src/components/HistoryCard.js create mode 100644 src/components/NovelInfoHeader.js delete mode 100644 src/screens/More.js rename src/screens/{ => More}/About.js (86%) create mode 100644 src/screens/More/More.js diff --git a/App.js b/App.js index 0741bf8f..04a99b6d 100644 --- a/App.js +++ b/App.js @@ -32,14 +32,14 @@ export default function App() { (tx, error) => console.log(error) ); tx.executeSql( - "CREATE TABLE IF NOT EXISTS HistoryTable (historyId INTEGER PRIMARY KEY AUTOINCREMENT, chapterUrl VARCHAR(255) UNIQUE, novelUrl VARCHAR(255), chapterName VARCHAR(255), lastRead DATETIME DEFAULT CURRENT_TIMESTAMP)", + "CREATE TABLE IF NOT EXISTS HistoryTable (historyId INTEGER PRIMARY KEY AUTOINCREMENT, chapterUrl VARCHAR(255) UNIQUE, novelUrl VARCHAR(255) UNIQUE, chapterName VARCHAR(255), lastRead DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (novelUrl) REFERENCES LibraryTable(novelUrl) ON DELETE CASCADE)", null, (tx, results) => console.log("History Table Created"), (tx, error) => console.log(error) ); tx.executeSql( - "CREATE TABLE IF NOT EXISTS DownloadsTable (downloadId INTEGER PRIMARY KEY AUTOINCREMENT, chapterUrl VARCHAR(255) UNIQUE, novelUrl VARCHAR(255), chapterName VARCHAR(255), chapterText VARCHAR(255), nextChapter VARCHAR(255), prevChapter VARCHAR(255))", + "CREATE TABLE IF NOT EXISTS DownloadsTable (downloadId INTEGER PRIMARY KEY AUTOINCREMENT, chapterUrl VARCHAR(255) UNIQUE, novelUrl VARCHAR(255), chapterName VARCHAR(255), chapterText VARCHAR(255), nextChapter VARCHAR(255), prevChapter VARCHAR(255), FOREIGN KEY (novelUrl) REFERENCES LibraryTable(novelUrl) ON DELETE CASCADE)", null, (tx, results) => console.log("Downloads Table Created"), (tx, error) => console.log(error) diff --git a/assets/sourceCovers/BoxNovel.png b/assets/sourceCovers/BoxNovel.png new file mode 100644 index 0000000000000000000000000000000000000000..2952c36920906bd33ee668d68ebd9e6a9fb0bbc0 GIT binary patch literal 33059 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 KSha{j(Ek9Ny^)Ln literal 0 HcmV?d00001 diff --git a/assets/sourceCovers/ReadLightNovel.png b/assets/sourceCovers/ReadLightNovel.png new file mode 100644 index 0000000000000000000000000000000000000000..a8229e1b8fe6596e21e8d7700aca58bc65b76bd1 GIT binary patch literal 13962 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 R`9E)mDaonHR!EzN{68RAJk|gJ literal 0 HcmV?d00001 diff --git a/src/components/Appbar.js b/src/components/Appbar.js new file mode 100644 index 00000000..147e42aa --- /dev/null +++ b/src/components/Appbar.js @@ -0,0 +1,13 @@ +import React from "react"; +import { Appbar } from "react-native-paper"; +import { theme } from "../theming/theme"; + +export const CustomAppbar = ({ title, onBackAction }) => ( + + {onBackAction && } + + +); diff --git a/src/components/ChapterCard.js b/src/components/ChapterCard.js new file mode 100644 index 00000000..510a20f8 --- /dev/null +++ b/src/components/ChapterCard.js @@ -0,0 +1,88 @@ +import React from "react"; +import { View, Text } from "react-native"; +import { TouchableRipple, IconButton } from "react-native-paper"; +import { theme } from "../theming/theme"; + +const ChapterCard = ({ + navigation, + novelUrl, + chapter, + downloadChapter, + extensionId, +}) => ( + + navigation.navigate("ChapterItem", { + chapterUrl: chapter.chapterUrl, + extensionId, + novelUrl: novelUrl, + chapterName: chapter.chapterName, + }) + } + rippleColor={theme.rippleColorDark} + > + <> + + + {chapter.chapterName.substring(0, 50) + "..."} + + + {chapter.releaseDate ? chapter.releaseDate : "release-date"} + + + + { + downloadChapter( + chapter.downloaded ? chapter.downloaded : 0, + chapter.chapterUrl + ); + }} + /> + + + +); + +export default ChapterCard; diff --git a/src/components/HistoryCard.js b/src/components/HistoryCard.js new file mode 100644 index 00000000..d2a363d7 --- /dev/null +++ b/src/components/HistoryCard.js @@ -0,0 +1,118 @@ +import React from "react"; +import { theme } from "../theming/theme"; +import moment from "moment"; +import { StyleSheet, View, Text, FlatList, Image } from "react-native"; +import { TouchableRipple, IconButton, Appbar } from "react-native-paper"; + +const HistoryCard = ({ item, deleteHistory, navigation }) => ( + + navigation.navigate("NovelItem", { + novelName: item.novelName, + novelCover: item.novelCover, + extensionId: item.extensionId, + novelUrl: item.novelUrl, + }) + } + > + <> + + + + + {item.novelName} + + + {`Ch. ${item.chapterName + .replace(/^\D+/g, "") + .substring(0, 4)} - ${moment( + item.lastRead + ).calendar()}`} + + + + deleteHistory(item.novelUrl)} + /> + + navigation.navigate("ChapterItem", { + chapterUrl: item.chapterUrl, + extensionId: item.extensionId, + novelUrl: item.novelUrl, + novelName: item.novelName, + novelCover: item.novelCover, + chapterName: item.chapterName, + }) + } + /> + + + + +); + +export default HistoryCard; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: "#202125", + backgroundColor: "#000000", + padding: 10, + }, + historyCard: { + // backgroundColor: "pink", + // paddingVertical: 10, + // marginVertical: 5, + // paddingHorizontal: 20, + marginTop: 10, + borderRadius: 4, + flexDirection: "row", + alignItems: "center", + }, +}); diff --git a/src/components/NovelInfoHeader.js b/src/components/NovelInfoHeader.js new file mode 100644 index 00000000..20d12be8 --- /dev/null +++ b/src/components/NovelInfoHeader.js @@ -0,0 +1,423 @@ +import React, { useState } from "react"; +import { + View, + Text, + ImageBackground, + StyleSheet, + Image, + FlatList, +} from "react-native"; +import { TouchableRipple, IconButton, Button } from "react-native-paper"; +import { LinearGradient } from "expo-linear-gradient"; + +import { theme } from "../theming/theme"; + +const NovelInfoHeader = ({ + item, + novel, + loading, + libraryStatus, + noOfChapters, + insertToLibrary, + sortChapters, +}) => { + const [more, setMore] = useState(false); + + const renderGenreChip = ({ item }) => ( + + {item} + + ); + + return ( + <> + + + + + + + {item.novelName} + + {!loading ? ( + <> + + {novel.Alternative && + novel.Alternative.replace( + ",", + ", " + )} + + + {novel["Author(s)"].replace(",", ", ")} + + + {novel["Release"]} + + + {novel["Status"] + + " • " + + novel["Type"]} + + + ) : ( + <> + + {item.Alternative && + item.Alternative.replace(",", ", ")} + + + {item["Author(s)"] && + item["Author(s)"].replace( + ",", + ", " + )} + + + {item["Release"] && item["Release"]} + + + {item["Status"] && + item["Type"] && + item["Status"] + + " • " + + item["Type"]} + + + )} + + + + + + {!loading ? ( + <> + + {novel.novelSummary.length > 0 && ( + + + About + + setMore(!more)} + ellipsizeMode="clip" + > + {novel.novelSummary} + + setMore(!more)} + > + {more ? "Less" : "More"} + + + )} + item} + renderItem={renderGenreChip} + /> + sortChapters()} + rippleColor={theme.rippleColorDark} + > + <> + + {noOfChapters + " Chapters"} + + sortChapters()} + /> + + + + ) : ( + <> + {item.libraryStatus && ( + + )} + {item.novelSummary && item.novelSummary.length > 0 && ( + + + About + + setMore(!more)} + ellipsizeMode="clip" + > + {item.novelSummary} + + setMore(!more)} + > + {more ? "Less" : "More"} + + + )} + item} + renderItem={({ item }) => ( + + {item} + + )} + /> + + )} + + ); +}; + +export default NovelInfoHeader; + +const styles = StyleSheet.create({ + 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/navigation/Router.js b/src/navigation/Router.js index fe978eaf..66c9532e 100644 --- a/src/navigation/Router.js +++ b/src/navigation/Router.js @@ -1,108 +1,53 @@ import React from "react"; -import { createStackNavigator } from "@react-navigation/stack"; + +import { + createStackNavigator, + TransitionPresets, +} from "@react-navigation/stack"; import { createMaterialBottomTabNavigator } from "@react-navigation/material-bottom-tabs"; -import { TransitionPresets } from "@react-navigation/stack"; import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityIcons"; import Library from "../screens/Library"; +import History from "../screens/History/History"; import Browse from "../screens/Browse"; -import Latest from "../screens/Latest"; -import More from "../screens/More"; -import BoxNovelSearch from "../screens/Sources/BoxNovel/BoxNovelSearch"; + +import More from "../screens/More/More"; +import About from "../screens/More/About"; + import NovelItem from "../screens/NovelItem"; import ChapterItem from "../screens/ChapterItem"; -import About from "../screens/About"; -import HistoryScreen from "../screens/History/History"; -import Updates from "../screens/Updates/Updates"; -import BoxNovel from "../screens/Sources/BoxNovel/BoxNovel"; -import { theme } from "../theming/theme"; +// Sources +import BoxNovel from "../screens/Sources/BoxNovel/BoxNovel"; +import BoxNovelSearch from "../screens/Sources/BoxNovel/BoxNovelSearch"; import ReadLightNovel from "../screens/Sources/ReadLightNovel/ReadLightNovel"; import ReadLightNovelSearch from "../screens/Sources/ReadLightNovel/ReadLightNovelSearch"; +import { theme } from "../theming/theme"; + const Stack = createStackNavigator(); const Tab = createMaterialBottomTabNavigator(); -const LibraryStack = () => { - return ( - - - - ); +const stackNavigatorConfig = { + headerShown: false, + ...TransitionPresets.RevealFromBottomAndroid, }; -// const UpdatesStack = () => { -// return ( -// -// -// -// ); -// }; - -const SearchStack = () => { - return ( - - - - ); -}; - -const BrowseStack = () => { - return ( - - - - ); -}; const MoreStack = () => { return ( - + + ); }; const BoxNovelStack = () => { return ( - + @@ -111,12 +56,7 @@ const BoxNovelStack = () => { const ReadLightNovelStack = () => { return ( - + { ); }; -const Router = () => { +const BottomNavigator = () => { return ( ( { /> */} ( { /> ( { ); }; -const MainStack = () => { +const Router = () => { return ( - - + + - { ); }; -export default MainStack; +export default Router; diff --git a/src/screens/Browse.js b/src/screens/Browse.js index a7b42d77..012ee6fc 100644 --- a/src/screens/Browse.js +++ b/src/screens/Browse.js @@ -1,84 +1,90 @@ import React, { useEffect, useState } from "react"; import { StyleSheet, View, Text, FlatList, Image } from "react-native"; import { TouchableRipple, IconButton } from "react-native-paper"; +import { CustomAppbar } from "../components/Appbar"; import { theme } from "../theming/theme"; import { sources } from "../utils/sources"; const Browse = ({ navigation }) => { return ( - - item.sourceId.toString()} - renderItem={({ item }) => ( - - navigation.navigate(item.sourceName + "Stack") - } - rippleColor={theme.rippleColorDark} - > - <> - - - - - {item.sourceName} - - - {item.sourceLanguage} - + <> + + + item.sourceId.toString()} + renderItem={({ item }) => ( + + navigation.navigate(item.sourceName + "Stack") + } + rippleColor={theme.rippleColorDark} + > + <> + + + + + {item.sourceName} + + + {item.sourceLanguage} + + + + + navigation.navigate( + item.sourceName + "Stack", + { + screen: + item.sourceName + + "Search", + } + ) + } + /> + - - - navigation.navigate( - item.sourceName + "Stack", - { - screen: - item.sourceName + - "Search", - } - ) - } - /> - - - - - )} - /> - + + + )} + /> + + ); }; diff --git a/src/screens/History/History.js b/src/screens/History/History.js index 1d014538..d8178a9e 100644 --- a/src/screens/History/History.js +++ b/src/screens/History/History.js @@ -1,16 +1,16 @@ -import React, { useEffect, useState, useCallback } from "react"; -import { StyleSheet, View, Text, FlatList, Image } from "react-native"; -import { TouchableRipple, IconButton, Appbar } from "react-native-paper"; +import React, { useState, useCallback, useEffect } from "react"; +import { StyleSheet, View, Text, FlatList } from "react-native"; import { theme } from "../../theming/theme"; -import moment from "moment"; import { useFocusEffect } from "@react-navigation/native"; +import { CustomAppbar } from "../../components/Appbar"; +import HistoryCard from "../../components/HistoryCard"; + import * as SQLite from "expo-sqlite"; const db = SQLite.openDatabase("lnreader.db"); const History = ({ navigation }) => { - const [loading, setLoading] = useState(true); - const [novels, setNovels] = useState(); + const [history, setHistory] = useState(); const getHistory = () => { db.transaction((tx) => { @@ -18,21 +18,19 @@ const History = ({ navigation }) => { "SELECT HistoryTable.chapterUrl, HistoryTable.historyId, HistoryTable.chapterName, HistoryTable.lastRead, LibraryTable.novelName, LibraryTable.novelCover, LibraryTable.novelUrl, LibraryTable.extensionId FROM HistoryTable INNER JOIN LibraryTable ON HistoryTable.novelUrl = LibraryTable.novelUrl ORDER BY HistoryTable.lastRead DESC", null, (txObj, { rows: { _array } }) => { - setNovels(_array); - // console.log(_array); - setLoading(false); + setHistory(_array); }, (txObj, error) => console.log("Error ", error) ); }); }; - const deleteHistory = (name) => { + const deleteHistory = (novelId) => { db.transaction((tx) => { tx.executeSql( "DELETE FROM HistoryTable WHERE novelUrl = ?", - [name], - (txObj, { rows: { _array } }) => { + [novelId], + (txObj, res) => { getHistory(); }, (txObj, error) => console.log("Error ", error) @@ -48,118 +46,18 @@ const History = ({ navigation }) => { return ( <> - - - + item.historyId.toString()} renderItem={({ item }) => ( - - navigation.navigate("NovelItem", { - novelName: item.novelName, - novelCover: item.novelCover, - extensionId: item.extensionId, - novelUrl: item.novelUrl, - }) - } - > - <> - - - - - {item.novelName} - - - {`Ch. ${item.chapterName - .replace(/^\D+/g, "") - .substring(0, 4)} - ${moment( - item.lastRead - ).calendar()}`} - - - - - deleteHistory(item.novelUrl) - } - /> - - navigation.navigate( - "ChapterItem", - { - chapterUrl: - item.chapterUrl, - extensionId: - item.extensionId, - novelUrl: item.novelUrl, - novelName: - item.novelName, - novelCover: - item.novelCover, - chapterName: - item.chapterName, - } - ) - } - /> - - - - + )} ListEmptyComponent={ { }; return ( - - item.novelUrl} - renderItem={({ item }) => ( - navigation.navigate("NovelItem", item)} - /> - )} - refreshControl={ - - } - ListEmptyComponent={ - - + + + + item.novelUrl} + renderItem={({ item }) => ( + + navigation.navigate("NovelItem", item) + } + /> + )} + refreshControl={ + + } + ListEmptyComponent={ + - Σ(ಠ_ಠ) - - - Your library is empty. Add series to your library - from Browse. - - - } - /> - {/* */} - + + Σ(ಠ_ಠ) + + + Your library is empty. Add series to your + library from Browse. + + + } + /> + {/* */} + + ); }; diff --git a/src/screens/More.js b/src/screens/More.js deleted file mode 100644 index 3ec69ed0..00000000 --- a/src/screens/More.js +++ /dev/null @@ -1,39 +0,0 @@ -import React from "react"; -import { StyleSheet } from "react-native"; -import { List } from "react-native-paper"; -import { theme } from "../theming/theme"; - -const MoreScreen = ({ navigation }) => { - return ( - - ( - - )} - onPress={() => navigation.navigate("About")} - /> - - ); -}; - -export default MoreScreen; - -const styles = StyleSheet.create({ - container: { - flex: 1, - // backgroundColor: "#202125", - backgroundColor: "#000000", - }, -}); diff --git a/src/screens/About.js b/src/screens/More/About.js similarity index 86% rename from src/screens/About.js rename to src/screens/More/About.js index 829385a3..65f3d58e 100644 --- a/src/screens/About.js +++ b/src/screens/More/About.js @@ -1,11 +1,16 @@ import React from "react"; import { List, Divider } from "react-native-paper"; import * as Linking from "expo-linking"; -import { theme } from "../theming/theme"; +import { theme } from "../../theming/theme"; +import { CustomAppbar } from "../../components/Appbar"; const AboutScreen = ({ navigation }) => { return ( <> + navigation.goBack()} + /> { "https://github.com/rajarsheechatterjee/LNReader/commits/master" ) } + rippleColor={theme.rippleColorDark} /> @@ -48,6 +54,7 @@ const AboutScreen = ({ navigation }) => { "https://github.com/rajarsheechatterjee/lnreader" ) } + rippleColor={theme.rippleColorDark} /> { "https://github.com/rajarsheechatterjee/lnreader-extensions" ) } + rippleColor={theme.rippleColorDark} /> diff --git a/src/screens/More/More.js b/src/screens/More/More.js new file mode 100644 index 00000000..cd56bcbb --- /dev/null +++ b/src/screens/More/More.js @@ -0,0 +1,54 @@ +import React from "react"; +import { StyleSheet } from "react-native"; +import { List } from "react-native-paper"; +import { CustomAppbar } from "../../components/Appbar"; +import { theme } from "../../theming/theme"; + +const MoreScreen = ({ navigation }) => { + return ( + <> + + + ( + + )} + onPress={() => navigation.navigate("About")} + /> + ( + + )} + onPress={() => navigation.navigate("About")} + /> + + + ); +}; + +export default MoreScreen; + +const styles = StyleSheet.create({ + container: { + flex: 1, + // backgroundColor: "#202125", + backgroundColor: "#000000", + }, +}); diff --git a/src/screens/NovelItem.js b/src/screens/NovelItem.js index 057fdb7e..6b69881a 100644 --- a/src/screens/NovelItem.js +++ b/src/screens/NovelItem.js @@ -1,27 +1,21 @@ -import React, { useState, useCallback, useEffect } from "react"; +import React, { useState, useCallback } from "react"; +import { useFocusEffect } from "@react-navigation/native"; + import { StyleSheet, View, - Image, - ImageBackground, - Text, FlatList, RefreshControl, ToastAndroid, + ActivityIndicator, } from "react-native"; -import { - Appbar, - TouchableRipple, - IconButton, - Button, - FAB, - ProgressBar, -} from "react-native-paper"; -import { LinearGradient } from "expo-linear-gradient"; -import { useFocusEffect } from "@react-navigation/native"; +import { Appbar, FAB, ProgressBar } from "react-native-paper"; import { theme } from "../theming/theme"; +import ChapterCard from "../components/ChapterCard"; +import NovelInfoHeader from "../components/NovelInfoHeader"; + import * as SQLite from "expo-sqlite"; const db = SQLite.openDatabase("lnreader.db"); @@ -35,9 +29,8 @@ const NovelItem = ({ route, navigation }) => { const [novel, setNovel] = useState(item); const [chapters, setChapters] = useState(); - const [more, setMore] = useState(false); - const [libraryStatus, setlibraryStatus] = useState(0); + const [libraryStatus, setlibraryStatus] = useState(item.libraryStatus); const [sort, setSort] = useState("ASC"); const [readingStatus, setReadingStatus] = useState(); @@ -63,21 +56,8 @@ const NovelItem = ({ route, navigation }) => { }); }; - const getNovelFromDb = () => { + const getChaptersFromDb = () => { 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); - setlibraryStatus(row.libraryStatus); - } - }, - (txObj, error) => console.log("Error ", error) - ); tx.executeSql( `SELECT * FROM ChapterTable WHERE novelUrl=? ORDER BY chapterId ${sort}`, [item.novelUrl], @@ -109,14 +89,12 @@ const NovelItem = ({ route, navigation }) => { (txObj, results) => { let len = results.rows.length; if (len > 0) { - for (let i = 0; i < len; i++) { - let row = results.rows.item(i); - setReadingStatus({ - chapterUrl: row.chapterUrl, - chapterName: row.chapterName, - fabLabel: "Resume", - }); - } + let row = results.rows.item(0); + setReadingStatus({ + chapterUrl: row.chapterUrl, + chapterName: row.chapterName, + fabLabel: "Resume", + }); } else { setReadingStatus({ chapterUrl: chapUrl, @@ -149,7 +127,7 @@ const NovelItem = ({ route, navigation }) => { 0, ], (tx, res) => { - console.log("Inserted into DB"); + // console.log("Inserted into DB"); }, (txObj, error) => console.log("Error ", error) ); @@ -181,9 +159,9 @@ const NovelItem = ({ route, navigation }) => { `UPDATE ChapterTable SET downloaded = 1 WHERE chapterUrl = ?`, [cdUrl], (tx, res) => { - console.log( - "Updated Download Status to downloaded" - ); + // console.log( + // "Updated Download Status to downloaded" + // ); }, (txObj, error) => console.log("Error ", error) ); @@ -202,7 +180,7 @@ const NovelItem = ({ route, navigation }) => { `Downloaded ${json.chapterName}`, ToastAndroid.SHORT ); - console.log("Inserted into Downloads Table"); + // console.log("Inserted into Downloads Table"); }, (txObj, error) => console.log("Error ", error) ); @@ -218,7 +196,7 @@ const NovelItem = ({ route, navigation }) => { `UPDATE ChapterTable SET downloaded = 0 WHERE chapterUrl = ?`, [cdUrl], (tx, res) => { - console.log("Updated Download Status to downloaded"); + // console.log("Updated Download Status to downloaded"); }, (txObj, error) => console.log("Error ", error) ); @@ -226,7 +204,7 @@ const NovelItem = ({ route, navigation }) => { `DELETE FROM DownloadsTable WHERE chapterUrl = ?`, [cdUrl], (tx, res) => { - console.log("Deleted Download"); + // console.log("Deleted Download"); checkIfExistsInDB(); ToastAndroid.show( `Chapter deleted`, @@ -250,7 +228,7 @@ const NovelItem = ({ route, navigation }) => { "Added to library", ToastAndroid.SHORT ); - console.log("Inserted into Library"); + // console.log("Inserted into Library"); setlibraryStatus(1); }, @@ -267,7 +245,7 @@ const NovelItem = ({ route, navigation }) => { "Removed from library", ToastAndroid.SHORT ); - console.log("Removed From Library"); + // console.log("Removed From Library"); setlibraryStatus(0); }, (txObj, error) => console.log("Error ", error) @@ -284,12 +262,15 @@ const NovelItem = ({ route, navigation }) => { (txObj, res) => { if (res.rows.length === 0) { setRefreshing(true); - console.log("Not In Database"); + setlibraryStatus(0); + // console.log("Not In Database"); getNovel(); } else { // setRefreshing(true); - console.log("In Database"); - getNovelFromDb(); + // console.log("In Database"); + setlibraryStatus(res.rows.item(0).libraryStatus); + setNovel(res.rows.item(0)); + getChaptersFromDb(); } }, (txObj, error) => console.log("Error ", error) @@ -313,6 +294,16 @@ const NovelItem = ({ route, navigation }) => { checkIfExistsInDB(); }; + const renderChapterCard = ({ item }) => ( + + ); + return ( <> @@ -324,10 +315,10 @@ const NovelItem = ({ route, navigation }) => { size={26} style={{ marginRight: 0 }} /> - {/* */} + /> @@ -344,312 +335,18 @@ const NovelItem = ({ route, navigation }) => { removeClippedSubviews={true} maxToRenderPerBatch={10} initialNumToRender={10} - renderItem={({ item }) => ( - - navigation.navigate("ChapterItem", { - chapterUrl: item.chapterUrl, - extensionId, - novelUrl: novelUrl, - chapterName: item.chapterName, - }) - } - rippleColor={theme.rippleColorDark} - > - <> - - - {item.chapterName} - - - {item.releaseDate - ? item.releaseDate - : "release-date"} - - - - { - downloadChapter( - item.downloaded - ? item.downloaded - : 0, - item.chapterUrl - ); - }} - /> - - - + renderItem={renderChapterCard} + ListHeaderComponent={() => ( + )} - ListHeaderComponent={ - <> - - - - - - - {item.novelName} - - {!loading && ( - <> - - {novel.Alternative && - 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} - - )} - /> - sortChapters()} - rippleColor={theme.rippleColorDark} - > - <> - - {chapters.length + " Chapters"} - - sortChapters()} - /> - - - - )} - - } refreshControl={ { label={readingStatus.fabLabel} color={theme.textColorPrimaryDark} onPress={() => { - // console.log(readingStatus); navigation.navigate("ChapterItem", { chapterUrl: readingStatus.chapterUrl, extensionId,