)
}
// Todo localize errors
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun CharacterListScreen(
characters: LazyPagingItems<Character>,
onNavigateToSettings: () -> Unit,
) {
val snackbarHostState = remember { SnackbarHostState() }
val loadState = characters.loadState
loadState.refresh.errorOrNull?.let { error ->
LaunchedEffect(snackbarHostState, error) {
snackbarHostState.showSnackbar("Error")
}
}
loadState.append.errorOrNull?.let { error ->
LaunchedEffect(snackbarHostState, error) {
snackbarHostState.showSnackbar("Error")
}
}
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
HazeScaffold(
topBar = {
CharacterListScreenAppBar(
onNavigateToSettings = onNavigateToSettings,
scrollBehavior = scrollBehavior,
)
},
snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
blurTopBar = true,
) { contentPadding ->
PullToRefresh(
isRefreshing = loadState.refresh.isLoading,
onRefresh = characters::refresh,
indicatorPadding = contentPadding,
) {
when {
loadState.refresh.isLoading && characters.isEmpty -> {
Loader(
modifier = Modifier
.fillMaxWidth()
.wrapContentSize()
.padding(contentPadding),
)
}
loadState.refresh.isError && characters.isEmpty -> {
Error(
text = "Error",
onRetry = characters::retry,
modifier = Modifier
.fillMaxSize()
.padding(contentPadding),
)
}
loadState.refresh.isNotLoading && characters.isEmpty -> {
// Todo empty state
}
else -> {
val listState = rememberLazyListState()
TrackScrollJank(
scrollableState = listState,
stateName = "characterList:screen",
)
LazyColumn(
modifier = Modifier
.nestedScroll(scrollBehavior.nestedScrollConnection)
.fillMaxSize()
.consumeWindowInsets(contentPadding),
state = listState,
contentPadding = contentPadding,
) {
items(
count = characters.itemCount,
key = characters.itemKey { it.id },
contentType = characters.itemContentType { "character" },
) { index ->
val item = characters[index]!!
CharacterItem(item)
}
appendLoadState(items = characters)
}
}
}
}
}
}
@Composable
private fun CharacterItem(character: Character) {
ListItem(
headlineContent = {
Text(text = character.name)
},
leadingContent = {
AsyncImage(
model = character.imageUrl,
contentDescription = null,
modifier = Modifier.size(48.dp),
)
},
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun CharacterListScreenAppBar(
onNavigateToSettings: () -> Unit,
scrollBehavior: TopAppBarScrollBehavior,
) {
CenterAlignedTopAppBar(
title = {