import { withSuspense } from '@app/components/withSuspense' import { useFirstRun } from '@app/hooks/settings' import { Album, Playlist } from '@app/models/library' import BottomTabBar from '@app/navigation/BottomTabBar' import LibraryTopTabNavigator from '@app/navigation/LibraryTopTabNavigator' import ArtistView from '@app/screens/ArtistView' import Home from '@app/screens/Home' import Search from '@app/screens/Search' import SearchResultsView from '@app/screens/SearchResultsView' import ServerView from '@app/screens/ServerView' import SettingsView from '@app/screens/Settings' import SongListView from '@app/screens/SongListView' import WebViewScreen from '@app/screens/WebViewScreen' import { useStore } from '@app/state/store' import colors from '@app/styles/colors' import font from '@app/styles/font' import { BottomTabNavigationProp, createBottomTabNavigator } from '@react-navigation/bottom-tabs' import { RouteProp, StackActions } from '@react-navigation/native' import React, { useEffect } from 'react' import { useTranslation } from 'react-i18next' import { StyleSheet } from 'react-native' import { createNativeStackNavigator, NativeStackNavigationProp } from 'react-native-screens/native-stack' type TabStackParamList = { main: undefined album: { id: string; title: string; album?: Album } artist: { id: string; title: string } playlist: { id: string; title: string; playlist?: Playlist } results: { query: string; type: 'album' | 'song' | 'artist' } } type AlbumScreenNavigationProp = NativeStackNavigationProp type AlbumScreenRouteProp = RouteProp type AlbumScreenProps = { route: AlbumScreenRouteProp navigation: AlbumScreenNavigationProp } const AlbumScreen: React.FC = ({ route }) => type ArtistScreenNavigationProp = NativeStackNavigationProp type ArtistScreenRouteProp = RouteProp type ArtistScreenProps = { route: ArtistScreenRouteProp navigation: ArtistScreenNavigationProp } const ArtistScreen: React.FC = ({ route }) => type PlaylistScreenNavigationProp = NativeStackNavigationProp type PlaylistScreenRouteProp = RouteProp type PlaylistScreenProps = { route: PlaylistScreenRouteProp navigation: PlaylistScreenNavigationProp } const PlaylistScreen: React.FC = ({ route }) => type ResultsScreenNavigationProp = NativeStackNavigationProp type ResultsScreenRouteProp = RouteProp type ResultsScreenProps = { route: ResultsScreenRouteProp navigation: ResultsScreenNavigationProp } const ResultsScreen: React.FC = ({ route }) => const styles = StyleSheet.create({ stackheaderStyle: { backgroundColor: colors.gradient.high, // backgroundColor: 'transparent', }, stackheaderTitleStyle: { fontSize: 18, fontFamily: font.semiBold, color: colors.text.primary, }, }) const itemScreenOptions = { title: '', headerStyle: styles.stackheaderStyle, headerHideShadow: true, headerTintColor: 'white', headerTitleStyle: styles.stackheaderTitleStyle, // headerTranslucent: true, } function createTabStackNavigator(Component: React.ComponentType) { const Stack = createNativeStackNavigator() const Navigator: React.FC<{ navigation: BottomTabNavigationProp<{ a: undefined }, 'a'> }> = ({ navigation }) => { useEffect(() => { return navigation.addListener('tabPress', () => { navigation.dispatch(StackActions.popToTop()) }) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return ( ) } return Navigator } const HomeTab = createTabStackNavigator(Home) const LibraryTab = createTabStackNavigator(LibraryTopTabNavigator) const SearchTab = createTabStackNavigator(Search) type SettingsStackParamList = { main: undefined server?: { id?: string } web: { uri: string; title?: string } } type ServerScreenNavigationProp = NativeStackNavigationProp type ServerScreenRouteProp = RouteProp type ServerScreenProps = { route: ServerScreenRouteProp navigation: ServerScreenNavigationProp } const ServerScreen: React.FC = ({ route }) => type WebScreenNavigationProp = NativeStackNavigationProp type WebScreenRouteProp = RouteProp type WebScreenProps = { route: WebScreenRouteProp navigation: WebScreenNavigationProp } const WebScreen: React.FC = ({ route }) => ( ) const SettingsStack = createNativeStackNavigator() const SettingsTab = () => { return ( ) } const Tab = createBottomTabNavigator() const BottomTabNavigator = withSuspense(() => { const { t } = useTranslation('navigation.tabs') const firstRun = useFirstRun() const resetServer = useStore(store => store.resetServer) return ( {resetServer ? ( <> ) : ( <> )} ) }) export default BottomTabNavigator