From 3cb41c8bfb3bcb26f9b7e2dded73296d08efa0a6 Mon Sep 17 00:00:00 2001 From: Rajarshee Chatterjee Date: Wed, 31 Mar 2021 09:35:21 +0530 Subject: [PATCH] Fix history table --- src/database/queries/HistoryQueries.js | 8 ++------ src/database/queries/LibraryQueries.js | 1 - src/database/tables/ChapterTable.js | 5 +++-- src/database/tables/HistoryTable.js | 2 +- src/redux/library/library.reducer.js | 13 ++++++++++++ src/redux/novel/novel.actions.js | 22 +++++++++++++++++---- src/redux/novel/novel.types.js | 3 +++ src/screens/History/History.js | 2 +- src/screens/Library/Library.js | 11 ++++------- src/screens/Novel/components/NovelHeader.js | 4 +--- 10 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/database/queries/HistoryQueries.js b/src/database/queries/HistoryQueries.js index 86143e4a..4ac031aa 100644 --- a/src/database/queries/HistoryQueries.js +++ b/src/database/queries/HistoryQueries.js @@ -17,7 +17,6 @@ export const getHistory = async () => { getHistoryQuery, null, (txObj, { rows: { _array } }) => { - // console.log(_array); resolve(_array); }, (txObj, error) => console.log("Error ", error) @@ -31,14 +30,11 @@ export const getHistory = async () => { export const insertHistory = async (novelId, chapterId) => { db.transaction((tx) => { tx.executeSql( - "INSERT OR REPLACE INTO history (historyNovelId, historyChapterId) VALUEs (?, ?)", + "INSERT OR REPLACE INTO history (historyNovelId, historyChapterId) VALUES (?, ?)", [novelId, chapterId], - (txObj, { rows: { _array } }) => {}, + (txObj, res) => {}, (txObj, error) => console.log("Error ", error) ); - tx.executeSql("UPDATE chapters SET `read` = 1 WHERE chapterId = ?", [ - chapterId, - ]); tx.executeSql("UPDATE novels SET unread = 0 WHERE novelId = ?", [ novelId, ]); diff --git a/src/database/queries/LibraryQueries.js b/src/database/queries/LibraryQueries.js index 5494781f..158b8342 100644 --- a/src/database/queries/LibraryQueries.js +++ b/src/database/queries/LibraryQueries.js @@ -2,7 +2,6 @@ import * as SQLite from "expo-sqlite"; const db = SQLite.openDatabase("lnreader.db"); const getLibraryQuery = ` - SELECT novels.*, C.chaptersUnread, D.chaptersDownloaded FROM novels LEFT JOIN ( diff --git a/src/database/tables/ChapterTable.js b/src/database/tables/ChapterTable.js index 51ad26df..a3cd484b 100644 --- a/src/database/tables/ChapterTable.js +++ b/src/database/tables/ChapterTable.js @@ -8,8 +8,9 @@ export const createChapterTableQuery = ` bookmark BOOLEAN NOT NULL DEFAULT 0, \`read\` INTEGER NOT NULL DEFAULT 0, downloaded INTEGER NOT NULL DEFAULT 0, - FOREIGN KEY (novelId) REFERENCES novels(novelId), - UNIQUE(novelId, chapterUrl) + UNIQUE(novelId, chapterUrl), + FOREIGN KEY (novelId) REFERENCES novels(novelId) + ON DELETE CASCADE )`; export const createNovelIdIndexQuery = `CREATE INDEX IF NOT EXISTS chapterNovelIdIndex ON chapters(novelId)`; diff --git a/src/database/tables/HistoryTable.js b/src/database/tables/HistoryTable.js index 07810aad..e6311a24 100644 --- a/src/database/tables/HistoryTable.js +++ b/src/database/tables/HistoryTable.js @@ -2,7 +2,7 @@ export const createHistoryTableQuery = ` CREATE TABLE IF NOT EXISTS history( historyId INTEGER PRIMARY KEY AUTOINCREMENT, historyChapterId INTEGER NOT NULL, - historyNovelId INTEGER NOT NULL, + historyNovelId INTEGER NOT NULL UNIQUE, historyTimeRead DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (historyChapterId) REFERENCES chapters(chapterId) ON DELETE CASCADE diff --git a/src/redux/library/library.reducer.js b/src/redux/library/library.reducer.js index 4d19a18b..05a2ed0a 100644 --- a/src/redux/library/library.reducer.js +++ b/src/redux/library/library.reducer.js @@ -1,3 +1,4 @@ +import { FOLLOW_NOVEL, UNFOLLOW_NOVEL } from "../novel/novel.types"; import { GET_LIBRARY_NOVELS } from "./library.types"; const initialState = { @@ -11,6 +12,18 @@ const libraryReducer = (state = initialState, action) => { switch (type) { case GET_LIBRARY_NOVELS: return { novels: payload, loading: false }; + case FOLLOW_NOVEL: + return { + ...state, + novels: [...state.novels, { ...payload, followed: 1 }], + }; + case UNFOLLOW_NOVEL: + return { + ...state, + novels: state.novels.filter( + (novel) => novel.novelId !== payload + ), + }; default: return state; } diff --git a/src/redux/novel/novel.actions.js b/src/redux/novel/novel.actions.js index 569d4ea7..c117ded4 100644 --- a/src/redux/novel/novel.actions.js +++ b/src/redux/novel/novel.actions.js @@ -15,6 +15,8 @@ import { CHAPTER_DELETED, UPDATE_NOVEL, UPDATE_LAST_READ, + FOLLOW_NOVEL, + UNFOLLOW_NOVEL, } from "./novel.types"; import { updateNovel } from "../../services/updates"; @@ -100,16 +102,28 @@ export const sortAndFilterChapters = (novelUrl, filter, sort) => async ( // }); }; -export const followNovelAction = (followed, novelId) => async (dispatch) => { - await followNovel(followed, novelId); +export const followNovelAction = (novel) => async (dispatch) => { + await followNovel(novel.followed, novel.novelId); + + if (!novel.followed) { + dispatch({ + type: FOLLOW_NOVEL, + payload: novel, + }); + } else { + dispatch({ + type: UNFOLLOW_NOVEL, + payload: novel.novelId, + }); + } dispatch({ type: UPDATE_IN_LIBRARY, - payload: !followed, + payload: !novel.followed, }); ToastAndroid.show( - !followed ? "Added to library" : "Removed from library", + !novel.followed ? "Added to library" : "Removed from library", ToastAndroid.SHORT ); }; diff --git a/src/redux/novel/novel.types.js b/src/redux/novel/novel.types.js index facd150d..e62266fb 100644 --- a/src/redux/novel/novel.types.js +++ b/src/redux/novel/novel.types.js @@ -14,3 +14,6 @@ export const CHAPTER_DOWNLOADING = "CHAPTER_DOWNLOADING"; export const CHAPTER_READ = "CHAPTER_READ"; export const CHAPTER_LOADING = "CHAPTER_LOADING"; export const GET_CHAPTER = "GET_CHAPTER"; + +export const FOLLOW_NOVEL = "FOLLOW_NOVEL"; +export const UNFOLLOW_NOVEL = "UNFOLLOW_NOVEL"; diff --git a/src/screens/History/History.js b/src/screens/History/History.js index c7fb7402..ab81626f 100644 --- a/src/screens/History/History.js +++ b/src/screens/History/History.js @@ -25,7 +25,7 @@ const History = ({ useFocusEffect( useCallback(() => { getHistoryAction(); - }, []) + }, [getHistoryAction]) ); const renderHistoryCard = ({ item }) => ( diff --git a/src/screens/Library/Library.js b/src/screens/Library/Library.js index b2aa316a..50e55ad3 100644 --- a/src/screens/Library/Library.js +++ b/src/screens/Library/Library.js @@ -1,4 +1,4 @@ -import React, { useState, useCallback } from "react"; +import React, { useState, useCallback, useEffect } from "react"; import { StyleSheet, Text, @@ -35,12 +35,9 @@ const LibraryScreen = ({ const [searchText, setSearchText] = useState(""); - useFocusEffect( - useCallback(() => { - setSearchText(""); - getLibraryAction(); - }, []) - ); + useEffect(() => { + getLibraryAction(); + }, [getLibraryAction]); /** * TODO: fix refreshing diff --git a/src/screens/Novel/components/NovelHeader.js b/src/screens/Novel/components/NovelHeader.js index 2dabb406..376a188d 100644 --- a/src/screens/Novel/components/NovelHeader.js +++ b/src/screens/Novel/components/NovelHeader.js @@ -128,9 +128,7 @@ const NovelInfoHeader = ({ color={theme.colorAccentDark} /> )} - onPress={() => - followNovelAction(novel.followed, novel.novelId) - } + onPress={() => followNovelAction(novel)} style={[ { backgroundColor: theme.colorPrimaryDark }, styles.toggleFavourite,