Minor fixes
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
import React from 'react';
|
||||
import {Pressable, StyleSheet, ViewPropTypes} from 'react-native';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
|
||||
|
||||
export const IconButton = ({
|
||||
icon,
|
||||
size,
|
||||
color,
|
||||
onPress,
|
||||
containerStyle,
|
||||
theme,
|
||||
}) => (
|
||||
<Pressable
|
||||
style={[styles.container, containerStyle]}
|
||||
android_ripple={{color: theme.rippleColor, borderless: true, radius: 24}}
|
||||
onPress={onPress}
|
||||
>
|
||||
<MaterialCommunityIcons name={icon} size={size} color={color} />
|
||||
</Pressable>
|
||||
);
|
||||
|
||||
IconButton.defaultProps = {
|
||||
size: 24,
|
||||
};
|
||||
|
||||
IconButton.propTypes = {
|
||||
icon: PropTypes.string.isRequired,
|
||||
size: PropTypes.number.isRequired,
|
||||
color: PropTypes.string,
|
||||
onPress: PropTypes.func,
|
||||
containerStyle: ViewPropTypes.style,
|
||||
theme: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {padding: 12},
|
||||
});
|
||||
@@ -2,6 +2,7 @@ import React from 'react';
|
||||
import {StyleSheet, View, Text, Pressable} from 'react-native';
|
||||
|
||||
import FastImage from 'react-native-fast-image';
|
||||
import {defaultCoverUri} from '../sources/helpers/constants';
|
||||
|
||||
const ListView = ({
|
||||
item,
|
||||
@@ -13,6 +14,11 @@ const ListView = ({
|
||||
isSelected,
|
||||
onLongPress,
|
||||
}) => {
|
||||
const uri =
|
||||
item.novelCover && !item.novelCover.startsWith('/')
|
||||
? item.novelCover
|
||||
: defaultCoverUri;
|
||||
|
||||
return (
|
||||
<Pressable
|
||||
android_ripple={{color: theme.rippleColor}}
|
||||
@@ -25,10 +31,7 @@ const ListView = ({
|
||||
>
|
||||
<FastImage
|
||||
source={{
|
||||
uri:
|
||||
item.novelCover && !item.novelCover.startsWith('/')
|
||||
? item.novelCover
|
||||
: 'https://github.com/LNReader/lnreader-sources/blob/main/src/coverNotAvailable.jpg?raw=true',
|
||||
uri,
|
||||
}}
|
||||
style={[styles.extensionIcon, inLibraryBadge && {opacity: 0.5}]}
|
||||
/>
|
||||
|
||||
@@ -14,6 +14,7 @@ import ListView from './ListView';
|
||||
|
||||
import {getDeviceOrientation} from '../services/utils/helpers';
|
||||
import {useSettings} from '../hooks/reduxHooks';
|
||||
import {defaultCoverUri} from '../sources/helpers/constants';
|
||||
|
||||
const NovelCover = ({
|
||||
item,
|
||||
@@ -41,6 +42,11 @@ const NovelCover = ({
|
||||
|
||||
const selectNovel = () => onLongPress && onLongPress(item.novelId);
|
||||
|
||||
const uri =
|
||||
item.novelCover && !item.novelCover.startsWith('/')
|
||||
? item.novelCover
|
||||
: defaultCoverUri;
|
||||
|
||||
return displayMode !== 2 ? (
|
||||
<View
|
||||
style={[
|
||||
@@ -64,44 +70,37 @@ const NovelCover = ({
|
||||
}
|
||||
onLongPress={selectNovel}
|
||||
>
|
||||
<>
|
||||
<View style={styles.badgeContainer}>
|
||||
{libraryStatus && <InLibraryBadge theme={theme} />}
|
||||
{showDownloadBadges && item.chaptersDownloaded && (
|
||||
<DownloadBadge
|
||||
showUnreadBadges={showUnreadBadges}
|
||||
chaptersDownloaded={item.chaptersDownloaded}
|
||||
chaptersUnread={item.chaptersUnread}
|
||||
/>
|
||||
)}
|
||||
{showUnreadBadges && item.chaptersUnread && (
|
||||
<UnreadBadge
|
||||
theme={theme}
|
||||
chaptersDownloaded={item.chaptersDownloaded}
|
||||
chaptersUnread={item.chaptersUnread}
|
||||
showDownloadBadges={showDownloadBadges}
|
||||
/>
|
||||
)}
|
||||
</View>
|
||||
<FastImage
|
||||
source={{
|
||||
uri:
|
||||
item.novelCover && !item.novelCover.startsWith('/')
|
||||
? item.novelCover
|
||||
: 'https://github.com/LNReader/lnreader-sources/blob/main/src/coverNotAvailable.jpg?raw=true',
|
||||
}}
|
||||
style={[
|
||||
{height: getHeight(), borderRadius: 4},
|
||||
libraryStatus && {opacity: 0.5},
|
||||
]}
|
||||
/>
|
||||
<View style={styles.compactTitleContainer}>
|
||||
{displayMode === 0 && <CompactTitle novelName={item.novelName} />}
|
||||
</View>
|
||||
{displayMode === 1 && (
|
||||
<ComfortableTitle novelName={item.novelName} theme={theme} />
|
||||
<View style={styles.badgeContainer}>
|
||||
{libraryStatus && <InLibraryBadge theme={theme} />}
|
||||
{showDownloadBadges && item.chaptersDownloaded && (
|
||||
<DownloadBadge
|
||||
showUnreadBadges={showUnreadBadges}
|
||||
chaptersDownloaded={item.chaptersDownloaded}
|
||||
chaptersUnread={item.chaptersUnread}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
{showUnreadBadges && item.chaptersUnread && (
|
||||
<UnreadBadge
|
||||
theme={theme}
|
||||
chaptersDownloaded={item.chaptersDownloaded}
|
||||
chaptersUnread={item.chaptersUnread}
|
||||
showDownloadBadges={showDownloadBadges}
|
||||
/>
|
||||
)}
|
||||
</View>
|
||||
<FastImage
|
||||
source={{uri}}
|
||||
style={[
|
||||
{height: getHeight(), borderRadius: 4},
|
||||
libraryStatus && {opacity: 0.5},
|
||||
]}
|
||||
/>
|
||||
<View style={styles.compactTitleContainer}>
|
||||
{displayMode === 0 && <CompactTitle novelName={item.novelName} />}
|
||||
</View>
|
||||
{displayMode === 1 && (
|
||||
<ComfortableTitle novelName={item.novelName} theme={theme} />
|
||||
)}
|
||||
</Pressable>
|
||||
</View>
|
||||
) : (
|
||||
|
||||
@@ -26,10 +26,7 @@ const BottomNavigator = () => {
|
||||
|
||||
return (
|
||||
<Tab.Navigator
|
||||
barStyle={{
|
||||
backgroundColor: theme.colorPrimary,
|
||||
paddingBottom: insets.bottom,
|
||||
}}
|
||||
barStyle={{backgroundColor: theme.colorPrimary}}
|
||||
activeColor={theme.colorAccent}
|
||||
shifting={!showLabelsInNav}
|
||||
>
|
||||
|
||||
@@ -74,8 +74,8 @@ const Browse = ({navigation}) => {
|
||||
/>
|
||||
);
|
||||
|
||||
const SourceHeader = ({title}) => (
|
||||
<Text style={[styles.sourcesHeader, {color: theme.textColorSecondary}]}>
|
||||
const Header = ({title}) => (
|
||||
<Text style={[styles.header, {color: theme.textColorSecondary}]}>
|
||||
{title}
|
||||
</Text>
|
||||
);
|
||||
@@ -115,7 +115,7 @@ const Browse = ({navigation}) => {
|
||||
<View>
|
||||
{showMyAnimeList && (
|
||||
<>
|
||||
<SourceHeader title="Discover" />
|
||||
<Header title="Discover" />
|
||||
{showMyAnimeList && (
|
||||
<DiscoverCard
|
||||
label="MyAnimeList"
|
||||
@@ -133,10 +133,10 @@ const Browse = ({navigation}) => {
|
||||
keyExtractor={item => item.sourceId.toString()}
|
||||
renderItem={renderItem}
|
||||
extraData={pinnedSources}
|
||||
ListHeaderComponent={<SourceHeader title="Pinned" />}
|
||||
ListHeaderComponent={<Header title="Pinned" />}
|
||||
/>
|
||||
)}
|
||||
{sources.length > 0 && <SourceHeader title="Sources" />}
|
||||
{sources.length > 0 && <Header title="Sources" />}
|
||||
</View>
|
||||
}
|
||||
ListEmptyComponent={
|
||||
@@ -174,8 +174,9 @@ const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
},
|
||||
sourcesHeader: {
|
||||
header: {
|
||||
paddingHorizontal: 16,
|
||||
paddingVertical: 8,
|
||||
paddingVertical: 12,
|
||||
textTransform: 'uppercase',
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import React, {useCallback} from 'react';
|
||||
import {Pressable, StyleSheet, View, Image, Text} from 'react-native';
|
||||
import {Pressable, StyleSheet, View, Text} from 'react-native';
|
||||
|
||||
import moment from 'moment';
|
||||
import {IconButton} from 'react-native-paper';
|
||||
import FastImage from 'react-native-fast-image';
|
||||
|
||||
import {parseChapterNumber} from '../../../services/utils/helpers';
|
||||
import {setNovel} from '../../../redux/novel/novel.actions';
|
||||
import {defaultCoverUri} from '../../../sources/helpers/constants';
|
||||
import {IconButton} from '../../../components/IconButton/IconButton';
|
||||
|
||||
const HistoryItem = ({history, theme, dispatch, navigation, deleteHistory}) => {
|
||||
const {
|
||||
@@ -47,13 +49,8 @@ const HistoryItem = ({history, theme, dispatch, navigation, deleteHistory}) => {
|
||||
bookmark,
|
||||
});
|
||||
|
||||
const getNovelCover = useCallback(
|
||||
() =>
|
||||
novelCover && !novelCover.startsWith('/')
|
||||
? novelCover
|
||||
: 'https://github.com/LNReader/lnreader-sources/blob/main/src/coverNotAvailable.jpg?raw=true',
|
||||
[],
|
||||
);
|
||||
const uri =
|
||||
novelCover && !novelCover.startsWith('/') ? novelCover : defaultCoverUri;
|
||||
|
||||
return (
|
||||
<Pressable
|
||||
@@ -63,7 +60,7 @@ const HistoryItem = ({history, theme, dispatch, navigation, deleteHistory}) => {
|
||||
<View style={styles.content}>
|
||||
<View style={styles.container}>
|
||||
<View>
|
||||
<Image source={{uri: getNovelCover()}} style={styles.novelCover} />
|
||||
<FastImage source={{uri}} style={styles.novelCover} />
|
||||
</View>
|
||||
<View style={styles.textContainer}>
|
||||
<Text
|
||||
@@ -86,12 +83,14 @@ const HistoryItem = ({history, theme, dispatch, navigation, deleteHistory}) => {
|
||||
size={24}
|
||||
color={theme.textColorPrimary}
|
||||
onPress={() => deleteHistory(historyId)}
|
||||
theme={theme}
|
||||
/>
|
||||
<IconButton
|
||||
icon="play"
|
||||
size={24}
|
||||
color={theme.textColorPrimary}
|
||||
onPress={navigateToChapter}
|
||||
theme={theme}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
@@ -22,6 +22,7 @@ const WebViewReader = ({
|
||||
<View style={styles.container}>
|
||||
<WebView
|
||||
style={{backgroundColor}}
|
||||
containerStyle={{flex: 1}}
|
||||
originWhitelist={['*']}
|
||||
scalesPageToFit={true}
|
||||
showsVerticalScrollIndicator={false}
|
||||
|
||||
@@ -7,7 +7,7 @@ const htmlToText = (html, options = {}) => {
|
||||
|
||||
html = html.trim();
|
||||
|
||||
text = removeLineBreaks && html.replace(/(?:\n|\r\n|\r)/gi, '');
|
||||
let text = removeLineBreaks && html.replace(/(?:\n|\r\n|\r)/gi, '');
|
||||
|
||||
text = html
|
||||
/**
|
||||
|
||||
@@ -23,6 +23,7 @@ const getPath = extensionId => {
|
||||
63: {novels: 'novel', novel: 'novel', chapter: 'novel'},
|
||||
75: {novels: 'series', novel: 'series', chapter: 'series'},
|
||||
80: {novels: 'manga', novel: 'manga', chapter: 'manga'},
|
||||
21: {novels: 'novellist', novel: 'series', chapter: 'series'},
|
||||
};
|
||||
|
||||
return (
|
||||
@@ -34,6 +35,13 @@ const getPath = extensionId => {
|
||||
);
|
||||
};
|
||||
|
||||
export const WoopReadScraper = new MadaraScraper(
|
||||
21,
|
||||
'https://woopread.com/',
|
||||
'WoopRead',
|
||||
getPath(21),
|
||||
);
|
||||
|
||||
export const SkyNovelScraper = new MadaraScraper(
|
||||
38,
|
||||
'https://skynovel.org/',
|
||||
|
||||
@@ -19,7 +19,6 @@ import novelUpdatesCcScraper from './en/novelupdatescc';
|
||||
import readLightNovelCcScraper from './en/readlightnovelcc';
|
||||
import tapReadScraper from './en/tapread';
|
||||
import WuxiaWorldCloudScraper from './en/wuxiaworldcloud';
|
||||
import WoopReadScraper from './en/woopread';
|
||||
import FoxaHolicScraper from './en/foxaholic';
|
||||
import EinharjarProjectScraper from './es/einherjarproject';
|
||||
import TuNovelaLigeraScraper from './es/tunovelaligera';
|
||||
@@ -55,6 +54,7 @@ import {
|
||||
SleepyTranslationsScraper,
|
||||
WBNovelScraper,
|
||||
WebNovelLoverScraper,
|
||||
WoopReadScraper,
|
||||
WuxiaWorldDotSiteScraper,
|
||||
ZinnNovelScraper,
|
||||
} from './multisrc/madara/MadaraGenerator';
|
||||
|
||||
Reference in New Issue
Block a user