Files
jellyfin-audio-player/src/components/App.tsx

90 lines
2.8 KiB
TypeScript
Raw Normal View History

import React, { PropsWithChildren, useEffect } from 'react';
2020-06-17 14:58:04 +02:00
import { Provider } from 'react-redux';
import TrackPlayer, { Capability } from 'react-native-track-player';
2020-06-17 14:58:04 +02:00
import { PersistGate } from 'redux-persist/integration/react';
2020-06-16 17:51:51 +02:00
import Routes from '../screens';
2023-06-19 22:26:41 +02:00
import store, { persistedStore, useTypedSelector } from '@/store';
2020-07-26 14:45:32 +02:00
import {
NavigationContainer,
DefaultTheme,
2022-05-11 23:57:30 +02:00
DarkTheme as BaseDarkTheme,
2020-07-26 14:45:32 +02:00
} from '@react-navigation/native';
import { ColorSchemeProvider, themes } from './Colors';
import DownloadManager from './DownloadManager';
import { useColorScheme } from 'react-native';
2023-06-19 22:26:41 +02:00
import { ColorScheme } from '@/store/settings/types';
2020-06-16 17:51:51 +02:00
2022-05-11 23:57:30 +02:00
const LightTheme = {
...DefaultTheme,
colors: {
...DefaultTheme.colors,
background: themes.light.view.backgroundColor,
}
};
const DarkTheme = {
...BaseDarkTheme,
colors: {
...BaseDarkTheme.colors,
2022-05-16 22:28:13 +02:00
background: themes.dark.view.backgroundColor,
2022-05-11 23:57:30 +02:00
}
};
/**
* This is a convenience wrapper for NavigationContainer that ensures that the
* right theme is selected based on OS color scheme settings along with user preferences.
*/
function ThemedNavigationContainer({ children }: PropsWithChildren<{}>) {
const systemScheme = useColorScheme();
const userScheme = useTypedSelector((state) => state.settings.colorScheme);
const scheme = userScheme === ColorScheme.System ? systemScheme : userScheme;
return (
<NavigationContainer
theme={scheme === 'dark' ? DarkTheme : LightTheme}
>
{children}
</NavigationContainer>
);
}
2023-04-27 15:08:10 +02:00
// Track whether the player has already been setup, so that we don't
// accidentally do it twice.
let hasSetupPlayer = false;
export default function App(): JSX.Element {
useEffect(() => {
async function setupTrackPlayer() {
await TrackPlayer.setupPlayer();
await TrackPlayer.updateOptions({
capabilities: [
Capability.Play,
Capability.Pause,
Capability.SkipToNext,
Capability.SkipToPrevious,
Capability.Stop,
Capability.SeekTo,
],
2023-04-27 15:08:10 +02:00
progressUpdateEventInterval: 5,
});
2020-06-16 17:51:51 +02:00
}
2023-04-27 15:08:10 +02:00
if (!hasSetupPlayer) {
setupTrackPlayer();
hasSetupPlayer = true;
}
}, []);
2020-06-16 17:51:51 +02:00
return (
<Provider store={store}>
<PersistGate loading={null} persistor={persistedStore}>
<ColorSchemeProvider>
<ThemedNavigationContainer>
2022-05-05 22:54:37 +02:00
<Routes />
<DownloadManager />
</ThemedNavigationContainer>
</ColorSchemeProvider>
</PersistGate>
</Provider>
);
2020-06-16 17:51:51 +02:00
}