From 77dbab6483b238d15ac388f6fe0760054fdc73b7 Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Tue, 24 Jan 2023 15:51:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=8A=B6=E6=80=81=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../page/settings/block/BlockSettingsPage.kt | 68 ++++++++++--------- .../post/ui/widgets/compose/states/States.kt | 66 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 103 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/states/States.kt diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/settings/block/BlockSettingsPage.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/settings/block/BlockSettingsPage.kt index aaec6d6c..bfd0c508 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/settings/block/BlockSettingsPage.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/settings/block/BlockSettingsPage.kt @@ -47,12 +47,12 @@ import com.google.accompanist.placeholder.material.placeholder import com.google.gson.reflect.TypeToken import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.arch.collectPartialAsState +import com.huanchengfly.tieba.post.arch.onEvent import com.huanchengfly.tieba.post.arch.pageViewModel import com.huanchengfly.tieba.post.models.database.Block import com.huanchengfly.tieba.post.ui.common.theme.compose.ExtendedTheme import com.huanchengfly.tieba.post.ui.page.main.BottomNavigationDivider import com.huanchengfly.tieba.post.ui.widgets.compose.BackNavigationIcon -import com.huanchengfly.tieba.post.ui.widgets.compose.EmptyPlaceholder import com.huanchengfly.tieba.post.ui.widgets.compose.LocalSnackbarHostState import com.huanchengfly.tieba.post.ui.widgets.compose.LongClickMenu import com.huanchengfly.tieba.post.ui.widgets.compose.MyScaffold @@ -60,10 +60,10 @@ import com.huanchengfly.tieba.post.ui.widgets.compose.PagerTabIndicator import com.huanchengfly.tieba.post.ui.widgets.compose.PromptDialog import com.huanchengfly.tieba.post.ui.widgets.compose.TitleCentredToolbar import com.huanchengfly.tieba.post.ui.widgets.compose.rememberDialogState +import com.huanchengfly.tieba.post.ui.widgets.compose.states.StateScreen import com.huanchengfly.tieba.post.utils.GsonUtil import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.launch @OptIn(ExperimentalPagerApi::class) @@ -186,17 +186,13 @@ fun BlockSettingsPage( ) { paddingValues -> val snackbarHostState = LocalSnackbarHostState.current LaunchedEffect(null) { - coroutineScope.launch { - viewModel.uiEventFlow - .filterIsInstance() - .collect { - snackbarHostState.showSnackbar( - when (it) { - is BlockSettingsUiEvent.Success.Add -> context.getString(R.string.toast_add_success) - is BlockSettingsUiEvent.Success.Delete -> context.getString(R.string.toast_delete_success) - } - ) + onEvent(viewModel) { + snackbarHostState.showSnackbar( + when (it) { + is BlockSettingsUiEvent.Success.Add -> context.getString(R.string.toast_add_success) + is BlockSettingsUiEvent.Success.Delete -> context.getString(R.string.toast_delete_success) } + ) } } HorizontalPager( @@ -206,28 +202,36 @@ fun BlockSettingsPage( contentPadding = paddingValues, verticalAlignment = Alignment.Top ) { position -> - if (isLoading) { - LazyColumn { - items(4) { - BlockItemPlaceholder() - } - } - } else { - val items = if (position == 0) blackList else whiteList - if (items.isNotEmpty()) { - LazyColumn { - items(items, key = { it.id }) { - LongClickMenu(menuContent = { - DropdownMenuItem(onClick = { viewModel.send(BlockSettingsUiIntent.Delete(it.id)) }) { - Text(text = stringResource(id = R.string.title_delete)) - } - }) { - BlockItem(item = it) - } + val items = if (position == 0) blackList else whiteList + StateScreen( + isEmpty = items.isEmpty(), + isError = false, + isLoading = isLoading, + onReload = { viewModel.send(BlockSettingsUiIntent.Load) }, + loadingScreen = { + LazyColumn(modifier = Modifier.fillMaxSize()) { + items(4) { + BlockItemPlaceholder() + } + } + } + ) { + LazyColumn { + items(items, key = { it.id }) { + LongClickMenu(menuContent = { + DropdownMenuItem(onClick = { + viewModel.send( + BlockSettingsUiIntent.Delete( + it.id + ) + ) + }) { + Text(text = stringResource(id = R.string.title_delete)) + } + }) { + BlockItem(item = it) } } - } else { - EmptyPlaceholder(modifier = Modifier.fillMaxSize()) } } } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/states/States.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/states/States.kt new file mode 100644 index 00000000..0a2756ab --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/states/States.kt @@ -0,0 +1,66 @@ +package com.huanchengfly.tieba.post.ui.widgets.compose.states + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.huanchengfly.tieba.post.R +import com.huanchengfly.tieba.post.ui.common.theme.compose.ExtendedTheme +import com.huanchengfly.tieba.post.ui.widgets.compose.EmptyPlaceholder + +val DefaultLoadingScreen: @Composable () -> Unit = { + CircularProgressIndicator(modifier = Modifier.size(48.dp), color = MaterialTheme.colors.primary) +} + +val DefaultEmptyScreen: @Composable () -> Unit = { + EmptyPlaceholder() +} + +val DefaultErrorScreen: @Composable () -> Unit = { + Text( + text = stringResource(id = R.string.error_tip), + style = MaterialTheme.typography.body1, + color = ExtendedTheme.colors.textSecondary + ) +} + +@Composable +fun StateScreen( + isEmpty: Boolean, + isError: Boolean, + isLoading: Boolean, + onReload: () -> Unit, + modifier: Modifier = Modifier, + emptyScreen: @Composable () -> Unit = DefaultEmptyScreen, + errorScreen: @Composable () -> Unit = DefaultErrorScreen, + loadingScreen: @Composable () -> Unit = DefaultLoadingScreen, + content: @Composable () -> Unit, +) { + Box( + modifier = Modifier + .fillMaxSize() + .then(modifier) + .clickable(enabled = isEmpty && !isLoading, onClick = onReload), + contentAlignment = Alignment.Center + ) { + if (!isEmpty) { + content() + } else { + if (isLoading) { + loadingScreen() + } else if (isError) { + errorScreen() + } else { + emptyScreen() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 698b6bf0..60ef4f3d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -628,4 +628,5 @@ 取消收藏失败 %s 删除历史记录失败 %s 删除历史记录成功 + 出错了