From e5a1753e52cc4a6189941dcae8d793e773f9bd32 Mon Sep 17 00:00:00 2001 From: nyagami Date: Sat, 3 Feb 2024 10:19:09 +0700 Subject: [PATCH] Fix tabiew (#939) * fix: tabview look * fix: error when library is not fetched fully * fix: legacy backup * fix: handle error for plugin methods --- src/database/queries/ChapterQueries.ts | 3 +- src/database/queries/NovelQueries.ts | 56 +++++++------ .../BrowseSourceScreen/useBrowseSource.ts | 22 +++-- .../browse/migration/MigrationNovelList.tsx | 4 +- src/screens/library/LibraryScreen.tsx | 81 ++++++++++--------- src/screens/reader/ReaderScreen.tsx | 20 +++-- src/services/backup/legacy/index.ts | 18 ++--- src/services/migrate/migrateNovel.ts | 4 +- src/services/plugin/fetch.ts | 18 ++++- 9 files changed, 130 insertions(+), 96 deletions(-) diff --git a/src/database/queries/ChapterQueries.ts b/src/database/queries/ChapterQueries.ts index 5830c3fa..9851763f 100644 --- a/src/database/queries/ChapterQueries.ts +++ b/src/database/queries/ChapterQueries.ts @@ -16,7 +16,7 @@ import { getString } from '@strings/translations'; const db = SQLite.openDatabase('lnreader.db'); const insertChapterQuery = ` -INSERT INTO Chapter ( +INSERT OR IGNORE INTO Chapter ( url, name, releaseTime, novelId, chapterNumber ) Values @@ -42,7 +42,6 @@ export const insertChapters = async ( chapter.chapterNumber || null, ], noop, - txnErrorCallback, ); }); }); diff --git a/src/database/queries/NovelQueries.ts b/src/database/queries/NovelQueries.ts index 35ebc853..258af0f3 100644 --- a/src/database/queries/NovelQueries.ts +++ b/src/database/queries/NovelQueries.ts @@ -4,7 +4,7 @@ const db = SQLite.openDatabase('lnreader.db'); import * as DocumentPicker from 'expo-document-picker'; import * as RNFS from 'react-native-fs'; -import { fetchChapters, fetchImage, fetchNovel } from '@services/plugin/fetch'; +import { fetchImage, fetchNovel } from '@services/plugin/fetch'; import { insertChapters } from './ChapterQueries'; import { showToast } from '@utils/showToast'; @@ -183,15 +183,18 @@ export const deleteCachedNovels = async () => { }; const restoreFromBackupQuery = - 'INSERT INTO Novel (url, name, pluginId, cover, summary, author, artist, status, genres, inLibrary) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + 'INSERT OR REPLACE INTO Novel (url, name, pluginId, cover, summary, author, artist, status, genres) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)'; export const restoreLibrary = async (novel: NovelInfo) => { - return new Promise(resolve => { + const sourceNovel = await fetchNovel(novel.pluginId, novel.url).catch(e => { + throw e; + }); + const novelId: number | undefined = await new Promise(resolve => { db.transaction(tx => tx.executeSql( restoreFromBackupQuery, [ - novel.url, + sourceNovel.url, novel.name, novel.pluginId, novel.cover || '', @@ -200,29 +203,36 @@ export const restoreLibrary = async (novel: NovelInfo) => { novel.artist || '', novel.status || '', novel.genres || '', - Number(novel.inLibrary), ], - async (txObj, { insertId }) => { - if (!insertId) { - return; - } - tx.executeSql( - 'INSERT INTO NovelCategory (novelId, categoryId) VALUES (?, (SELECT DISTINCT id FROM Category WHERE sort = 1))', - [insertId], - noop, - txnErrorCallback, - ); - const chapters = await fetchChapters(novel.pluginId, novel.url); - - if (chapters) { - await insertChapters(insertId, chapters); - resolve(insertId); - } - }, - txnErrorCallback, + async (txObj, { insertId }) => resolve(insertId), ), ); }); + if (novelId && novelId > 0) { + await new Promise((resolve, reject) => { + db.transaction(async tx => { + tx.executeSql( + 'INSERT OR REPLACE INTO NovelCategory (novelId, categoryId) VALUES (?, (SELECT DISTINCT id FROM Category WHERE sort = 1))', + [novelId], + () => { + tx.executeSql('UPDATE Novel SET inLibrary = 1 WHERE id = ?', [ + novelId, + ]); + resolve(null); + }, + (txObj, err) => { + reject(err); + return false; + }, + ); + }); + }).catch(e => { + throw e; + }); + if (sourceNovel.chapters) { + await insertChapters(novelId, sourceNovel.chapters); + } + } }; export const updateNovelInfo = async (info: NovelInfo) => { diff --git a/src/screens/BrowseSourceScreen/useBrowseSource.ts b/src/screens/BrowseSourceScreen/useBrowseSource.ts index 55d03424..9585c791 100644 --- a/src/screens/BrowseSourceScreen/useBrowseSource.ts +++ b/src/screens/BrowseSourceScreen/useBrowseSource.ts @@ -28,14 +28,20 @@ export const useBrowseSource = ( if (isScreenMounted.current === true) { try { const plugin = getPlugin(pluginId); - const res = await plugin.popularNovels(page, { - showLatestNovels, - filters, - }); - setNovels(prevState => (page === 1 ? res : [...prevState, ...res])); - if (!res.length) { - setHasNextPage(false); - } + await plugin + .popularNovels(page, { + showLatestNovels, + filters, + }) + .then(res => { + setNovels(prevState => + page === 1 ? res : [...prevState, ...res], + ); + if (!res.length) { + setHasNextPage(false); + } + }) + .catch(error => setError(error.message)); setFilterValues(plugin.filters); } catch (err: unknown) { setError(`${err}`); diff --git a/src/screens/browse/migration/MigrationNovelList.tsx b/src/screens/browse/migration/MigrationNovelList.tsx index 849d3824..108ca608 100644 --- a/src/screens/browse/migration/MigrationNovelList.tsx +++ b/src/screens/browse/migration/MigrationNovelList.tsx @@ -120,7 +120,9 @@ const MigrationNovelList = ({