git.iko.soy/parseable-android
on icon help sign in
90 lines 3.6 kB history raw
1package com.parseable.android
3import android.os.Bundle
4import androidx.activity.ComponentActivity
5import androidx.activity.compose.setContent
6import androidx.activity.enableEdgeToEdge
7import androidx.compose.foundation.layout.Box
8import androidx.compose.foundation.layout.fillMaxSize
9import androidx.compose.material3.CircularProgressIndicator
10import androidx.compose.runtime.*
11import androidx.compose.ui.Alignment
12import androidx.compose.ui.Modifier
13import androidx.navigation.compose.rememberNavController
14import com.parseable.android.data.model.ServerConfig
15import com.parseable.android.data.repository.ParseableRepository
16import com.parseable.android.data.repository.SettingsRepository
17import com.parseable.android.ui.ErrorHandler
18import com.parseable.android.ui.GlobalErrorBoundary
19import com.parseable.android.ui.navigation.ParseableNavGraph
20import com.parseable.android.ui.navigation.Routes
21import com.parseable.android.ui.theme.ParseableTheme
22import dagger.hilt.android.AndroidEntryPoint
23import kotlinx.coroutines.flow.first
24import kotlinx.coroutines.flow.launchIn
25import kotlinx.coroutines.flow.onEach
26import javax.inject.Inject
28@AndroidEntryPoint
29class MainActivity : ComponentActivity() {
31 @Inject
32 lateinit var settingsRepository: SettingsRepository
34 @Inject
35 lateinit var repository: ParseableRepository
37 private val errorHandler = ErrorHandler()
39 override fun onCreate(savedInstanceState: Bundle?) {
40 super.onCreate(savedInstanceState)
41 enableEdgeToEdge()
43 setContent {
44 ParseableTheme {
45 GlobalErrorBoundary(errorHandler = errorHandler) {
46 var startDestination by remember { mutableStateOf<String?>(null) }
48 LaunchedEffect(Unit) {
49 val savedConfig: ServerConfig? = settingsRepository.serverConfig.first()
50 if (savedConfig != null) {
51 repository.configure(savedConfig)
52 }
53 startDestination = if (savedConfig != null) Routes.STREAMS else Routes.LOGIN
54 }
56 val dest = startDestination
57 if (dest != null) {
58 val navController = rememberNavController()
60 // Navigate to login on 401 auth errors
61 LaunchedEffect(navController) {
62 repository.authErrors
63 .onEach {
64 settingsRepository.clearConfig()
65 errorHandler.showError("Session expired. Please log in again.")
66 navController.navigate(Routes.login(sessionExpired = true)) {
67 popUpTo(0) { inclusive = true }
68 }
69 }
70 .launchIn(this)
71 }
73 ParseableNavGraph(
74 navController = navController,
75 startDestination = dest,
76 repository = repository,
77 )
78 } else {
79 Box(
80 modifier = Modifier.fillMaxSize(),
81 contentAlignment = Alignment.Center,
82 ) {
83 CircularProgressIndicator()
84 }
85 }
86 }
87 }
88 }
89 }