import React, { PropsWithChildren, useEffect, useState } from 'react';
import { Provider } from 'react-redux';
import TrackPlayer, { Capability } from 'react-native-track-player';
import { PersistGate } from 'redux-persist/integration/react';
import Routes from '../screens';
import store, { persistedStore } from '@/store';
import {
NavigationContainer,
DefaultTheme,
DarkTheme as BaseDarkTheme,
} from '@react-navigation/native';
import { ColorSchemeProvider, themes, useUserOrSystemScheme } from './Colors';
import DownloadManager from './DownloadManager';
import AppLoading from './AppLoading';
const LightTheme = {
...DefaultTheme,
colors: {
...DefaultTheme.colors,
background: themes.light.view.backgroundColor,
}
};
const DarkTheme = {
...BaseDarkTheme,
colors: {
...BaseDarkTheme.colors,
background: themes.dark.view.backgroundColor,
}
};
/**
* 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 scheme = useUserOrSystemScheme();
return (
{children}
);
}
export default function App(): JSX.Element | null {
// Track whether the player has already been setup, so that we don't
// accidentally do it twice.
const [hasSetupPlayer, setHasSetupPlayer] = useState(false);
useEffect(() => {
async function setupTrackPlayer() {
await TrackPlayer.setupPlayer({ autoHandleInterruptions: true });
await TrackPlayer.updateOptions({
capabilities: [
Capability.Play,
Capability.Pause,
Capability.SkipToNext,
Capability.SkipToPrevious,
Capability.Stop,
Capability.SeekTo,
],
progressUpdateEventInterval: 5,
});
setHasSetupPlayer(true);
}
if (!hasSetupPlayer) {
setupTrackPlayer();
}
}, [hasSetupPlayer]);
// GUARD: Wait for setup of the player before showing the rest of the app
if (!hasSetupPlayer) {
return ();
}
return (
);
}