feat(android): add detailed error screen for post load failure

This commit is contained in:
Harsh Shandilya 2022-09-18 21:53:06 +05:30
parent 3aba61bcd5
commit e96ef78d1a
No known key found for this signature in database
2 changed files with 72 additions and 2 deletions

View file

@ -0,0 +1,63 @@
package dev.msfjarvis.claw.android.ui
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp
import androidx.paging.LoadState
@Composable
fun LoadError(
data: LoadState.Error,
modifier: Modifier = Modifier,
) {
var showDialog by remember { mutableStateOf(false) }
Column(verticalArrangement = Arrangement.spacedBy(4.dp), modifier = modifier) {
Text(
text = "Failed to load posts",
style = MaterialTheme.typography.bodyLarge,
modifier = Modifier.align(Alignment.CenterHorizontally),
)
Button(
onClick = { showDialog = true },
modifier = Modifier.align(Alignment.CenterHorizontally),
) {
Text(text = "Show error")
}
}
if (showDialog) {
val clipboard = LocalClipboardManager.current
AlertDialog(
onDismissRequest = { showDialog = false },
confirmButton = {
Text(
text = "Copy stacktrace",
modifier =
Modifier.clickable {
clipboard.setText(AnnotatedString(data.error.stackTraceToString()))
showDialog = false
}
)
},
text = {
Text(
text = "${data.error.message}",
style = MaterialTheme.typography.bodyLarge,
)
}
)
}
}

View file

@ -8,6 +8,7 @@ import androidx.compose.material3.Divider
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.contentColorFor import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
@ -15,6 +16,7 @@ import androidx.paging.compose.items
import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.SwipeRefreshIndicator import com.google.accompanist.swiperefresh.SwipeRefreshIndicator
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import dev.msfjarvis.claw.android.ui.LoadError
import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.posts.PostActions
import dev.msfjarvis.claw.common.posts.toDbModel import dev.msfjarvis.claw.common.posts.toDbModel
import dev.msfjarvis.claw.database.local.SavedPost import dev.msfjarvis.claw.database.local.SavedPost
@ -29,7 +31,8 @@ fun NetworkPosts(
postActions: PostActions, postActions: PostActions,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val isRefreshing = items.loadState.refresh == LoadState.Loading val loadState = items.loadState.refresh
val isRefreshing = loadState == LoadState.Loading
SwipeRefresh( SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing), state = rememberSwipeRefreshState(isRefreshing),
onRefresh = reloadPosts, onRefresh = reloadPosts,
@ -44,7 +47,11 @@ fun NetworkPosts(
} }
) { ) {
if (items.itemCount == 0) { if (items.itemCount == 0) {
Box(modifier = Modifier.fillMaxSize()) Box(modifier = Modifier.fillMaxSize()) {
if (loadState is LoadState.Error) {
LoadError(data = loadState, modifier = Modifier.align(Alignment.Center))
}
}
} else { } else {
LazyColumn( LazyColumn(
state = listState, state = listState,