diff --git a/src/Components/Searchbar.js b/src/Components/Searchbar.js index 75985c60..605adadc 100644 --- a/src/Components/Searchbar.js +++ b/src/Components/Searchbar.js @@ -25,9 +25,9 @@ export const Searchbar = ({ const displayMenuIcon = () => { const icons = { - 0: "view-grid", + 0: "view-module", 1: "view-list", - 2: "view-grid", + 2: "view-module", }; return icons[displayMode]; @@ -92,7 +92,7 @@ export const Searchbar = ({ )} {right && ( { /> + ); diff --git a/src/Screens/Browse/Browse.js b/src/Screens/Browse/Browse.js index 89a3654c..3c675c1d 100644 --- a/src/Screens/Browse/Browse.js +++ b/src/Screens/Browse/Browse.js @@ -20,7 +20,7 @@ import SourceCard from "./components/SourceCard"; import { showToast } from "../../Hooks/showToast"; import { Searchbar } from "../../Components/Searchbar"; -const Browse = () => { +const Browse = ({ navigation }) => { const [refreshing, setRefreshing] = useState(false); const [searchText, setSearchText] = useState(""); // const [globalSearch, setGlobalSearch] = useState(false); @@ -79,6 +79,8 @@ const Browse = () => { searchText={searchText} onChangeText={onChangeText} clearSearchbar={clearSearchbar} + right="book-search" + onPressRight={() => navigation.navigate("GlobalSearch")} /> { + const theme = useTheme(); + + const [loading, setLoading] = useState(false); + const [searchText, setSearchText] = useState(""); + const [searchResults, setSearchResults] = useState(""); + const { sources, pinned } = useSelector((state) => state.sourceReducer); + + const library = useLibrary(); + + const pinnedSources = sources.filter( + (source) => pinned.indexOf(source.sourceId) !== -1 + ); + + const clearSearchbar = () => { + setSearchText(""); + }; + + const onChangeText = (text) => setSearchText(text); + + const onSubmitEditing = () => { + setSearchResults(""); + + const getSearchUrl = (sourceId) => { + if (sourceId === 1) { + return `https://lnreader-extensions.vercel.app/api/1/search/?s=${searchText}&?o=rating`; + } else { + return `https://lnreader-extensions.vercel.app/api/${sourceId}/search/?s=${searchText}`; + } + }; + + pinnedSources.map((source, index) => + setTimeout(() => { + setLoading(true); + fetch(getSearchUrl(source.sourceId)) + .then((response) => response.json()) + .then((json) => { + setSearchResults((searchResults) => [ + ...searchResults, + { + sourceId: source.sourceId, + sourceName: source.sourceName, + sourceLanguage: source.sourceLanguage, + novels: json, + }, + ]); + setLoading(false); + }); + }, 3000 * index) + ); + }; + + const renderItem = ({ item }) => ( + <> + + + {item.sourceName} + + + {item.sourceLanguage} + + + + + ); + + return ( + + navigation.goBack()} + searchText={searchText} + onChangeText={onChangeText} + onSubmitEditing={onSubmitEditing} + clearSearchbar={clearSearchbar} + /> + + item.sourceId.toString()} + renderItem={renderItem} + extraData={pinned} + ListEmptyComponent={ + !loading && ( + + ) + } + ListFooterComponent={ + loading && ( + + + + ) + } + /> + + ); +}; + +export default GlobalSearch; + +const styles = StyleSheet.create({ + container: { flex: 1 }, +}); diff --git a/src/Screens/Browse/components/GlobalSearchNovelCover.js b/src/Screens/Browse/components/GlobalSearchNovelCover.js new file mode 100644 index 00000000..81594490 --- /dev/null +++ b/src/Screens/Browse/components/GlobalSearchNovelCover.js @@ -0,0 +1,71 @@ +import React from "react"; +import { StyleSheet, View, Text, ImageBackground } from "react-native"; +import { TouchableRipple } from "react-native-paper"; + +import { useSettings, useTheme } from "../../../Hooks/reduxHooks"; + +const GlobalSearchNovelCover = ({ item, onPress, libraryStatus }) => { + const theme = useTheme(); + + const comfortableTitle = () => ( + + {item.novelName} + + ); + + return ( + + + <> + + {comfortableTitle()} + + + + ); +}; + +export default GlobalSearchNovelCover; + +const styles = StyleSheet.create({ + titleContainer: { + flex: 1, + justifyContent: "flex-end", + borderRadius: 4, + }, + title: { + fontFamily: "pt-sans-bold", + fontSize: 14, + padding: 8, + }, + opac: { + paddingHorizontal: 5, + paddingVertical: 4, + borderRadius: 4, + }, +}); diff --git a/src/Screens/Browse/components/GlobalSearchNovelList.js b/src/Screens/Browse/components/GlobalSearchNovelList.js new file mode 100644 index 00000000..b8be1aa9 --- /dev/null +++ b/src/Screens/Browse/components/GlobalSearchNovelList.js @@ -0,0 +1,55 @@ +import React from "react"; +import { StyleSheet, FlatList, Text } from "react-native"; +import GlobalSearchNovelCover from "./GlobalSearchNovelCover"; + +const GlobalSearchNovelList = ({ data, theme, library, navigation }) => { + const checkIFInLibrary = (sourceId, novelUrl) => { + return library.some( + (obj) => obj.novelUrl === novelUrl && obj.sourceId === sourceId + ); + }; + + const renderItem = ({ item }) => ( + + navigation.navigate("Novel", { + ...item, + sourceId: item.extensionId, + }) + } + libraryStatus={checkIFInLibrary(item.extensionId, item.novelUrl)} + /> + ); + + return ( + item.novelUrl} + renderItem={renderItem} + ListEmptyComponent={ + + No results found + + } + /> + ); +}; + +export default GlobalSearchNovelList; + +const styles = StyleSheet.create({ + flatListCont: { + flexGrow: 1, + paddingVertical: 8, + paddingHorizontal: 4, + }, +}); diff --git a/src/Screens/Novel/Novel.js b/src/Screens/Novel/Novel.js index 2d38e51a..bb7e2211 100644 --- a/src/Screens/Novel/Novel.js +++ b/src/Screens/Novel/Novel.js @@ -50,8 +50,10 @@ const Novel = ({ novelId || (!loading && novel.novelId) ); - let lastRead = useContinueReading(chapters, novel.novelId); - console.log(lastRead); + let lastRead = useContinueReading( + chapters, + novelId || (!loading && novel.novelId) + ); useEffect(() => { getNovelAction(followed, sourceId, novelUrl, novelId, sort, filter);