diff --git a/src/navigation/Router.js b/src/navigation/Router.js
index 01bf39ed..937eb73e 100644
--- a/src/navigation/Router.js
+++ b/src/navigation/Router.js
@@ -9,14 +9,14 @@ import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityI
import Library from "../screens/Library/Library";
import History from "../screens/History/History";
-import Browse from "../screens/Browse";
+import Browse from "../screens/Browse/Browse";
import More from "../screens/More/More";
import About from "../screens/More/About";
import Settings from "../screens/More/Settings";
-import NovelItem from "../screens/NovelItem";
-import ChapterItem from "../screens/ChapterItem";
+import NovelItem from "../screens/Novel/Novel";
+import ChapterItem from "../screens/Chapter/Chapter";
// Extensions
import BoxNovel from "../screens/extensions/boxnovel/BoxNovel";
diff --git a/src/screens/Browse.js b/src/screens/Browse/Browse.js
similarity index 98%
rename from src/screens/Browse.js
rename to src/screens/Browse/Browse.js
index 5fc1b414..58e6e59d 100644
--- a/src/screens/Browse.js
+++ b/src/screens/Browse/Browse.js
@@ -9,7 +9,7 @@ import {
ActivityIndicator,
} from "react-native";
import { TouchableRipple, Button } from "react-native-paper";
-import { CustomAppbar } from "../components/common/Appbar";
+import { CustomAppbar } from "../../components/common/Appbar";
import { useSelector } from "react-redux";
diff --git a/src/screens/ChapterItem.js b/src/screens/Chapter/Chapter.js
similarity index 98%
rename from src/screens/ChapterItem.js
rename to src/screens/Chapter/Chapter.js
index 5699b80e..919d5152 100644
--- a/src/screens/ChapterItem.js
+++ b/src/screens/Chapter/Chapter.js
@@ -2,17 +2,17 @@ import React, { useState, useEffect } from "react";
import { StyleSheet, View, Text, ActivityIndicator } from "react-native";
import { Appbar, Provider, Portal } from "react-native-paper";
-import { theme } from "../theme/theme";
+import { theme } from "../../theme/theme";
import { CollapsibleHeaderScrollView } from "react-native-collapsible-header-views";
-import BottomSheet from "../components/chapter/BottomSheet";
+import BottomSheet from "./components/BottomSheet";
import * as SQLite from "expo-sqlite";
const db = SQLite.openDatabase("lnreader.db");
-import { fetchChapterFromSource } from "../services/api";
+import { fetchChapterFromSource } from "../../services/api";
-import { getReaderTheme } from "../services/asyncStorage";
+import { getReaderTheme } from "../../services/asyncStorage";
const ChapterItem = ({ route, navigation }) => {
const { extensionId, chapterUrl, novelUrl, chapterName } = route.params;
diff --git a/src/components/chapter/BottomSheet.js b/src/screens/Chapter/components/BottomSheet.js
similarity index 98%
rename from src/components/chapter/BottomSheet.js
rename to src/screens/Chapter/components/BottomSheet.js
index d0f2086b..4965911f 100644
--- a/src/components/chapter/BottomSheet.js
+++ b/src/screens/Chapter/components/BottomSheet.js
@@ -7,7 +7,7 @@ import Bottomsheet from "rn-sliding-up-panel";
import { useSelector } from "react-redux";
-import { saveReaderTheme } from "../../services/asyncStorage";
+import { saveReaderTheme } from "../../../services/asyncStorage";
const ChapterBottomSheet = ({
bottomSheetRef,
diff --git a/src/screens/History/History.js b/src/screens/History/History.js
index 825c5f9b..a55093ee 100644
--- a/src/screens/History/History.js
+++ b/src/screens/History/History.js
@@ -10,15 +10,16 @@ import {
} from "react-native";
import { CustomAppbar } from "../../components/common/Appbar";
-import HistoryCard from "../../components/history/HistoryCard";
+import HistoryCard from "./components/HistoryCard";
import { getHistoryFromDb, deleteChapterHistory } from "../../services/db";
import { useSelector } from "react-redux";
+import EmptyView from "./components/EmptyView";
const History = ({ navigation }) => {
const [loading, setLoading] = useState(true);
- const [history, setHistory] = useState();
+ const [history, setHistory] = useState([]);
const theme = useSelector((state) => state.themeReducer.theme);
@@ -38,6 +39,14 @@ const History = ({ navigation }) => {
}, [])
);
+ const renderHistoryCard = ({ item }) => (
+
+ );
+
return (
<>
@@ -51,13 +60,7 @@ const History = ({ navigation }) => {
contentContainerStyle={{ flex: 1 }}
data={history}
keyExtractor={(item) => item.historyId.toString()}
- renderItem={({ item }) => (
-
- )}
+ renderItem={renderHistoryCard}
ListFooterComponent={
loading && (
{
/>
)
}
- ListEmptyComponent={
- !loading && (
-
-
- (˘・_・˘)
-
-
- Nothing read recently.
-
-
- )
- }
+ ListEmptyComponent={!loading && }
/>
>
@@ -111,10 +83,4 @@ const styles = StyleSheet.create({
flex: 1,
padding: 10,
},
- historyCard: {
- marginTop: 10,
- borderRadius: 4,
- flexDirection: "row",
- alignItems: "center",
- },
});
diff --git a/src/screens/History/components/EmptyView.js b/src/screens/History/components/EmptyView.js
new file mode 100644
index 00000000..4c27be87
--- /dev/null
+++ b/src/screens/History/components/EmptyView.js
@@ -0,0 +1,52 @@
+import React from "react";
+import { StyleSheet, Text, View } from "react-native";
+import { useSelector } from "react-redux";
+
+const EmptyView = () => {
+ const theme = useSelector((state) => state.themeReducer.theme);
+
+ return (
+
+
+ (˘・_・˘)
+
+
+ Nothing read recently.
+
+
+ );
+};
+
+export default EmptyView;
+
+const styles = StyleSheet.create({
+ emptyViewContainer: {
+ flex: 1,
+ justifyContent: "center",
+ alignItems: "center",
+ },
+ emptyViewIcon: {
+ fontSize: 45,
+ fontWeight: "bold",
+ },
+ emptyViewText: {
+ fontWeight: "bold",
+ marginTop: 10,
+ textAlign: "center",
+ paddingHorizontal: 30,
+ },
+});
diff --git a/src/components/history/HistoryCard.js b/src/screens/History/components/HistoryCard.js
similarity index 83%
rename from src/components/history/HistoryCard.js
rename to src/screens/History/components/HistoryCard.js
index 4bf82a8a..c77fac43 100644
--- a/src/components/history/HistoryCard.js
+++ b/src/screens/History/components/HistoryCard.js
@@ -12,10 +12,7 @@ const HistoryCard = ({ item, deleteHistory, navigation }) => {
return (
@@ -31,20 +28,9 @@ const HistoryCard = ({ item, deleteHistory, navigation }) => {
<>
-
+
{
- const theme = useSelector((state) => state.themeReducer.theme);
-
- // const itemsPerRow = useSelector((state) => state.settingsReducer.itemsPerRow);
-
const [refreshing, setRefreshing] = useState(false);
- const [searchBar, setSearchBar] = useState(false);
- const [searchText, setSearchText] = useState("");
+ const [search, setSearch] = useState({ searching: false, searchText: "" });
+
+ const resetSearch = () => setSearch({ searching: false, searchText: "" });
useFocusEffect(
useCallback(() => {
- setSearchBar(false);
+ resetSearch();
getLibraryNovels();
}, [])
);
+ /**
+ * TODO: fix refreshing
+ */
const onRefresh = () => {
ToastAndroid.show("Updating library", ToastAndroid.SHORT);
setRefreshing(true);
@@ -52,13 +51,17 @@ const LibraryScreen = ({
setRefreshing(false);
};
+ const redirectToNovel = (item) =>
+ navigation.navigate("NovelItem", {
+ ...item,
+ navigatingFrom: 1,
+ });
+
return (
<>
@@ -68,93 +71,57 @@ const LibraryScreen = ({
{ backgroundColor: theme.colorDarkPrimaryDark },
]}
>
- item.novelUrl}
- renderItem={({ item }) => (
-
- navigation.navigate("NovelItem", {
- ...item,
- navigatingFrom: 1,
- })
+ {loading ? (
+
+ ) : (
+ <>
+ item.novelUrl}
+ renderItem={({ item }) => (
+ redirectToNovel(item)}
+ />
+ )}
+ refreshControl={
+
}
- />
- )}
- refreshControl={
-
- }
- ListEmptyComponent={
- !loading ? (
- !searchBar ? (
-
+ ListEmptyComponent={
+ search.searchText === "" ? (
+
+ ) : (
- Σ(ಠ_ಠ)
-
-
- Your library is empty. Add series to
- your library from Browse.
-
-
- ) : (
- searchBar &&
- searchText !== "" && (
-
- {`"${searchText}" not in library`}
+ {`"${search.searchText}" not in library`}
)
- )
- ) : (
-
- )
- }
- />
+ }
+ />
+ >
+ )}
>
);
};
const mapStateToProps = (state) => ({
+ theme: state.themeReducer.theme,
novels: state.libraryReducer.novels,
loading: state.libraryReducer.loading,
});
@@ -169,4 +136,10 @@ const styles = StyleSheet.create({
flex: 1,
padding: 4,
},
+ emptySearch: {
+ fontWeight: "bold",
+ marginTop: 10,
+ textAlign: "center",
+ paddingHorizontal: 30,
+ },
});
diff --git a/src/screens/Library/components/Appbar.js b/src/screens/Library/components/Appbar.js
index 0b9f69b0..18941827 100644
--- a/src/screens/Library/components/Appbar.js
+++ b/src/screens/Library/components/Appbar.js
@@ -1,22 +1,22 @@
import React from "react";
-import { TextInput } from "react-native";
+import { StyleSheet, TextInput } from "react-native";
import { Appbar } from "react-native-paper";
import { useSelector } from "react-redux";
const LibraryAppbar = ({
- searchBar,
- setSearchBar,
- searchText,
- setSearchText,
+ search,
+ setSearch,
getLibraryNovels,
searchLibraryNovels,
}) => {
const theme = useSelector((state) => state.themeReducer.theme);
+ const { searching, searchText } = search;
+
return (
- {!searchBar ? (
+ {!searching ? (
<>
setSearchBar(true)}
+ onPress={() =>
+ setSearch({ ...search, searching: true })
+ }
color={theme.textColorPrimaryDark}
/>
{
- setSearchBar(false);
- setSearchText("");
+ setSearch({ searching: false, searchText: "" });
getLibraryNovels();
}}
color={theme.textColorPrimaryDark}
@@ -48,17 +49,17 @@ const LibraryAppbar = ({
{
- setSearchText(text);
+ setSearch({ ...search, searchText: text });
searchLibraryNovels(text);
}}
/>
@@ -66,7 +67,7 @@ const LibraryAppbar = ({
{
- setSearchText("");
+ setSearch({ ...search, searchText: "" });
getLibraryNovels();
}}
color={theme.textColorPrimaryDark}
@@ -79,3 +80,7 @@ const LibraryAppbar = ({
};
export default LibraryAppbar;
+
+const styles = StyleSheet.create({
+ searchBar: { fontSize: 18, flex: 1, marginLeft: 15 },
+});
diff --git a/src/components/library/BottomSheet.js b/src/screens/Library/components/BottomSheet.js
similarity index 100%
rename from src/components/library/BottomSheet.js
rename to src/screens/Library/components/BottomSheet.js
diff --git a/src/screens/Library/components/EmptyView.js b/src/screens/Library/components/EmptyView.js
new file mode 100644
index 00000000..4ee24872
--- /dev/null
+++ b/src/screens/Library/components/EmptyView.js
@@ -0,0 +1,52 @@
+import React from "react";
+import { StyleSheet, Text, View } from "react-native";
+import { useSelector } from "react-redux";
+
+const EmptyView = () => {
+ const theme = useSelector((state) => state.themeReducer.theme);
+
+ return (
+
+
+ Σ(ಠ_ಠ)
+
+
+ Your library is empty. Add series to your library from Browse.
+
+
+ );
+};
+
+export default EmptyView;
+
+const styles = StyleSheet.create({
+ emptyViewContainer: {
+ flex: 1,
+ justifyContent: "center",
+ alignItems: "center",
+ },
+ emptyViewIcon: {
+ fontSize: 45,
+ fontWeight: "bold",
+ },
+ emptyViewText: {
+ fontWeight: "bold",
+ marginTop: 10,
+ textAlign: "center",
+ paddingHorizontal: 30,
+ },
+});
diff --git a/src/screens/NovelItem.js b/src/screens/Novel/Novel.js
similarity index 96%
rename from src/screens/NovelItem.js
rename to src/screens/Novel/Novel.js
index cbcfa88b..de449728 100644
--- a/src/screens/NovelItem.js
+++ b/src/screens/Novel/Novel.js
@@ -9,11 +9,14 @@ import {
} from "react-native";
import { Provider, Portal } from "react-native-paper";
-import ChapterCard from "../components/novel/ChapterCard";
-import NovelInfoHeader from "../components/novel/NovelHeader";
-import { BottomSheet } from "../components/novel/BottomSheet";
+import ChapterCard from "./components/ChapterCard";
+import NovelInfoHeader from "./components/NovelHeader";
+import { BottomSheet } from "./components/BottomSheet";
-import { fetchNovelFromSource, fetchChaptersFromSource } from "../services/api";
+import {
+ fetchNovelFromSource,
+ fetchChaptersFromSource,
+} from "../../services/api";
import {
insertNovelInfoInDb,
insertChaptersInDb,
@@ -22,7 +25,7 @@ import {
getNovelInfoFromDb,
toggleFavourite,
downloadOrDeleteChapter,
-} from "../services/db";
+} from "../../services/db";
import { useSelector } from "react-redux";
diff --git a/src/components/novel/BottomSheet.js b/src/screens/Novel/components/BottomSheet.js
similarity index 100%
rename from src/components/novel/BottomSheet.js
rename to src/screens/Novel/components/BottomSheet.js
diff --git a/src/components/novel/ChapterCard.js b/src/screens/Novel/components/ChapterCard.js
similarity index 100%
rename from src/components/novel/ChapterCard.js
rename to src/screens/Novel/components/ChapterCard.js
diff --git a/src/components/novel/NovelHeader.js b/src/screens/Novel/components/NovelHeader.js
similarity index 100%
rename from src/components/novel/NovelHeader.js
rename to src/screens/Novel/components/NovelHeader.js