diff --git a/src/components/ListView.tsx b/src/components/ListView.tsx index 3f006cb7..fb154395 100644 --- a/src/components/ListView.tsx +++ b/src/components/ListView.tsx @@ -7,10 +7,10 @@ import { coverPlaceholderColor } from '../theme/colors'; import color from 'color'; import { ThemeColors } from '@theme/types'; import { NovelItem } from '@plugins/types'; -import { LibraryNovelInfo } from '@database/types'; +import { NovelInfo } from '@database/types'; interface ListViewProps { - item: NovelItem | LibraryNovelInfo; + item: NovelItem | NovelInfo; downloadBadge?: React.ReactNode; unreadBadge?: React.ReactNode; inLibraryBadge?: React.ReactNode; diff --git a/src/components/NovelCover.tsx b/src/components/NovelCover.tsx index 2bbdf18e..53acfe10 100644 --- a/src/components/NovelCover.tsx +++ b/src/components/NovelCover.tsx @@ -53,7 +53,7 @@ interface INovelCover { libraryStatus: boolean; theme: ThemeColors; isSelected: boolean; - addSkeletonLoading: boolean; + addSkeletonLoading?: boolean; onLongPress: (item: TNovel) => void; selectedNovelIds: number[]; } diff --git a/src/navigators/BottomNavigator.tsx b/src/navigators/BottomNavigator.tsx index 610f3575..6621d918 100644 --- a/src/navigators/BottomNavigator.tsx +++ b/src/navigators/BottomNavigator.tsx @@ -1,4 +1,4 @@ -import React, { lazy } from 'react'; +import React, { lazy, useMemo } from 'react'; import { createMaterialBottomTabNavigator } from 'react-native-paper/react-navigation'; import Library from '../screens/library/LibraryScreen'; @@ -8,7 +8,7 @@ const Browse = lazy(() => import('../screens/browse/BrowseScreen')); const More = lazy(() => import('../screens/more/MoreScreen')); import { getString } from '@strings/translations'; -import { useAppSettings, useTheme } from '@hooks/persisted'; +import { useAppSettings, usePlugins, useTheme } from '@hooks/persisted'; import { BottomNavigatorParamList } from './types'; const Tab = createMaterialBottomTabNavigator(); @@ -22,6 +22,12 @@ const BottomNavigator = () => { showLabelsInNav = false, } = useAppSettings(); + const { filteredInstalledPlugins } = usePlugins(); + const pluginsWithUpdate = useMemo( + () => filteredInstalledPlugins.filter(p => p.hasUpdate).length, + [filteredInstalledPlugins], + ); + return ( { options={{ title: getString('browse'), tabBarIcon: 'compass-outline', + tabBarBadge: pluginsWithUpdate + ? pluginsWithUpdate.toString() + : undefined, }} /> { } return ( + // @ts-ignore {isNewVersion && } diff --git a/src/navigators/types/index.ts b/src/navigators/types/index.ts index 82f7f7c1..f041de5d 100644 --- a/src/navigators/types/index.ts +++ b/src/navigators/types/index.ts @@ -53,6 +53,11 @@ export type HistoryScreenProps = CompositeScreenProps< StackScreenProps >; +export type UpdateScreenProps = CompositeScreenProps< + MaterialBottomTabScreenProps, + StackScreenProps +>; + export type BrowseScreenProps = CompositeScreenProps< MaterialBottomTabScreenProps, StackScreenProps diff --git a/src/screens/browse/BrowseScreen.tsx b/src/screens/browse/BrowseScreen.tsx index 3e49e8ff..1acb7d3b 100644 --- a/src/screens/browse/BrowseScreen.tsx +++ b/src/screens/browse/BrowseScreen.tsx @@ -1,5 +1,5 @@ import { Text } from 'react-native'; -import React, { useMemo } from 'react'; +import React, { useEffect, useMemo } from 'react'; import { TabView, TabBar } from 'react-native-tab-view'; import { useSearch } from '@hooks'; @@ -38,6 +38,18 @@ const BrowseScreen = ({ navigation }: BrowseScreenProps) => { [], ); + useEffect( + () => + navigation.addListener('tabPress', e => { + if (navigation.isFocused()) { + e.preventDefault(); + + navigation.navigate('GlobalSearchScreen', {}); + } + }), + [navigation], + ); + const [index, setIndex] = React.useState(0); return ( <> diff --git a/src/screens/history/HistoryScreen.tsx b/src/screens/history/HistoryScreen.tsx index 93ddb1aa..5fe598a0 100644 --- a/src/screens/history/HistoryScreen.tsx +++ b/src/screens/history/HistoryScreen.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { StyleSheet, SectionList, Text } from 'react-native'; import dayjs from 'dayjs'; import { Portal } from 'react-native-paper'; @@ -70,6 +70,23 @@ const HistoryScreen = () => { setFalse: closeClearHistoryDialog, } = useBoolean(); + useEffect( + () => + navigation.addListener('tabPress', e => { + let lastNovel = history[0]; + if (navigation.isFocused() && lastNovel) { + e.preventDefault(); + + navigation.navigate('Novel', { + name: lastNovel.novelName, + path: lastNovel.novelPath, + pluginId: lastNovel.pluginId, + }); + } + }), + [navigation, history], + ); + return ( <> { const bottomSheetRef = useRef(null); + useEffect( + () => + navigation.addListener('tabPress', e => { + if (navigation.isFocused()) { + e.preventDefault(); + + bottomSheetRef.current?.present?.(); + } + }), + [navigation], + ); + const renderTabBar = ( props: SceneRendererProps & { navigationState: State }, ) => diff --git a/src/screens/more/MoreScreen.tsx b/src/screens/more/MoreScreen.tsx index 6606ee4b..5abb82c2 100644 --- a/src/screens/more/MoreScreen.tsx +++ b/src/screens/more/MoreScreen.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { StyleSheet, View, Pressable, Text, ScrollView } from 'react-native'; import { getString } from '@strings/translations'; @@ -28,6 +28,23 @@ const MoreScreen = ({ navigation }: MoreStackScreenProps) => { const enableIncognitoMode = () => setLibrarySettings({ incognitoMode: !incognitoMode }); + useEffect( + () => + navigation.addListener('tabPress', e => { + if (navigation.isFocused()) { + e.preventDefault(); + + navigation.navigate('MoreStack', { + screen: 'SettingsStack', + params: { + screen: 'Settings', + }, + }); + } + }), + [navigation], + ); + return ( { +const UpdatesScreen = ({ navigation }: UpdateScreenProps) => { const theme = useTheme(); const { isLoading, @@ -76,6 +77,20 @@ const UpdatesScreen = () => { }, [downloadQueue]), ); + useEffect( + () => + navigation.addListener('tabPress', e => { + if (navigation.isFocused()) { + e.preventDefault(); + + navigation.navigate('MoreStack', { + screen: 'Downloads', + }); + } + }), + [navigation], + ); + return ( <>