mirror of
https://github.com/Jellify-Music/App.git
synced 2026-01-05 10:30:38 -06:00
Implements OTA updates, fetched via GitHub from our `App-Bundles` repository All Typescript changes can be delivered this way All native changes will need to go through the traditional `publish-beta` workflow, which is now run manually
83 lines
2.9 KiB
TypeScript
83 lines
2.9 KiB
TypeScript
import './gesture-handler'
|
|
import React, { useState } from 'react'
|
|
import 'react-native-url-polyfill/auto'
|
|
import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client'
|
|
import Jellify from './src/components/jellify'
|
|
import { TamaguiProvider, Theme, useTheme } from 'tamagui'
|
|
import { useColorScheme } from 'react-native'
|
|
import jellifyConfig from './tamagui.config'
|
|
import { clientPersister } from './src/constants/storage'
|
|
import { queryClient } from './src/constants/query-client'
|
|
import { GestureHandlerRootView } from 'react-native-gesture-handler'
|
|
import TrackPlayer, { IOSCategory, IOSCategoryOptions } from 'react-native-track-player'
|
|
import { CAPABILITIES } from './src/player/constants'
|
|
import { createWorkletRuntime } from 'react-native-reanimated'
|
|
import { SafeAreaProvider } from 'react-native-safe-area-context'
|
|
import { NavigationContainer } from '@react-navigation/native'
|
|
import { JellifyDarkTheme, JellifyLightTheme } from './src/components/theme'
|
|
import { requestStoragePermission } from './src/helpers/permisson-helpers'
|
|
import ErrorBoundary from './src/components/ErrorBoundary'
|
|
import Toast from 'react-native-toast-message'
|
|
import JellifyToastConfig from './src/constants/toast.config'
|
|
import OTAUpdateScreen from './src/components/OtaUpdates'
|
|
|
|
export const backgroundRuntime = createWorkletRuntime('background')
|
|
|
|
export default function App(): React.JSX.Element {
|
|
const [playerIsReady, setPlayerIsReady] = useState<boolean>(false)
|
|
const isDarkMode = useColorScheme() === 'dark'
|
|
|
|
TrackPlayer.setupPlayer({
|
|
autoHandleInterruptions: true,
|
|
iosCategory: IOSCategory.Playback,
|
|
iosCategoryOptions: [IOSCategoryOptions.AllowAirPlay, IOSCategoryOptions.AllowBluetooth],
|
|
})
|
|
.then(() =>
|
|
TrackPlayer.updateOptions({
|
|
capabilities: CAPABILITIES,
|
|
notificationCapabilities: CAPABILITIES,
|
|
compactCapabilities: CAPABILITIES,
|
|
progressUpdateEventInterval: 10,
|
|
}),
|
|
)
|
|
.finally(() => {
|
|
setPlayerIsReady(true)
|
|
requestStoragePermission()
|
|
})
|
|
|
|
const [reloader, setReloader] = useState(0)
|
|
|
|
const handleRetry = () => setReloader((r) => r + 1)
|
|
|
|
return (
|
|
<SafeAreaProvider>
|
|
<OTAUpdateScreen />
|
|
<ErrorBoundary reloader={reloader} onRetry={handleRetry}>
|
|
<NavigationContainer theme={isDarkMode ? JellifyDarkTheme : JellifyLightTheme}>
|
|
<PersistQueryClientProvider
|
|
client={queryClient}
|
|
persistOptions={{
|
|
persister: clientPersister,
|
|
|
|
/**
|
|
* Infinity, since data can remain the
|
|
* same forever on the server
|
|
*/
|
|
maxAge: Infinity,
|
|
buster: '0.10.99',
|
|
}}
|
|
>
|
|
<GestureHandlerRootView>
|
|
<TamaguiProvider config={jellifyConfig}>
|
|
<Theme name={isDarkMode ? 'dark' : 'light'}>
|
|
{playerIsReady && <Jellify />}
|
|
</Theme>
|
|
</TamaguiProvider>
|
|
</GestureHandlerRootView>
|
|
</PersistQueryClientProvider>
|
|
</NavigationContainer>
|
|
</ErrorBoundary>
|
|
</SafeAreaProvider>
|
|
)
|
|
}
|