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", + }, +];