Private
Public Access
1
0

Better error handling

This commit is contained in:
2023-12-10 19:37:53 -08:00
parent a8886279c6
commit 7db8c39042
6 changed files with 134 additions and 49 deletions

View File

@@ -1,16 +1,13 @@
package net.buzzert.kordophonedroid
import android.app.Application
import androidx.hilt.navigation.compose.hiltViewModel
import dagger.hilt.android.HiltAndroidApp
import net.buzzert.kordophonedroid.data.AppContainer
import net.buzzert.kordophonedroid.data.AppContainerImpl
@HiltAndroidApp
class KordophoneApplication : Application() {
lateinit var container: AppContainer
override fun onCreate() {
super.onCreate()
container = AppContainerImpl()
}
}

View File

@@ -4,7 +4,6 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import dagger.hilt.android.AndroidEntryPoint
import net.buzzert.kordophonedroid.data.AppContainerImpl
import net.buzzert.kordophonedroid.ui.KordophoneApp
@AndroidEntryPoint
@@ -12,9 +11,8 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val container = (application as KordophoneApplication).container
setContent {
KordophoneApp(appContainer = container)
KordophoneApp()
}
}
}

View File

@@ -1,18 +1,15 @@
package net.buzzert.kordophonedroid.data
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelStore
import androidx.lifecycle.ViewModelStoreOwner
import dagger.hilt.android.lifecycle.HiltViewModel
import net.buzzert.kordophone.backend.server.ChatRepository
import javax.inject.Inject
interface AppContainer: ViewModelStoreOwner {
@HiltViewModel
class AppContainer @Inject constructor(
val repository: ChatRepository
}
class AppContainerImpl() : AppContainer {
override val repository: ChatRepository
get() = TODO("Not yet implemented")
override val viewModelStore: ViewModelStore
get() = TODO("Not yet implemented")
}
) : ViewModel() {
}

View File

@@ -1,11 +1,20 @@
package net.buzzert.kordophonedroid.ui
import androidx.compose.material.AlertDialog
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import kotlinx.coroutines.flow.collectLatest
import net.buzzert.kordophone.backend.server.ChatRepository
import net.buzzert.kordophonedroid.data.AppContainer
import net.buzzert.kordophonedroid.ui.theme.KordophoneTheme
@@ -19,12 +28,35 @@ sealed class Destination(val route: String) {
}
}
@Composable
fun ErrorDialog(title: String, body: String, onDismiss: () -> Unit) {
AlertDialog(
onDismissRequest = { onDismiss() },
title = { Text(title) },
text = { Text(body) },
confirmButton = {
Button(onClick = { onDismiss() }) {
Text("OK")
}
}
)
}
@Composable
fun KordophoneApp(
appContainer: AppContainer,
appContainer: AppContainer = hiltViewModel(),
) {
KordophoneTheme {
val navController = rememberNavController()
val errorVisible = remember { mutableStateOf<ChatRepository.Error?>(null) }
val error = appContainer.repository.errorEncounteredChannel.collectAsStateWithLifecycle(
initialValue = null
)
LaunchedEffect(key1 = error.value) {
errorVisible.value = error.value
}
NavHost(
navController = navController,
startDestination = Destination.ConversationList.route,
@@ -42,5 +74,11 @@ fun KordophoneApp(
})
}
}
errorVisible.value?.let {
ErrorDialog(title = it.title, body = it.description) {
errorVisible.value = null
}
}
}
}