refactor(common): migrate Android NetworkError to common

This commit is contained in:
Harsh Shandilya 2022-09-30 10:46:01 +05:30
parent cca50bf2d9
commit 388e9ac0bd
No known key found for this signature in database
3 changed files with 54 additions and 70 deletions

View file

@ -1,63 +0,0 @@
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
@Composable
fun LoadError(
label: String,
error: Throwable,
modifier: Modifier = Modifier,
) {
var showDialog by remember { mutableStateOf(false) }
Column(verticalArrangement = Arrangement.spacedBy(4.dp), modifier = modifier) {
Text(
text = label,
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(error.stackTraceToString()))
showDialog = false
}
)
},
text = {
Text(
text = "${error.message}",
style = MaterialTheme.typography.bodyLarge,
)
}
)
}
}

View file

@ -16,9 +16,9 @@ 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.common.ui.NetworkError
import dev.msfjarvis.claw.database.local.SavedPost import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LobstersPost import dev.msfjarvis.claw.model.LobstersPost
@ -49,7 +49,7 @@ fun NetworkPosts(
if (items.itemCount == 0) { if (items.itemCount == 0) {
Box(modifier = Modifier.fillMaxSize()) { Box(modifier = Modifier.fillMaxSize()) {
if (loadState is LoadState.Error) { if (loadState is LoadState.Error) {
LoadError( NetworkError(
label = "Failed to load posts", label = "Failed to load posts",
error = loadState.error, error = loadState.error,
modifier = Modifier.align(Alignment.Center), modifier = Modifier.align(Alignment.Center),

View file

@ -1,16 +1,63 @@
package dev.msfjarvis.claw.common.ui package dev.msfjarvis.claw.common.ui
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.fillMaxSize 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.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable 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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp
@Composable @Composable
fun NetworkError(label: String, error: Throwable, modifier: Modifier = Modifier) { fun NetworkError(
Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) { label: String,
Text(text = label, style = MaterialTheme.typography.displayMedium) error: Throwable,
modifier: Modifier = Modifier,
) {
var showDialog by remember { mutableStateOf(false) }
Column(verticalArrangement = Arrangement.spacedBy(4.dp), modifier = modifier) {
Text(
text = label,
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(error.stackTraceToString()))
showDialog = false
}
)
},
text = {
Text(
text = "${error.message}",
style = MaterialTheme.typography.bodyLarge,
)
}
)
} }
} }