From 67096eb1ff9b9b9aebc2ca83cc44a059ace94147 Mon Sep 17 00:00:00 2001 From: Rajarshee Chatterjee Date: Fri, 14 May 2021 18:30:15 +0530 Subject: [PATCH] Add library sort/filter sheet and notification icon --- app.json | 6 +- assets/notification.png | Bin 0 -> 2113 bytes assets/splash.png | Bin 28817 -> 36481 bytes src/Components/List.js | 13 +- src/Database/queries/LibraryQueries.js | 10 +- src/Hooks/reduxHooks.js | 7 + src/Screens/Library/Library.js | 49 +++- .../Library/components/LibraryFilterSheet.js | 254 ++++++++++++++++++ src/Screens/Novel/Novel.js | 2 +- src/redux/library/library.actions.js | 24 +- src/redux/library/library.reducer.js | 8 + src/redux/library/library.types.js | 2 + src/redux/novel/novel.actions.js | 4 +- 13 files changed, 352 insertions(+), 27 deletions(-) create mode 100644 assets/notification.png diff --git a/app.json b/app.json index 3f5c793f..43ed9f97 100644 --- a/app.json +++ b/app.json @@ -9,12 +9,16 @@ "splash": { "image": "./assets/splash.png", "resizeMode": "cover", - "backgroundColor": "#000000" + "backgroundColor": "#222831" }, "updates": { "fallbackToCacheTimeout": 0, "enabled": false }, + "notification": { + "icon": "./assets/notification.png", + "color": "#00adb5" + }, "assetBundlePatterns": ["**/*"], "ios": { "supportsTablet": true diff --git a/assets/notification.png b/assets/notification.png new file mode 100644 index 0000000000000000000000000000000000000000..b9cbe0c50fa606f6ff658a5cbb103eb5c1f4a114 GIT binary patch literal 2113 zcmV-H2)_4;P)oM0JW zv5cReCjdO&8CNU~9lE zJOumzI65M3oCy$}05WrV;F-XK5pmxnn`Wl(|1fX}@bdcZqrj(uc@goyN!~Z?***ZC z3mgx;9rzJ&WJLUNl8rO-OTgyXPzXA3Fu84@o`WzrL z4=(^yMGc${92610Yg(%_1HL^oUkH33*t9_W7T7N$e%5FA0`U1(24(@@1pWm)S)r;L zc`PCfQt#ClfSYU%`~+C3it+S_*rCr(LnveooC2%{Y*8T0hJm>&BCL~Ms~3RE!n(j| zz)OJp{XHV~8MjLnvEZ$NPXWu-^XCJr02=`-x889Pum^Bs-%RuZkeP1$ic*um0IG+D z=thEBxawK6v?}my;6-()Ek}Sg+7A>pmDvvgm-KCZeF3ZhtO=|IyasqfMN<&xG;)}k zD*`XBTKNF*R=~dvE_=d%fxiI;*3nraVYdW~$eE(3Op z2oGSfKOfk+J_1%Y2ZLn9?aI58)gnt68oiisX)=}sd0g#yucV7jp59|pjp-P+n<#)gW;2QaF zBqKs9jLYIHtB3{Vnh%^>Sx|ZI>07YFHdzRuqW&)6Ex;#$rvaw>-^I}@-8dqy>YMAT z3G3xx;B5onllxyNHFJ-tRp*d;*(XDT0PL`vl=m^>s?DA1e?%DdW&=B_8;rEcnJEQr ze9}*?Z}yUga^6DyjztUTu{Hpn2l#G9!{FH$u8W8Vdr_zksAT%0yCdS^R%CpsTz+F~ zgPVYhhgpiu)I+@&cxN5XS6S>v`{|`l((#|bbEGIDcP2-cd?s;d>CJR=Tb|kQt-yncC{5;rn=buf;m_NC3q}Gx0HC zV_=&Wd|#wyO98$8ef7N4*FrB-qOck8THsBKiJK(Nzc>DRrTX ztjsh^hn8tn&Rqsc|1~=zq~GK<(Edhdn%4Dz_t$|IM8sJ|A1QKV0XVsQlU!Co?y8zG z!Zt_E-1QCJ>hPbb(bEDK?1{iHfV0N+n$8SVYVD$0XC0{pZLg5W_6D_F9`6PmTSe&b z^V#CQ>9_k@@Y?~q*7Ig*z92HwW~ax}w&Hphp*~H_;C2Djcnzxo+7!s18#--?qj} z>7yOExgxBLTDV?ld1ygfw8~>s13she{$Ur#y8ulBKwJF5R-OpVsMz6>(AJeZ^5b=hw=&_*47vjk+7MyGjw4b#YQe?4Fr| zvT!X@o0*4KmHg>#gaJ{pEa0IAZ4yw6WuV4Lz0VcZ^1TmIh3vFWV`{qJ+YvafHuE5J zi}#v6qpxK8-B}TFOJ=H2dKwFO_X0faTkBCHrF_?@X@~Vbs*4AoGHaPBjrJ}|_-9o~ z>2$`mFW3*1TQhX1g_@bi)chgNPTZgGT zporMHrYya^TCUS{$Wb!&K3*L<(Wx{SR2HtOjJb~hlvaQDFw)XVZ|n_q`6S)16Q0)o z$L%gX?pDI-%VuTKNh7=^X_r;fDK69H@eMX+w?Q?dV3>zM}bh8q??plWM!rS z5rl(Lr+kl5BCYvaO%}Smkf^oEMsy9}=dFm@f&Hf=Z!b)(Ug_Y7Fe5`(W;WN8_7yWb zEHHgk^cfK`b(7I664jhy#PBYq1b1^6pWU!#3MrwKTJ&GKmVIS?9 r3m(@D%mm;k0L(-br}K_wJ_G*;4o%8W>NiS700000NkvXXu0mjf%Eb#8 literal 0 HcmV?d00001 diff --git a/assets/splash.png b/assets/splash.png index 2e43828cc039e17b6f900a889053ed1e383cf09a..933cbe5631e2a11c26c1839fd8118090d3f0d557 100644 GIT binary patch literal 36481 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 J*?-RSe*nBSH~|0v diff --git a/src/Components/List.js b/src/Components/List.js index 5bc5f00f..b57e7eee 100644 --- a/src/Components/List.js +++ b/src/Components/List.js @@ -14,10 +14,19 @@ const ListSubHeader = ({ children, theme }) => ( ); -const ListItem = ({ title, description, icon, onPress, theme, right }) => ( +const ListItem = ({ + title, + description, + icon, + onPress, + theme, + right, + titleStyle, +}) => ( ` SELECT novels.*, C.chaptersUnread, D.chaptersDownloaded FROM novels LEFT JOIN ( @@ -18,15 +18,15 @@ const getLibraryQuery = ` GROUP BY chapters.novelId ) AS D ON novels.novelId = D.novelId - WHERE novels.followed = 1 - GROUP BY novels.novelId + WHERE novels.followed = 1 ${filter ? "AND " + filter : ""} + ${sort ? "ORDER BY " + sort : ""} `; -export const getLibrary = () => { +export const getLibrary = (sort, filter) => { return new Promise((resolve, reject) => db.transaction((tx) => { tx.executeSql( - getLibraryQuery, + getLibraryQuery(sort, filter), null, (txObj, { rows: { _array } }) => { // console.log(_array); diff --git a/src/Hooks/reduxHooks.js b/src/Hooks/reduxHooks.js index 31b6ab32..25866dab 100644 --- a/src/Hooks/reduxHooks.js +++ b/src/Hooks/reduxHooks.js @@ -95,6 +95,12 @@ const useTrackingStatus = () => { return tracker; }; +const useLibraryFilters = () => { + const filters = useSelector((state) => state.libraryReducer.filters); + + return filters; +}; + export { useTheme, useReaderSettings, @@ -106,4 +112,5 @@ export { useNovel, useChapter, useSavedSettings, + useLibraryFilters, }; diff --git a/src/Screens/Library/Library.js b/src/Screens/Library/Library.js index dbe7a262..2bfbd03d 100644 --- a/src/Screens/Library/Library.js +++ b/src/Screens/Library/Library.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from "react"; +import React, { useState, useCallback, useRef } from "react"; import { StyleSheet, Text, @@ -21,12 +21,22 @@ import { import { updateLibraryAction } from "../../redux/updates/updates.actions"; import { useTheme } from "../../Hooks/reduxHooks"; import { setNovel } from "../../redux/novel/novel.actions"; +import { Portal } from "react-native-paper"; +import LibraryFilterSheet from "./components/LibraryFilterSheet"; const LibraryScreen = ({ navigation }) => { const theme = useTheme(); const dispatch = useDispatch(); - const { loading, novels } = useSelector((state) => state.libraryReducer); + const libraryFilterSheetRef = useRef(null); + + const { + loading, + novels, + filters: { sort, filter }, + } = useSelector((state) => state.libraryReducer); + + console.log("1.", sort, filter); const [refreshing, setRefreshing] = useState(false); const [searchText, setSearchText] = useState(""); @@ -34,7 +44,7 @@ const LibraryScreen = ({ navigation }) => { useFocusEffect( useCallback(() => { setSearchText(""); - dispatch(getLibraryAction()); + dispatch(getLibraryAction(sort, filter)); }, [getLibraryAction]) ); @@ -45,13 +55,13 @@ const LibraryScreen = ({ navigation }) => { }; const clearSearchbar = () => { - dispatch(getLibraryAction()); + dispatch(getLibraryAction(sort, filter)); setSearchText(""); }; const onChangeText = (text) => { setSearchText(text); - dispatch(searchLibraryAction(text)); + dispatch(searchLibraryAction(text, sort, filter)); }; const renderItem = ({ item }) => ( @@ -73,6 +83,10 @@ const LibraryScreen = ({ navigation }) => { /> ); + // if (!loading) { + // console.log(novels); + // } + const listEmptyComponent = () => searchText !== "" ? ( @@ -99,17 +113,30 @@ const LibraryScreen = ({ navigation }) => { clearSearchbar={clearSearchbar} onChangeText={onChangeText} left="magnify" + right="dots-vertical" + onPressRight={() => libraryFilterSheetRef.current.show()} theme={theme} /> {loading ? ( ) : ( - + <> + + + + + )} diff --git a/src/Screens/Library/components/LibraryFilterSheet.js b/src/Screens/Library/components/LibraryFilterSheet.js index e69de29b..8691e33a 100644 --- a/src/Screens/Library/components/LibraryFilterSheet.js +++ b/src/Screens/Library/components/LibraryFilterSheet.js @@ -0,0 +1,254 @@ +import React, { useState } from "react"; +import { StyleSheet, View, Text, Animated } from "react-native"; + +import { List, RadioButton, Checkbox } from "react-native-paper"; + +import Bottomsheet from "rn-sliding-up-panel"; +import BottomSheetHandle from "../../../Components/BottomSheetHandle"; +import { ListItem } from "../../../Components/List"; +import { filterLibrary } from "../../../redux/library/library.actions"; + +const LibraryFilterSheet = ({ + bottomSheetRef, + dispatch, + sort, + filter, + theme, +}) => { + const [animatedValue] = useState(new Animated.Value(0)); + + return ( + + + + + + SORT + + + sort === "novels.novelId ASC" + ? dispatch( + filterLibrary( + "novels.novelId DESC", + filter + ) + ) + : dispatch( + filterLibrary( + "novels.novelId ASC", + filter + ) + ) + } + /> + + sort === "novels.novelName ASC" + ? dispatch( + filterLibrary( + "novels.novelName DESC", + filter + ) + ) + : dispatch( + filterLibrary( + "novels.novelName ASC", + filter + ) + ) + } + /> + + sort === "novels.unread ASC" + ? dispatch( + filterLibrary( + "novels.unread DESC", + filter + ) + ) + : dispatch( + filterLibrary("novels.unread ASC", filter) + ) + } + /> + + sort === "chaptersDownloaded ASC" + ? dispatch( + filterLibrary( + "chaptersDownloaded DESC", + filter + ) + ) + : dispatch( + filterLibrary( + "chaptersDownloaded ASC", + filter + ) + ) + } + /> + + sort === "chaptersUnread ASC" + ? dispatch( + filterLibrary( + "chaptersUnread DESC", + filter + ) + ) + : dispatch( + filterLibrary( + "chaptersUnread ASC", + filter + ) + ) + } + /> + + + + Filter + + 0" + ? "checked" + : "unchecked" + } + onPress={() => + filter === "chaptersDownloaded > 0" + ? dispatch(filterLibrary(sort, "")) + : dispatch( + filterLibrary( + sort, + "chaptersDownloaded > 0" + ) + ) + } + /> + + filter === "unread = 1" + ? dispatch(filterLibrary(sort, "")) + : dispatch(filterLibrary(sort, "unread = 1")) + } + /> + + filter === "chaptersUnread IS NULL" + ? dispatch(filterLibrary(sort, "")) + : dispatch( + filterLibrary( + sort, + "chaptersUnread IS NULL" + ) + ) + } + /> + + + + ); +}; + +export default LibraryFilterSheet; + +const styles = StyleSheet.create({ + contentContainer: { + flex: 1, + borderTopRightRadius: 8, + borderTopLeftRadius: 8, + }, +}); diff --git a/src/Screens/Novel/Novel.js b/src/Screens/Novel/Novel.js index 3e4dabc1..3353bd9c 100644 --- a/src/Screens/Novel/Novel.js +++ b/src/Screens/Novel/Novel.js @@ -56,7 +56,7 @@ const Novel = ({ route, navigation }) => { }, [getNovelAction]); const onRefresh = () => { - dispatch(updateNovelAction(sourceId, novelUrl, novelId)); + dispatch(updateNovelAction(sourceId, novelUrl, novelId, sort, filter)); showToast(`Updated ${novelName}`); }; diff --git a/src/redux/library/library.actions.js b/src/redux/library/library.actions.js index f5d25773..f96c24c2 100644 --- a/src/redux/library/library.actions.js +++ b/src/redux/library/library.actions.js @@ -2,6 +2,7 @@ import { GET_LIBRARY_NOVELS, GET_LIBRARY_SEARCH_RESULTS, SET_LIBRARY_LOADING, + SORT_FILTER_LIBRARY, } from "./library.types"; import { getLibrary, @@ -9,8 +10,9 @@ import { } from "../../Database/queries/LibraryQueries"; import { restoreBackup } from "../../Services/backup"; -export const getLibraryAction = () => async (dispatch) => { - const res = await getLibrary(); +export const getLibraryAction = (sort, filter) => async (dispatch) => { + // console.log(sort, filter); + const res = await getLibrary(sort, filter); dispatch({ type: GET_LIBRARY_NOVELS, @@ -18,11 +20,23 @@ export const getLibraryAction = () => async (dispatch) => { }); }; -export const searchLibraryAction = (searchText) => async (dispatch) => { - const res = await searchLibrary(searchText); +export const searchLibraryAction = + (searchText, sort, filter) => async (dispatch) => { + const res = await searchLibrary(searchText, sort, filter); + + dispatch({ + type: GET_LIBRARY_SEARCH_RESULTS, + payload: res, + }); + }; + +export const filterLibrary = (sort, filter) => async (dispatch) => { + dispatch({ type: SORT_FILTER_LIBRARY, payload: { sort, filter } }); + + const res = await getLibrary(sort, filter); dispatch({ - type: GET_LIBRARY_SEARCH_RESULTS, + type: GET_LIBRARY_NOVELS, payload: res, }); }; diff --git a/src/redux/library/library.reducer.js b/src/redux/library/library.reducer.js index 683612ed..411b9867 100644 --- a/src/redux/library/library.reducer.js +++ b/src/redux/library/library.reducer.js @@ -2,11 +2,13 @@ import { GET_LIBRARY_NOVELS, GET_LIBRARY_SEARCH_RESULTS, SET_LIBRARY_LOADING, + SORT_FILTER_LIBRARY, } from "./library.types"; const initialState = { novels: [], searchResults: [], + filters: { sort: "novels.novelId ASC", filter: "" }, loading: true, }; @@ -20,6 +22,12 @@ const libraryReducer = (state = initialState, action) => { return { ...state, novels: payload, loading: false }; case GET_LIBRARY_SEARCH_RESULTS: return { ...state, novels: payload, loading: false }; + case SORT_FILTER_LIBRARY: + console.log("2.", payload.sort, payload.filter); + return { + ...state, + filters: { sort: payload.sort, filter: payload.filter }, + }; default: return state; } diff --git a/src/redux/library/library.types.js b/src/redux/library/library.types.js index 78045c06..8819717f 100644 --- a/src/redux/library/library.types.js +++ b/src/redux/library/library.types.js @@ -1,3 +1,5 @@ export const GET_LIBRARY_NOVELS = "GET_LIBRARY_NOVELS"; export const GET_LIBRARY_SEARCH_RESULTS = "GET_LIBRARY_SEARCH_RESULTS"; export const SET_LIBRARY_LOADING = "SET_LIBRARY_LOADING"; + +export const SORT_FILTER_LIBRARY = "SORT_FILTER_LIBRARY"; diff --git a/src/redux/novel/novel.actions.js b/src/redux/novel/novel.actions.js index 0f528a31..011d5640 100644 --- a/src/redux/novel/novel.actions.js +++ b/src/redux/novel/novel.actions.js @@ -257,13 +257,13 @@ export const deleteAllChaptersAction = (chapters) => async (dispatch) => { }; export const updateNovelAction = - (sourceId, novelUrl, novelId) => async (dispatch) => { + (sourceId, novelUrl, novelId, sort, filter) => async (dispatch) => { dispatch({ type: FETCHING_NOVEL }); await updateNovel(sourceId, novelUrl, novelId); let novel = await getNovel(sourceId, novelUrl); - let chapters = await getChapters(novel.novelId); + let chapters = await getChapters(novel.novelId, sort, filter); dispatch({ type: UPDATE_NOVEL,