From 7819c7dcdb95c3b41aee3e85bea2435d26ee4b74 Mon Sep 17 00:00:00 2001 From: Rajarshee Chatterjee Date: Thu, 27 May 2021 10:37:43 +0530 Subject: [PATCH] Add selecting chapters logic --- assets/splash.png | Bin 36481 -> 28817 bytes package-lock.json | 99 ++++++++ package.json | 4 +- src/Components/Appbar.js | 3 +- src/Navigators/Main.js | 4 - src/Screens/Browse/Browse.js | 2 +- .../Chapter/components/ChapterAppbar.js | 10 +- src/Screens/Chapter/components/ReaderSheet.js | 45 ++-- src/Screens/Novel/Novel.js | 137 ++++++++++- src/Screens/Novel/components/ChapterItem.js | 39 +++- src/redux/novel/novel.actions.js | 212 ++++++++++++------ src/redux/source/source.actions.js | 15 +- src/redux/store.js | 4 +- 13 files changed, 447 insertions(+), 127 deletions(-) diff --git a/assets/splash.png b/assets/splash.png index 933cbe5631e2a11c26c1839fd8118090d3f0d557..2e43828cc039e17b6f900a889053ed1e383cf09a 100644 GIT binary patch literal 28817 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 J*?-RSe*nBSH~|0v literal 36481 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 { +export const Appbar = ({ title, onBackAction, style, children }) => { const theme = useSelector((state) => state.settingsReducer.theme); return ( @@ -24,6 +24,7 @@ export const Appbar = ({ title, onBackAction, style }) => { title={title} titleStyle={{ color: theme.textColorPrimary }} /> + {children} ); }; diff --git a/src/Navigators/Main.js b/src/Navigators/Main.js index 5526b835..14de9d68 100644 --- a/src/Navigators/Main.js +++ b/src/Navigators/Main.js @@ -45,10 +45,6 @@ const MainNavigator = () => { name="Novel" component={Novel} options={{ - headerTitle: "", - headerShown: true, - headerTransparent: true, - headerTintColor: "white", ...TransitionPresets.RevealFromBottomAndroid, }} /> diff --git a/src/Screens/Browse/Browse.js b/src/Screens/Browse/Browse.js index 8470707a..755a9a9a 100644 --- a/src/Screens/Browse/Browse.js +++ b/src/Screens/Browse/Browse.js @@ -81,7 +81,7 @@ const Browse = ({ navigation }) => { clearSearchbar={clearSearchbar} right="book-search" onPressRight={() => navigation.navigate("GlobalSearch")} - migrate="weather-cloudy-arrow-right" + migrate="swap-vertical-variant" onPressMigrate={() => navigation.navigate("Migration")} /> diff --git a/src/Screens/Chapter/components/ChapterAppbar.js b/src/Screens/Chapter/components/ChapterAppbar.js index bd7314d5..5896a9e9 100644 --- a/src/Screens/Chapter/components/ChapterAppbar.js +++ b/src/Screens/Chapter/components/ChapterAppbar.js @@ -40,18 +40,18 @@ const ChapterAppbar = ({ novelUrl, novelId, chapterName: prevChapter.chapterName, - novelName: novelName, + novelName, }); const navigateToNextChapter = () => navigation.replace("Chapter", { - chapterUrl: nextChapter.nextChapter, + chapterUrl: nextChapter.chapterUrl, sourceId, novelUrl, novelId, chapterId: nextChapter.chapterId, chapterName: nextChapter.chapterName, - novelName: novelName, + novelName, }); return ( @@ -64,9 +64,9 @@ const ChapterAppbar = ({ /> { + const ReaderSettingTitle = ({ title }) => ( + + {title} + + ); + return ( { - - Text Size - + { alignItems: "center", }} > - - Reader Theme - + { dispatch( @@ -118,14 +115,7 @@ const ReaderSheet = ({ theme, reader, dispatch, bottomSheetRef }) => { alignItems: "center", }} > - - Text Align - + dispatch( @@ -150,6 +140,8 @@ const ReaderSheet = ({ theme, reader, dispatch, bottomSheetRef }) => { backgroundColor: "#FFFFFF", marginHorizontal: 10, borderWidth: 0, + borderTopRightRadius: 4, + borderBottomRightRadius: 4, }} /> { backgroundColor: "#FFFFFF", marginHorizontal: 10, borderWidth: 0, + borderRadius: 4, }} /> { backgroundColor: "#FFFFFF", marginHorizontal: 10, borderWidth: 0, + borderTopLeftRadius: 4, + borderBottomLeftRadius: 4, }} /> @@ -241,7 +236,7 @@ const ReaderSheet = ({ theme, reader, dispatch, bottomSheetRef }) => { style={{ color: "#FFFFFF", fontWeight: "bold", - marginTop: 10, + marginVertical: 10, }} > Font Style diff --git a/src/Screens/Novel/Novel.js b/src/Screens/Novel/Novel.js index 47515231..01b2055f 100644 --- a/src/Screens/Novel/Novel.js +++ b/src/Screens/Novel/Novel.js @@ -1,14 +1,29 @@ import React, { useEffect, useRef, useState } from "react"; -import { StyleSheet, View, FlatList, RefreshControl } from "react-native"; +import { + StyleSheet, + View, + FlatList, + RefreshControl, + StatusBar, +} from "react-native"; -import { Provider, Portal } from "react-native-paper"; +import { + Provider, + Portal, + Appbar as MaterialAppbar, + IconButton, +} from "react-native-paper"; import { useDispatch } from "react-redux"; import { bookmarkChapterAction, + deleteAllChaptersAction, + downloadAllChaptersAction, getNovelAction, markChapterReadAction, + markChaptersRead, markChapterUnreadAction, + markPreviousChaptersReadAction, sortAndFilterChapters, updateNovelAction, } from "../../redux/novel/novel.actions"; @@ -25,6 +40,7 @@ import NovelInfoHeader from "./components/NovelHeader"; import ChaptersSettingsSheet from "./components/ChaptersSettingsSheet"; import TrackSheet from "./components/Tracker/TrackSheet"; import ChapterActionsSheet from "./components/ChapterActionsSheet"; +import { Appbar } from "../../Components/Appbar"; const Novel = ({ route, navigation }) => { const item = route.params; @@ -34,7 +50,7 @@ const Novel = ({ route, navigation }) => { const dispatch = useDispatch(); const { novel, chapters, loading, updating, downloading } = useNovel(); - const [selected, setSelected] = useState(); + const [selected, setSelected] = useState([]); let chaptersSettingsSheetRef = useRef(null); let trackerSheetRef = useRef(null); @@ -82,6 +98,7 @@ const Novel = ({ route, navigation }) => { downloading={downloading} selected={selected} novelName={novelName} + selected={selected} setSelected={setSelected} chapterActionsSheetRef={chapterActionsSheetRef} /> @@ -95,6 +112,116 @@ const Novel = ({ route, navigation }) => { { backgroundColor: theme.colorPrimaryDark }, ]} > + {selected.length > 0 ? ( + + { + setSelected([]); + }} + /> + + { + dispatch(bookmarkChapterAction(selected)); + setSelected([]); + }} + /> + + {selected.some((obj) => obj.read === 0) && ( + { + dispatch(markChaptersRead(selected)); + setSelected([]); + }} + /> + )} + {selected.some((obj) => obj.read === 1) && ( + { + dispatch(markChapterUnreadAction(selected)); + setSelected([]); + }} + /> + )} + {selected.length === 1 && ( + { + dispatch( + markPreviousChaptersReadAction( + selected[0].chapterId, + selected[0].novelId + ) + ); + setSelected([]); + }} + /> + )} + {selected.some((obj) => obj.downloaded === 1) && ( + { + dispatch(deleteAllChaptersAction(selected)); + setSelected([]); + }} + /> + )} + + {selected.some((obj) => obj.downloaded === 0) && ( + { + dispatch( + downloadAllChaptersAction( + novel.sourceId, + novel.novelUrl, + selected + ) + ); + setSelected([]); + }} + /> + )} + { + setSelected(chapters); + }} + /> + + ) : ( + navigation.goBack()} + style={{ + position: "absolute", + zIndex: 1, + top: StatusBar.currentHeight + 8, + left: 8, + }} + /> + )} item.chapterId.toString()} @@ -138,7 +265,7 @@ const Novel = ({ route, navigation }) => { novelName={novel.novelName} theme={theme} /> - { markChapterReadAction={markChapterReadAction} markChapterUnreadAction={markChapterUnreadAction} bookmarkChapterAction={bookmarkChapterAction} - /> + /> */} )} diff --git a/src/Screens/Novel/components/ChapterItem.js b/src/Screens/Novel/components/ChapterItem.js index a20a92bb..dd497dd6 100644 --- a/src/Screens/Novel/components/ChapterItem.js +++ b/src/Screens/Novel/components/ChapterItem.js @@ -1,6 +1,8 @@ import React, { useState } from "react"; import { View, Text, ActivityIndicator, StyleSheet } from "react-native"; + import { TouchableRipple, IconButton, Menu } from "react-native-paper"; +import * as Haptics from "expo-haptics"; import { deleteChapterAction, @@ -17,6 +19,7 @@ const ChapterItem = ({ navigation, downloading, position, + selected, setSelected, chapterActionsSheetRef, }) => { @@ -112,16 +115,44 @@ const ChapterItem = ({ } }; + const isSelected = (chapterId) => { + return selected.some((obj) => obj.chapterId === chapterId); + }; + return ( { + if (selected.length === 0) { + navigateToChapter(); + } else { + if (isSelected(chapter.chapterId)) { + setSelected((selected) => + selected.filter( + (item) => item.chapterId !== chapter.chapterId + ) + ); + } else { + setSelected((selected) => [...selected, chapter]); + } + } + }} onLongPress={() => { - setSelected(chapter); - chapterActionsSheetRef.current.show(); + if (isSelected(chapter.chapterId)) { + setSelected((selected) => + selected.filter( + (item) => item.chapterId !== chapter.chapterId + ) + ); + } else { + setSelected((selected) => [...selected, chapter]); + } + // chapterActionsSheetRef.current.show(); }} rippleColor={theme.rippleColor} > diff --git a/src/redux/novel/novel.actions.js b/src/redux/novel/novel.actions.js index 796250e0..d3fc9f6b 100644 --- a/src/redux/novel/novel.actions.js +++ b/src/redux/novel/novel.actions.js @@ -36,6 +36,7 @@ import { bookmarkChapter, markPreviuschaptersRead, markPreviousChaptersUnread, + getNextChapterFromDB, } from "../../Database/queries/ChapterQueries"; import { deleteNovelUpdates } from "../../Database/queries/UpdateQueries"; import { @@ -54,58 +55,66 @@ export const setNovel = (novel) => async (dispatch) => { export const getNovelAction = (followed, sourceId, novelUrl, novelId, sort, filter) => async (dispatch) => { - dispatch({ type: LOADING_NOVEL }); + try { + dispatch({ type: LOADING_NOVEL }); - if (followed === 1) { - /** - * If novel is followed directly get the chapters from db. - */ - const chapters = await getChapters(novelId, sort, filter); - - dispatch({ - type: GET_CHAPTERS, - payload: chapters, - }); - } else { - dispatch({ type: FETCHING_NOVEL }); - - /** - * Check if novel is cached. - */ - const novel = await getNovel(sourceId, novelUrl); - - if (novel) { + if (followed === 1) { /** - * Get chapters from db. + * If novel is followed directly get the chapters from db. */ - novel.chapters = await getChapters(novel.novelId, sort, filter); + const chapters = await getChapters(novelId, sort, filter); + dispatch({ - type: GET_NOVEL, - payload: novel, + type: GET_CHAPTERS, + payload: chapters, }); } else { - /** - * Fetch novel from source. - */ - const fetchedNovel = await fetchNovel(sourceId, novelUrl); + dispatch({ type: FETCHING_NOVEL }); /** - * Insert novel in db. - */ - const fetchedNovelId = await insertNovel(fetchedNovel); - await insertChapters(fetchedNovelId, fetchedNovel.chapters); - - /** - * Get novel from db. + * Check if novel is cached. */ const novel = await getNovel(sourceId, novelUrl); - novel.chapters = await getChapters(novel.novelId); - dispatch({ - type: GET_NOVEL, - payload: novel, - }); + if (novel) { + /** + * Get chapters from db. + */ + novel.chapters = await getChapters( + novel.novelId, + sort, + filter + ); + dispatch({ + type: GET_NOVEL, + payload: novel, + }); + } else { + /** + * Fetch novel from source. + */ + const fetchedNovel = await fetchNovel(sourceId, novelUrl); + + /** + * Insert novel in db. + */ + const fetchedNovelId = await insertNovel(fetchedNovel); + await insertChapters(fetchedNovelId, fetchedNovel.chapters); + + /** + * Get novel from db. + */ + const novel = await getNovel(sourceId, novelUrl); + novel.chapters = await getChapters(novel.novelId); + + dispatch({ + type: GET_NOVEL, + payload: novel, + }); + } } + } catch (error) { + showToast(error.message); } }; @@ -146,15 +155,19 @@ export const followNovelAction = (novel) => async (dispatch) => { showToast(!novel.followed ? "Added to library" : "Removed from library"); }; -export const bookmarkChapterAction = - (bookmark, chapterId) => async (dispatch) => { - await bookmarkChapter(bookmark, chapterId); +export const bookmarkChapterAction = (chapters) => async (dispatch) => { + chapters.map((chapter) => { + bookmarkChapter(chapter.bookmark, chapter.chapterId); dispatch({ type: BOOKMARK_CHAPTER, - payload: { bookmark, chapterId }, + payload: { + bookmark: chapter.bookmark, + chapterId: chapter.chapterId, + }, }); - }; + }); +}; export const markChapterReadAction = (chapterId, novelId) => async (dispatch) => { @@ -165,9 +178,11 @@ export const markChapterReadAction = payload: { chapterId }, }); + const nextChapter = await getNextChapterFromDB(novelId, chapterId); + dispatch({ type: SET_LAST_READ, - payload: { novelId, chapterId: chapterId + 1 }, + payload: { novelId, chapterId: nextChapter.chapterId }, }); /** @@ -192,8 +207,51 @@ export const markPreviousChaptersReadAction = type: MARK_PREVIOUS_CHAPTERS_READ, payload: chapterId, }); + + showToast("Marked previous chapters read"); }; +export const markChaptersRead = (chapters) => async (dispatch) => { + try { + chapters.map(async (chapter) => { + await markChapterRead(chapter.chapterId); + + dispatch({ + type: CHAPTER_READ, + payload: { chapterId: chapter.chapterId }, + }); + + const nextChapter = await getNextChapterFromDB( + chapter.novelId, + chapter.chapterId + ); + + dispatch({ + type: SET_LAST_READ, + payload: { + novelId: chapter.novelId, + chapterId: nextChapter.chapterId, + }, + }); + + /** + * Reset progress on marked read + */ + dispatch({ + type: SAVE_SCROLL_POSITION, + payload: { + position: 0, + percentage: 0, + chapterId: chapter.chapterId, + novelId: chapter.novelId, + }, + }); + }); + } catch (error) { + showToast(error.message); + } +}; + export const markPreviousChaptersUnreadAction = (chapterId, novelId) => async (dispatch) => { await markPreviousChaptersUnread(chapterId, novelId); @@ -204,12 +262,14 @@ export const markPreviousChaptersUnreadAction = }); }; -export const markChapterUnreadAction = (chapterId) => async (dispatch) => { - await markChapterUnread(chapterId); +export const markChapterUnreadAction = (chapters) => async (dispatch) => { + await chapters.map((chapter) => { + markChapterUnread(chapter.chapterId); - dispatch({ - type: CHAPTER_UNREAD, - payload: { chapterId }, + dispatch({ + type: CHAPTER_UNREAD, + payload: { chapterId: chapter.chapterId }, + }); }); }; @@ -233,30 +293,36 @@ export const downloadChapterAction = export const downloadAllChaptersAction = (extensionId, novelUrl, chapters) => async (dispatch) => { - await chapters.map((chapter, index) => { - setTimeout(async () => { - dispatch({ - type: CHAPTER_DOWNLOADING, - payload: chapter.chapterId, - }); + try { + await chapters.map((chapter, index) => { + setTimeout(async () => { + dispatch({ + type: CHAPTER_DOWNLOADING, + payload: chapter.chapterId, + }); - if (!chapter.downloaded) { - await downloadChapter( - extensionId, - novelUrl, - chapter.chapterUrl, - chapter.chapterId - ); - } + if (!chapter.downloaded) { + await downloadChapter( + extensionId, + novelUrl, + chapter.chapterUrl, + chapter.chapterId + ); + } - dispatch({ - type: CHAPTER_DOWNLOADED, - payload: chapter.chapterId, - }); - }, 1000 * index); - }); + dispatch({ + type: CHAPTER_DOWNLOADED, + payload: chapter.chapterId, + }); - showToast(`All chapters downloaded`); + if (index + 1 === chapters.length) { + showToast(`Download completed `); + } + }, 1000 * index); + }); + } catch (error) { + showToast(error.message); + } }; export const deleteChapterAction = @@ -281,7 +347,7 @@ export const deleteAllChaptersAction = (chapters) => async (dispatch) => { }); }); - showToast("Deleted all chapters"); + showToast("Chapters deleted"); }; export const updateNovelAction = diff --git a/src/redux/source/source.actions.js b/src/redux/source/source.actions.js index 2a315599..0f5961fa 100644 --- a/src/redux/source/source.actions.js +++ b/src/redux/source/source.actions.js @@ -1,13 +1,18 @@ import { GET_SOURCES, PIN_SOURCES, SEARCH_SOURCES } from "./source.types"; import { fetchSources } from "../../Services/Source/source"; +import { showToast } from "../../Hooks/showToast"; export const getSourcesAction = () => async (dispatch) => { - const res = await fetchSources(); + try { + const res = await fetchSources(); - dispatch({ - type: GET_SOURCES, - payload: res, - }); + dispatch({ + type: GET_SOURCES, + payload: res, + }); + } catch (error) { + showToast(error.message); + } }; export const searchSourcesAction = (searchText) => async (dispatch) => { diff --git a/src/redux/store.js b/src/redux/store.js index 3c2017b9..6ffcb53d 100644 --- a/src/redux/store.js +++ b/src/redux/store.js @@ -6,7 +6,6 @@ import thunk from "redux-thunk"; import settingsReducer from "./settings/settings.reducer"; import libraryReducer from "./library/library.reducer"; import sourceReducer from "./source/source.reducers"; -import chapterReducer from "./chapter/chapter.reducer"; import novelReducer from "./novel/novel.reducer"; import historyReducer from "./history/history.reducer"; import updatesReducer from "./updates/updates.reducer"; @@ -16,7 +15,7 @@ import preferenceReducer from "./preferences/preference.reducer"; const persistConfig = { key: "root", storage: AsyncStorage, - blacklist: ["novelReducer", "chapterReducer"], + blacklist: ["novelReducer"], }; const persistedReducer = persistReducer( @@ -27,7 +26,6 @@ const persistedReducer = persistReducer( sourceReducer, novelReducer, historyReducer, - chapterReducer, updatesReducer, trackerReducer, preferenceReducer,