diff --git a/assets/sourceCovers/BoxNovel.png b/assets/sourceCovers/BoxNovel.png
new file mode 100644
index 00000000..2952c369
Binary files /dev/null and b/assets/sourceCovers/BoxNovel.png differ
diff --git a/assets/sourceCovers/WuxiaWorld.jfif b/assets/sourceCovers/WuxiaWorld.jfif
new file mode 100644
index 00000000..39a5c3b1
Binary files /dev/null and b/assets/sourceCovers/WuxiaWorld.jfif differ
diff --git a/package.json b/package.json
index 1809a08c..99d4be81 100644
--- a/package.json
+++ b/package.json
@@ -1,42 +1,42 @@
{
- "main": "node_modules/expo/AppEntry.js",
- "scripts": {
- "start": "expo start",
- "android": "expo start --android",
- "ios": "expo start --ios",
- "web": "expo start --web",
- "eject": "expo eject"
- },
- "dependencies": {
- "@react-native-community/masked-view": "0.1.10",
- "@react-native-community/slider": "^3.0.3",
- "@react-navigation/material-bottom-tabs": "^5.3.10",
- "@react-navigation/native": "^5.8.10",
- "@react-navigation/stack": "^5.12.8",
- "cheerio-without-node-native": "^0.20.2",
- "expo": "~40.0.0",
- "expo-app-loading": "^1.0.1",
- "expo-font": "^8.4.0",
- "expo-linear-gradient": "^8.4.0",
- "expo-status-bar": "~1.0.3",
- "react": "16.13.1",
- "react-dom": "16.13.1",
- "react-native": "https://github.com/expo/react-native/archive/sdk-40.0.1.tar.gz",
- "react-native-collapsible-header-views": "^1.1.2",
- "react-native-gesture-handler": "^1.8.0",
- "react-native-paper": "^4.5.0",
- "react-native-reanimated": "^1.13.2",
- "react-native-safe-area-context": "3.1.9",
- "react-native-screens": "~2.15.0",
- "react-native-sqlite-storage": "^5.0.0",
- "react-native-vector-icons": "^7.1.0",
- "react-native-web": "~0.13.12",
- "rn-sliding-up-panel": "^2.4.4",
- "expo-sqlite": "~8.5.0"
- },
- "devDependencies": {
- "@babel/core": "~7.9.0"
- },
- "private": true,
- "proxy": "http://192.168.1.38:5000"
+ "main": "node_modules/expo/AppEntry.js",
+ "scripts": {
+ "start": "expo start",
+ "android": "expo start --android",
+ "ios": "expo start --ios",
+ "web": "expo start --web",
+ "eject": "expo eject"
+ },
+ "dependencies": {
+ "@react-native-community/masked-view": "0.1.10",
+ "@react-native-community/slider": "^3.0.3",
+ "@react-navigation/material-bottom-tabs": "^5.3.10",
+ "@react-navigation/native": "^5.8.10",
+ "@react-navigation/stack": "^5.12.8",
+ "cheerio-without-node-native": "^0.20.2",
+ "expo": "~40.0.0",
+ "expo-app-loading": "^1.0.1",
+ "expo-font": "^8.4.0",
+ "expo-linear-gradient": "^8.4.0",
+ "expo-status-bar": "~1.0.3",
+ "react": "16.13.1",
+ "react-dom": "16.13.1",
+ "react-native": "https://github.com/expo/react-native/archive/sdk-40.0.1.tar.gz",
+ "react-native-collapsible-header-views": "^1.1.2",
+ "react-native-gesture-handler": "^1.8.0",
+ "react-native-paper": "^4.5.0",
+ "react-native-reanimated": "^1.13.2",
+ "react-native-safe-area-context": "3.1.9",
+ "react-native-screens": "~2.15.0",
+ "react-native-sqlite-storage": "^5.0.0",
+ "react-native-vector-icons": "^7.1.0",
+ "react-native-web": "~0.13.12",
+ "rn-sliding-up-panel": "^2.4.4",
+ "expo-sqlite": "~8.5.0"
+ },
+ "devDependencies": {
+ "@babel/core": "~7.9.0"
+ },
+ "private": true,
+ "proxy": "http://192.168.1.42:5000"
}
diff --git a/src/navigation/Router.js b/src/navigation/Router.js
index daebb7bd..929eb240 100644
--- a/src/navigation/Router.js
+++ b/src/navigation/Router.js
@@ -9,10 +9,11 @@ import Library from "../screens/Library";
import Browse from "../screens/Browse";
import Latest from "../screens/Latest";
import More from "../screens/More";
-import Search from "../screens/Search";
+import BoxNovelSearch from "../screens/Search";
import NovelItem from "../screens/NovelItem";
import ChapterItem from "../screens/ChapterItem";
import About from "../screens/About";
+import BoxNovel from "../screens/Sources/BoxNovel";
import { theme } from "../theming/theme";
const Stack = createStackNavigator();
@@ -61,11 +62,16 @@ const SearchStack = () => {
const BrowseStack = () => {
return (
-
+
);
@@ -83,6 +89,22 @@ const MoreStack = () => {
);
};
+const BoxNovelStack = () => {
+ return (
+
+
+
+ {/* */}
+
+ );
+};
+
const Router = () => {
return (
{
}}
/>
- {
/>
),
}}
- />
- */}
+ {/* {
/>
),
}}
- />
+ /> */}
{
headerStyle: { backgroundColor: theme.colorDarkPrimary },
}}
/>
+
);
};
diff --git a/src/screens/Browse.js b/src/screens/Browse.js
index d1664e63..03cbe8bc 100644
--- a/src/screens/Browse.js
+++ b/src/screens/Browse.js
@@ -2,7 +2,9 @@ import React, { useEffect, useState } from "react";
import {
StyleSheet,
View,
+ Text,
FlatList,
+ Image,
ActivityIndicator,
RefreshControl,
} from "react-native";
@@ -13,139 +15,61 @@ import {
Portal,
Button,
} from "react-native-paper";
-import NovelCover from "../components/NovelCover";
import { theme } from "../theming/theme";
-import { BottomSheet } from "../components/BottomSheet";
-
-const AllNovels = ({ navigation }) => {
- const [loading, setLoading] = useState(true);
- const [refreshing, setRefreshing] = useState(true);
- const [novels, setNovels] = useState();
- const [sort, setSort] = useState("rating");
- const [pageNo, setPageNo] = useState(2);
-
- const getNovels = () => {
- fetch(`http://192.168.1.42:5000/api/novels/1/?o=${sort}`)
- .then((response) => response.json())
- .then((json) => setNovels(json))
- .catch((error) => console.error(error))
- .finally(() => {
- setPageNo(2);
- setRefreshing(false);
- setLoading(false);
- });
- };
-
- const loadMore = () => {
- setRefreshing(true);
- fetch(`http://192.168.1.42:5000/api/novels/${pageNo}/?o=${sort}`)
- .then((response) => response.json())
- .then((json) => setNovels((novels) => novels.concat(json)))
- .catch((error) => console.error(error))
- .finally(() => {
- setRefreshing(false);
- setLoading(false);
- setPageNo(pageNo + 1);
- });
- };
-
- useEffect(() => {
- getNovels();
- }, [sort]);
-
- const onRefresh = () => {
- setRefreshing(true);
- setPageNo(2);
- getNovels();
- };
+import { sources } from "../utils/sources";
+const Browse = ({ navigation }) => {
return (
-
-
-
- _panel.show({ velocity: -1.5 })}
- />
- onRefresh()} />
-
-
- {loading ? (
-
-
-
- ) : (
- item.novelUrl}
- ListFooterComponent={() => (
-
-
-
- )}
- renderItem={({ item }) => (
-
- navigation.navigate("NovelItem", item)
- }
- >
-
-
- )}
- refreshControl={
-
+
+ item.sourceId.toString()}
+ renderItem={({ item }) => (
+
+ navigation.navigate(item.sourceName + "Stack")
}
- />
+ rippleColor={theme.rippleColorDark}
+ >
+ <>
+
+
+
+ {item.sourceName}
+
+
+ {item.sourceLanguage}
+
+
+ >
+
)}
-
-
- (_panel = c)}
- setSort={setSort}
- sort={sort}
- setRefreshing={setRefreshing}
- />
-
-
+ />
+
);
};
-export default AllNovels;
+export default Browse;
const styles = StyleSheet.create({
container: {
@@ -153,13 +77,13 @@ const styles = StyleSheet.create({
// backgroundColor: "#202125",
backgroundColor: "#000000",
},
- opac: {
- height: 190,
- flex: 1 / 3,
- marginHorizontal: 3.6,
- marginVertical: 3.2,
- },
- contentContainer: {
- flex: 1,
+ sourceCard: {
+ // backgroundColor: "pink",
+ paddingVertical: 10,
+ marginVertical: 5,
+ paddingHorizontal: 20,
+ borderRadius: 6,
+ flexDirection: "row",
+ alignItems: "center",
},
});
diff --git a/src/screens/ChapterItem.js b/src/screens/ChapterItem.js
index 7a20a7e5..29ee6ca7 100644
--- a/src/screens/ChapterItem.js
+++ b/src/screens/ChapterItem.js
@@ -1,5 +1,11 @@
import React, { useState, useEffect } from "react";
-import { StyleSheet, View, Text, ActivityIndicator } from "react-native";
+import {
+ StyleSheet,
+ View,
+ Text,
+ ActivityIndicator,
+ StatusBar,
+} from "react-native";
import BottomSheet from "../components/ChapterBottomSheet";
import { Appbar, Provider, Portal } from "react-native-paper";
@@ -14,7 +20,7 @@ const ChapterItem = ({ route, navigation }) => {
const [chapter, setChapter] = useState();
- const [size, setSize] = useState(14);
+ const [size, setSize] = useState(16);
const [readerTheme, setReaderTheme] = useState(1);
@@ -23,7 +29,7 @@ const ChapterItem = ({ route, navigation }) => {
}, []);
const getChapter = () => {
- fetch(`http://192.168.1.42:5000/api/${chapterUrl}`)
+ fetch(`http://192.168.1.42:5000/api/1/${chapterUrl}`)
.then((response) => response.json())
.then((json) => setChapter(json))
.catch((error) => console.error(error))
@@ -34,6 +40,7 @@ const ChapterItem = ({ route, navigation }) => {
return (
+
{
? { color: theme.textColorSecondaryDark }
: { color: "black" },
size === 16
- ? { lineHeight: 20 }
+ ? { lineHeight: 25 }
: size === 20
? { lineHeight: 25 }
: size === 12 && { lineHeight: 20 },
diff --git a/src/screens/Latest.js b/src/screens/Latest.js
index 86b8f690..13a57709 100644
--- a/src/screens/Latest.js
+++ b/src/screens/Latest.js
@@ -16,7 +16,7 @@ const LatestScreen = ({ navigation }) => {
const [novels, setNovels] = useState();
const getNovels = () => {
- fetch("http://192.168.1.42:5000/api/latest")
+ fetch("http://192.168.1.42:5000/api/1/latest")
.then((response) => response.json())
.then((json) => setNovels(json))
.catch((error) => console.error(error))
diff --git a/src/screens/NovelItem.js b/src/screens/NovelItem.js
index 9ddc8f6e..4d591648 100644
--- a/src/screens/NovelItem.js
+++ b/src/screens/NovelItem.js
@@ -35,10 +35,10 @@ const NovelItem = ({ route, navigation }) => {
const [more, setMore] = useState(false);
const [libraryStatus, setlibraryStatus] = useState();
- const [sort, setSort] = useState("DESC");
+ // const [sort, setSort] = useState("DESC");
const getNovel = () => {
- fetch(`http://192.168.1.42:5000/api/novel/${item.novelUrl}`)
+ fetch(`http://192.168.1.42:5000/api/1/novel/${item.novelUrl}`)
.then((response) => response.json())
.then((json) => {
setNovel(json);
@@ -212,7 +212,7 @@ const NovelItem = ({ route, navigation }) => {
data={chapters}
extraData={chapters}
showsVerticalScrollIndicator={false}
- keyExtractor={(item) => item.chapterId}
+ keyExtractor={(item) => item.chapterUrl}
removeClippedSubviews={true}
maxToRenderPerBatch={10}
initialNumToRender={10}
diff --git a/src/screens/Search.js b/src/screens/Search.js
index 1d2ce6ae..10e19b59 100644
--- a/src/screens/Search.js
+++ b/src/screens/Search.js
@@ -18,7 +18,9 @@ const SearchScreen = ({ navigation }) => {
const getNovels = (searchText) => {
setLoading(true);
- fetch(`http://192.168.1.42:5000/api/search/?s=${searchText}&?o=rating`)
+ fetch(
+ `http://192.168.1.42:5000/api/1/search/?s=${searchText}&?o=rating`
+ )
.then((response) => response.json())
.then((json) => setNovels(json))
.catch((error) => console.error(error))
diff --git a/src/screens/Sources/BoxNovel.js b/src/screens/Sources/BoxNovel.js
new file mode 100644
index 00000000..569eefd4
--- /dev/null
+++ b/src/screens/Sources/BoxNovel.js
@@ -0,0 +1,171 @@
+import React, { useEffect, useState } from "react";
+import {
+ StyleSheet,
+ View,
+ FlatList,
+ ActivityIndicator,
+ RefreshControl,
+} from "react-native";
+import {
+ TouchableRipple,
+ Appbar,
+ Provider,
+ Portal,
+ Button,
+} from "react-native-paper";
+import NovelCover from "../../components/NovelCover";
+import { theme } from "../../theming/theme";
+import { BottomSheet } from "../../components/BottomSheet";
+
+const AllNovels = ({ navigation }) => {
+ const [loading, setLoading] = useState(true);
+ const [refreshing, setRefreshing] = useState(true);
+ const [novels, setNovels] = useState();
+ const [sort, setSort] = useState("rating");
+ const [pageNo, setPageNo] = useState(2);
+
+ const getNovels = () => {
+ fetch(`http://192.168.1.42:5000/api/1/novels/1/?o=${sort}`)
+ .then((response) => response.json())
+ .then((json) => setNovels(json))
+ .catch((error) => console.error(error))
+ .finally(() => {
+ setPageNo(2);
+ setRefreshing(false);
+ setLoading(false);
+ });
+ };
+
+ const loadMore = () => {
+ setRefreshing(true);
+ fetch(`http://192.168.1.42:5000/api/1/novels/${pageNo}/?o=${sort}`)
+ .then((response) => response.json())
+ .then((json) => setNovels((novels) => novels.concat(json)))
+ .catch((error) => console.error(error))
+ .finally(() => {
+ setRefreshing(false);
+ setLoading(false);
+ setPageNo(pageNo + 1);
+ });
+ };
+
+ useEffect(() => {
+ getNovels();
+ }, [sort]);
+
+ const onRefresh = () => {
+ setRefreshing(true);
+ setPageNo(2);
+ getNovels();
+ };
+
+ return (
+
+
+ navigation.goBack()} />
+
+
+ navigation.navigate("BoxNovelSearch")}
+ />
+ _panel.show({ velocity: -1.5 })}
+ />
+ onRefresh()} />
+
+
+ {loading ? (
+
+
+
+ ) : (
+ item.novelUrl}
+ ListFooterComponent={() => (
+
+
+
+ )}
+ renderItem={({ item }) => (
+
+ navigation.navigate("NovelItem", item)
+ }
+ >
+
+
+ )}
+ refreshControl={
+
+ }
+ />
+ )}
+
+
+ (_panel = c)}
+ setSort={setSort}
+ sort={sort}
+ setRefreshing={setRefreshing}
+ />
+
+
+ );
+};
+
+export default AllNovels;
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ // backgroundColor: "#202125",
+ backgroundColor: "#000000",
+ },
+ opac: {
+ height: 190,
+ flex: 1 / 3,
+ marginHorizontal: 3.6,
+ marginVertical: 3.2,
+ },
+ contentContainer: {
+ flex: 1,
+ },
+});
diff --git a/src/utils/sources.js b/src/utils/sources.js
new file mode 100644
index 00000000..d6cddd35
--- /dev/null
+++ b/src/utils/sources.js
@@ -0,0 +1,15 @@
+export const sources = [
+ {
+ sourceId: 1,
+ sourceName: "BoxNovel",
+ sourceCover:
+ "https://boxnovel.com/wp-content/uploads/2018/04/BoxNovel-1.png",
+ sourceLanguage: "English",
+ },
+ {
+ sourceId: 2,
+ sourceName: "WuxiaWorld",
+ sourceCover: "https://www.wuxiaworld.com/Wu-Black-192.jpg",
+ sourceLanguage: "English",
+ },
+];