Skip to content

Commit 82d5a4f

Browse files
authored
Merge branch 'LNReader:master' into novel-updates-rating
2 parents c6655a5 + 4e3f817 commit 82d5a4f

File tree

22 files changed

+500
-308
lines changed

22 files changed

+500
-308
lines changed

android/app/src/main/assets/js/core.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,14 @@ window.addEventListener('DOMContentLoaded', async () => {
464464
}
465465

466466
if (reader.generalSettings.val.removeExtraParagraphSpacing) {
467-
html = html.replace(/<\s*br[^>]*>/gi, '\n').replace(/\n{2,}/g, '\n\n');
467+
html = html
468+
.replace(/(?:&nbsp;\s*|[\u200b]\s*)+(?=<\/?p[> ])/g, '')
469+
.replace(/<br>\s*<br>\s*(?:<br>\s*)+/g, '<br><br>') //force max 2 consecutive <br>, chaining regex
470+
.replace(
471+
/<br>\s*<br>(?:(?!\s*<(?:em|[iab]|strong|span)[> ])|(?<!(?:\/em|\/[iab]|\/strong|\/span)>\s*<br>\s*<br>))\s*/g,
472+
'',
473+
) //look-around double br. If certain tags aren't near, delete the double br.
474+
.replace(/<br>(?:(?=\s*<\/?p[> ])|(?<=<\/?p>\s*<br>))\s*/g, '');
468475
}
469476
reader.chapterElement.innerHTML = html;
470477
});

src/hooks/persisted/useDownload.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
import { ChapterInfo, NovelInfo } from '@database/types';
2-
import ServiceManager, { BackgroundTask } from '@services/ServiceManager';
2+
import ServiceManager, {
3+
BackgroundTaskMetadata,
4+
DownloadChapterTask,
5+
QueuedBackgroundTask,
6+
} from '@services/ServiceManager';
37
import { useMemo } from 'react';
48
import { useMMKVObject } from 'react-native-mmkv';
59

610
export const DOWNLOAD_QUEUE = 'DOWNLOAD';
711
export const CHAPTER_DOWNLOADING = 'CHAPTER_DOWNLOADING';
812

913
export default function useDownload() {
10-
const [queue] = useMMKVObject<BackgroundTask[]>(
14+
const [queue] = useMMKVObject<QueuedBackgroundTask[]>(
1115
ServiceManager.manager.STORE_KEY,
1216
);
1317
const downloadQueue = useMemo(
14-
() => queue?.filter(t => t.name === 'DOWNLOAD_CHAPTER') || [],
18+
() => queue?.filter(t => t.task.name === 'DOWNLOAD_CHAPTER') || [],
1519
[queue],
16-
);
20+
) as { task: DownloadChapterTask; meta: BackgroundTaskMetadata }[];
1721

1822
const downloadChapter = (novel: NovelInfo, chapter: ChapterInfo) =>
1923
ServiceManager.manager.addTask({

src/screens/GlobalSearchScreen/components/GlobalSearchResultsList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ const GlobalSearchSourceResults: React.FC<{ item: GlobalSearchResult }> = ({
157157
</View>
158158
</>
159159
),
160-
[item.isLoading],
160+
[item.isLoading, library],
161161
);
162162
};
163163

src/screens/library/LibraryScreen.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,10 @@ const LibraryScreen = ({ navigation }: LibraryScreenProps) => {
210210
library[index].id !== 2 &&
211211
ServiceManager.manager.addTask({
212212
name: 'UPDATE_LIBRARY',
213-
data: library[index].id,
213+
data: {
214+
categoryId: library[index].id,
215+
categoryName: library[index].name,
216+
},
214217
}),
215218
},
216219
{
@@ -289,6 +292,7 @@ const LibraryScreen = ({ navigation }: LibraryScreenProps) => {
289292
) : null}
290293
<LibraryView
291294
categoryId={route.id}
295+
categoryName={route.name}
292296
novels={route.novels}
293297
selectedNovelIds={selectedNovelIds}
294298
setSelectedNovelIds={setSelectedNovelIds}

src/screens/library/components/LibraryListView.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import ServiceManager from '@services/ServiceManager';
1616

1717
interface Props {
1818
categoryId: number;
19+
categoryName: string;
1920
novels: LibraryNovelInfo[];
2021
selectedNovelIds: number[];
2122
setSelectedNovelIds: React.Dispatch<React.SetStateAction<number[]>>;
@@ -24,6 +25,7 @@ interface Props {
2425

2526
export const LibraryView: React.FC<Props> = ({
2627
categoryId,
28+
categoryName,
2729
novels,
2830
selectedNovelIds,
2931
setSelectedNovelIds,
@@ -62,7 +64,10 @@ export const LibraryView: React.FC<Props> = ({
6264
setRefreshing(true);
6365
ServiceManager.manager.addTask({
6466
name: 'UPDATE_LIBRARY',
65-
data: categoryId,
67+
data: {
68+
categoryId,
69+
categoryName,
70+
},
6671
});
6772
setRefreshing(false);
6873
};

src/screens/more/TaskQueueScreen.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ import { showToast } from '../../utils/showToast';
1414
import { getString } from '@strings/translations';
1515
import { Appbar, EmptyView } from '@components';
1616
import { TaskQueueScreenProps } from '@navigators/types';
17-
import ServiceManager, { BackgroundTask } from '@services/ServiceManager';
17+
import ServiceManager, { QueuedBackgroundTask } from '@services/ServiceManager';
1818
import { useSafeAreaInsets } from 'react-native-safe-area-context';
1919
import { useMMKVObject } from 'react-native-mmkv';
2020

2121
const DownloadQueue = ({ navigation }: TaskQueueScreenProps) => {
2222
const theme = useTheme();
2323
const { bottom } = useSafeAreaInsets();
24-
const [taskQueue] = useMMKVObject<BackgroundTask[]>(
24+
const [taskQueue] = useMMKVObject<QueuedBackgroundTask[]>(
2525
ServiceManager.manager.STORE_KEY,
2626
);
2727
const [isRunning, setIsRunning] = useState(ServiceManager.manager.isRunning);
@@ -34,6 +34,8 @@ const DownloadQueue = ({ navigation }: TaskQueueScreenProps) => {
3434
}
3535
}, [taskQueue]);
3636

37+
//TODO: there should probably be a way to cancel a specific task from this screen
38+
3739
return (
3840
<>
3941
<Appbar
@@ -71,15 +73,21 @@ const DownloadQueue = ({ navigation }: TaskQueueScreenProps) => {
7173
contentContainerStyle={{ flexGrow: 1, paddingBottom: 100 }}
7274
keyExtractor={(item, index) => 'task_' + index}
7375
data={taskQueue || []}
74-
renderItem={({ item, index }) => (
76+
renderItem={({ item }) => (
7577
<View style={{ padding: 16 }}>
76-
<Text style={{ color: theme.onSurface }}>
77-
{item.name} - {ServiceManager.manager.getTaskDescription(item)}
78-
</Text>
78+
<Text style={{ color: theme.onSurface }}>{item.meta.name}</Text>
79+
{item.meta.progressText ? (
80+
<Text style={{ color: theme.onSurfaceVariant }}>
81+
{item.meta.progressText}
82+
</Text>
83+
) : null}
7984
<ProgressBar
80-
indeterminate={taskQueue && taskQueue.length > 0 && index === 0}
85+
indeterminate={
86+
item.meta.isRunning && item.meta.progress === undefined
87+
}
88+
progress={item.meta.progress}
8189
color={theme.primary}
82-
style={{ marginTop: 8 }}
90+
style={{ marginTop: 8, backgroundColor: theme.surface2 }}
8391
/>
8492
</View>
8593
)}

src/screens/novel/NovelScreen.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ const Novel = ({ route, navigation }: NovelScreenProps) => {
438438
renderItem={({ item }) => (
439439
<ChapterItem
440440
isDownloading={downloadQueue.some(
441-
c => c.data.chapterId === item.id,
441+
c => c.task.data.chapterId === item.id,
442442
)}
443443
isLocal={novel.isLocal}
444444
theme={theme}

src/screens/novel/components/EditInfoModal.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,17 @@ const EditInfoModal = ({
171171
mode="outlined"
172172
onChangeText={text => setNewGenre(text)}
173173
onSubmitEditing={() => {
174+
const newGenreTrimmed = newGenre.trim();
175+
176+
if (newGenreTrimmed === '') {
177+
return;
178+
}
179+
174180
setNovelInfo(prevVal => ({
175181
...prevVal,
176182
genres: novelInfo.genres
177-
? `${novelInfo.genres},`
178-
: '' + newGenre.trim(),
183+
? `${novelInfo.genres},` + newGenreTrimmed
184+
: newGenreTrimmed,
179185
}));
180186
setNewGenre('');
181187
}}

src/screens/novel/components/NovelAppbar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ const NovelAppbar = ({
189189
}}
190190
onPress={() => {
191191
showExtraMenu(false);
192-
setCustomNovelCover;
192+
setCustomNovelCover();
193193
}}
194194
/>
195195
</Menu>

src/screens/reader/ReaderScreen.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useRef, useCallback } from 'react';
1+
import React, { useRef, useCallback, useState, useEffect } from 'react';
22
import { DrawerLayoutAndroid } from 'react-native';
33

44
import { useChapterGeneralSettings, useTheme } from '@hooks/persisted';
@@ -63,6 +63,11 @@ export const ChapterContent = ({
6363
const readerSheetRef = useRef<BottomSheetModalMethods>(null);
6464
const theme = useTheme();
6565
const { pageReader = false, keepScreenOn } = useChapterGeneralSettings();
66+
const [bookmarked, setBookmarked] = useState(chapter.bookmark);
67+
68+
useEffect(() => {
69+
setBookmarked(chapter.bookmark);
70+
}, [chapter]);
6671

6772
const {
6873
hidden,
@@ -146,7 +151,12 @@ export const ChapterContent = ({
146151
<ReaderBottomSheetV2 bottomSheetRef={readerSheetRef} />
147152
{!hidden ? (
148153
<>
149-
<ReaderAppbar goBack={navigation.goBack} theme={theme} />
154+
<ReaderAppbar
155+
goBack={navigation.goBack}
156+
theme={theme}
157+
bookmarked={bookmarked}
158+
setBookmarked={setBookmarked}
159+
/>
150160
<ReaderFooter
151161
theme={theme}
152162
nextChapter={nextChapter}

src/screens/reader/components/ReaderAppbar.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect, useState } from 'react';
1+
import React from 'react';
22
import { StatusBar, StyleSheet, View } from 'react-native';
33
import color from 'color';
44

@@ -14,12 +14,14 @@ interface ReaderAppbarProps {
1414
goBack: () => void;
1515
}
1616

17-
const ReaderAppbar = ({ goBack, theme }: ReaderAppbarProps) => {
17+
const ReaderAppbar = ({
18+
goBack,
19+
theme,
20+
bookmarked,
21+
setBookmarked,
22+
}: ReaderAppbarProps) => {
1823
const { chapter, novel } = useChapterContext();
19-
const [bookmarked, setBookmarked] = useState(chapter.bookmark);
20-
useEffect(() => {
21-
setBookmarked(chapter.bookmark);
22-
}, [chapter]);
24+
2325
return (
2426
<Animated.View
2527
entering={FadeIn.duration(150)}

src/screens/reader/hooks/useChapter.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
getChapter as getDbChapter,
23
getNextChapter,
34
getPrevChapter,
45
markChapterRead,
@@ -188,10 +189,17 @@ export default function useChapter(webViewRef: RefObject<WebView>) {
188189
useEffect(() => {
189190
setLoading(true);
190191
getChapter().finally(() => setLoading(false));
192+
191193
if (!incognitoMode) {
192194
insertHistory(chapter.id);
193-
setLastRead(chapter);
195+
getDbChapter(chapter.id).then(result => setLastRead(result));
194196
}
197+
198+
return () => {
199+
if (!incognitoMode) {
200+
getDbChapter(chapter.id).then(result => setLastRead(result));
201+
}
202+
};
195203
}, [chapter]);
196204

197205
const refetch = () => {

src/screens/updates/UpdatesScreen.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ const UpdatesScreen = ({ navigation }: UpdateScreenProps) => {
8484
e.preventDefault();
8585

8686
navigation.navigate('MoreStack', {
87-
screen: 'Downloads',
87+
screen: 'TaskQueue',
8888
});
8989
}
9090
}),

src/screens/updates/components/UpdateNovelCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ const UpdateNovelCard: React.FC<UpdateCardProps> = ({
112112
<ChapterItem
113113
isLocal={false}
114114
isDownloading={downloadQueue.some(
115-
c => c.data.chapterId === item.id,
115+
c => c.task.data.chapterId === item.id,
116116
)}
117117
isUpdateCard
118118
novelName={chapterList[0].novelName}
@@ -142,7 +142,7 @@ const UpdateNovelCard: React.FC<UpdateCardProps> = ({
142142
<ChapterItem
143143
isLocal={false}
144144
isDownloading={downloadQueue.some(
145-
c => c.data.chapterId === chapterList[0].id,
145+
c => c.task.data.chapterId === chapterList[0].id,
146146
)}
147147
isUpdateCard
148148
novelName={chapterList[0].novelName}

0 commit comments

Comments
 (0)