diff --git a/app/src/main/java/com/aiosman/ravenow/ui/account/changepassword.kt b/app/src/main/java/com/aiosman/ravenow/ui/account/changepassword.kt index 2f01757..45f845a 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/account/changepassword.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/account/changepassword.kt @@ -16,9 +16,11 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import com.aiosman.ravenow.AppState import com.aiosman.ravenow.LocalAppTheme import com.aiosman.ravenow.LocalNavController import com.aiosman.ravenow.R @@ -68,6 +70,19 @@ fun ChangePasswordScreen() { var confirmPasswordError by remember { mutableStateOf(null) } var passwordError by remember { mutableStateOf(null) } val AppColors = LocalAppTheme.current + // 暗色模式下的 hint 文本颜色 + val isDarkMode = AppState.darkMode + val hintColor = if (isDarkMode) { + Color(0xFFFFFFFF).copy(alpha = 0.7f) + } else { + null // 使用默认颜色 + } + val labelColor = if (isDarkMode) { + Color(0xFFFFFFFF).copy(alpha = 0.7f) + } else { + null // 使用默认颜色 + } + fun validate(): Boolean { // 使用通用密码校验器校验当前密码 val currentPasswordValidation = PasswordValidator.validateCurrentPassword(currentPassword, context) @@ -112,7 +127,9 @@ fun ChangePasswordScreen() { password = true, label = stringResource(R.string.current_password), hint = stringResource(R.string.current_password_tip5), - error = oldPasswordError + error = oldPasswordError, + customHintColor = hintColor, + customLabelColor = labelColor ) Spacer(modifier = Modifier.height(4.dp)) TextInputField( @@ -121,7 +138,9 @@ fun ChangePasswordScreen() { password = true, label = stringResource(R.string.new_password), hint = stringResource(R.string.new_password), - error = passwordError + error = passwordError, + customHintColor = hintColor, + customLabelColor = labelColor ) Spacer(modifier = Modifier.height(4.dp)) TextInputField( @@ -130,7 +149,9 @@ fun ChangePasswordScreen() { password = true, label = stringResource(R.string.confirm_new_password_tip1), hint = stringResource(R.string.new_password_tip1), - error = confirmPasswordError + error = confirmPasswordError, + customHintColor = hintColor, + customLabelColor = labelColor ) Spacer(modifier = Modifier.height(50.dp)) ActionButton( diff --git a/app/src/main/java/com/aiosman/ravenow/ui/account/removeaccount.kt b/app/src/main/java/com/aiosman/ravenow/ui/account/removeaccount.kt index 44bcab0..aefa02f 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/account/removeaccount.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/account/removeaccount.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -49,6 +50,14 @@ fun RemoveAccountScreen() { var passwordError by remember { mutableStateOf(null) } val scope = rememberCoroutineScope() val context = LocalContext.current + + // 暗色模式下的 hint 文本颜色 + val isDarkMode = AppState.darkMode + val hintColor = if (isDarkMode) { + Color(0xFFFFFFFF).copy(alpha = 0.7f) + } else { + null // 使用默认颜色 + } fun removeAccount(password: String) { // 使用通用密码校验器 @@ -132,7 +141,8 @@ fun RemoveAccountScreen() { }, password = true, hint = stringResource(R.string.remove_account_password_hint), - error = passwordError + error = passwordError, + customHintColor = hintColor ) Spacer(modifier = Modifier.weight(1f)) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AgentChatListScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AgentChatListScreen.kt index 636e662..52d8ea0 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AgentChatListScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AgentChatListScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -89,72 +90,70 @@ fun AgentChatListScreen() { .pullRefresh(state) ) { if (AgentChatListViewModel.agentChatList.isEmpty() && !AgentChatListViewModel.isLoading) { - // 空状态 - Column( + Box( modifier = Modifier .fillMaxSize() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - + .padding(horizontal = 16.dp), + contentAlignment = Alignment.Center ) { - val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) + // 空状态 + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.offset(y = (-40).dp) + ) { + val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) - if (isNetworkAvailable) { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_3), - contentDescription = "null data", - modifier = Modifier - .width(181.dp) - .height(153.dp) - ) - Spacer(modifier = Modifier.height(9.dp)) - Text( - text = stringResource(R.string.no_one_knocked_yet), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - } - else { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_10), - contentDescription = "network error", - modifier = Modifier - .size(181.dp) - ) - Spacer(modifier = Modifier.height(24.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_title), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_subtitle), - color = AppColors.secondaryText, - fontSize = 14.sp, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 3, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(16.dp)) - ReloadButton( - onClick = { - AgentChatListViewModel.refreshPager(context = context) - } - ) + if (isNetworkAvailable) { + Image( + painter = painterResource(id = R.mipmap.invalid_name_3), + contentDescription = "null data", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(R.string.no_one_knocked_yet), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } else { + Image( + painter = painterResource(id = R.mipmap.invalid_name_10), + contentDescription = "network error", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(24.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_title), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_subtitle), + color = AppColors.secondaryText, + fontSize = 14.sp, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(16.dp)) + ReloadButton( + onClick = { + AgentChatListViewModel.refreshPager(context = context) + } + ) + } } } } else { diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AllChatListScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AllChatListScreen.kt index b653640..ba2e2be 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AllChatListScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/AllChatListScreen.kt @@ -217,73 +217,73 @@ fun AllChatListScreen() { .pullRefresh(state) ) { if (allConversations.isEmpty() && !isLoading) { - Column( + Box( modifier = Modifier .fillMaxSize() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, + .padding(horizontal = 16.dp), + contentAlignment = Alignment.Center ) { - val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.offset(y = (-40).dp) + ) { + val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) - if (isNetworkAvailable) { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_3), - contentDescription = "null data", - modifier = Modifier - .width(181.dp) - .height(153.dp) - ) - Spacer(modifier = Modifier.height(9.dp)) - Text( - text = stringResource(R.string.no_one_knocked_yet), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - } else { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_10), - contentDescription = "network error", - modifier = Modifier - .size(181.dp) - ) - Spacer(modifier = Modifier.height(24.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_title), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_subtitle), - color = AppColors.secondaryText, - fontSize = 14.sp, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 3, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(16.dp)) - ReloadButton( - onClick = { - isLoading = true - // 重新加载所有类型的数据 - AgentChatListViewModel.refreshPager(context = context) - GroupChatListViewModel.refreshPager(context = context) - FriendChatListViewModel.refreshPager(context = context) - } - ) + if (isNetworkAvailable) { + Image( + painter = painterResource(id = R.mipmap.invalid_name_3), + contentDescription = "null data", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(R.string.no_one_knocked_yet), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } else { + Image( + painter = painterResource(id = R.mipmap.invalid_name_10), + contentDescription = "network error", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(24.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_title), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_subtitle), + color = AppColors.secondaryText, + fontSize = 14.sp, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(16.dp)) + ReloadButton( + onClick = { + isLoading = true + // 重新加载所有类型的数据 + AgentChatListViewModel.refreshPager(context = context) + GroupChatListViewModel.refreshPager(context = context) + FriendChatListViewModel.refreshPager(context = context) + } + ) + } } } } else { diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/FriendChatListScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/FriendChatListScreen.kt index 2736045..584fb96 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/FriendChatListScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/FriendChatListScreen.kt @@ -72,70 +72,69 @@ fun FriendChatListScreen() { .pullRefresh(state) ) { if (FriendChatListViewModel.friendChatList.isEmpty() && !FriendChatListViewModel.isLoading) { - Column( + Box( modifier = Modifier .fillMaxSize() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - //verticalArrangement = Arrangement.Center + .padding(horizontal = 16.dp), + contentAlignment = Alignment.Center ) { - val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.offset(y = (-40).dp) + ) { + val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) - if (isNetworkAvailable) { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_3), - contentDescription = "null data", - modifier = Modifier - .width(181.dp) - .height(153.dp) - ) - Spacer(modifier = Modifier.height(9.dp)) - Text( - text = stringResource(R.string.no_one_knocked_yet), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - }else { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_10), - contentDescription = "network error", - modifier = Modifier - .size(181.dp) - ) - Spacer(modifier = Modifier.height(24.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_title), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_subtitle), - color = AppColors.secondaryText, - fontSize = 14.sp, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 3, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(16.dp)) - ReloadButton( - onClick = { - FriendChatListViewModel.refreshPager(pullRefresh = true, context = context) - } - ) + if (isNetworkAvailable) { + Image( + painter = painterResource(id = R.mipmap.invalid_name_3), + contentDescription = "null data", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(R.string.no_one_knocked_yet), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } else { + Image( + painter = painterResource(id = R.mipmap.invalid_name_10), + contentDescription = "network error", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(24.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_title), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_subtitle), + color = AppColors.secondaryText, + fontSize = 14.sp, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(16.dp)) + ReloadButton( + onClick = { + FriendChatListViewModel.refreshPager(pullRefresh = true, context = context) + } + ) + } } } } else { diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/GroupChatListScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/GroupChatListScreen.kt index d6bd7b3..1e41b97 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/GroupChatListScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/message/tab/GroupChatListScreen.kt @@ -67,69 +67,69 @@ fun GroupChatListScreen() { .pullRefresh(state) ) { if (GroupChatListViewModel.groupChatList.isEmpty() && !GroupChatListViewModel.isLoading) { - Column( + Box( modifier = Modifier .fillMaxSize() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, + .padding(horizontal = 16.dp), + contentAlignment = Alignment.Center ) { - val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.offset(y = (-40).dp) + ) { + val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) - if (isNetworkAvailable) { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_3), - contentDescription = "null data", - modifier = Modifier - .width(181.dp) - .height(153.dp) - ) - Spacer(modifier = Modifier.height(9.dp)) - Text( - text = stringResource(R.string.no_one_knocked_yet), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - }else { - Spacer(modifier = Modifier.height(39.dp)) - Image( - painter = painterResource(id = R.mipmap.invalid_name_10), - contentDescription = "network error", - modifier = Modifier - .size(181.dp) - ) - Spacer(modifier = Modifier.height(24.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_title), - color = AppColors.text, - fontSize = 16.sp, - fontWeight = FontWeight.W600, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = stringResource(R.string.friend_chat_no_network_subtitle), - color = AppColors.secondaryText, - fontSize = 14.sp, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 24.dp), - maxLines = 3, - overflow = TextOverflow.Ellipsis - ) - Spacer(modifier = Modifier.height(16.dp)) - ReloadButton( - onClick = { - GroupChatListViewModel.refreshPager(context = context) - } - ) + if (isNetworkAvailable) { + Image( + painter = painterResource(id = R.mipmap.invalid_name_3), + contentDescription = "null data", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(R.string.no_one_knocked_yet), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } else { + Image( + painter = painterResource(id = R.mipmap.invalid_name_10), + contentDescription = "network error", + modifier = Modifier.size(120.dp) + ) + Spacer(modifier = Modifier.height(24.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_title), + color = AppColors.text, + fontSize = 16.sp, + fontWeight = FontWeight.W600, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.friend_chat_no_network_subtitle), + color = AppColors.secondaryText, + fontSize = 14.sp, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 24.dp), + maxLines = 3, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.height(16.dp)) + ReloadButton( + onClick = { + GroupChatListViewModel.refreshPager(context = context) + } + ) + } } } } else { diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/search/SearchViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/search/SearchViewModel.kt index 45920e4..9e4913a 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/search/SearchViewModel.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/search/SearchViewModel.kt @@ -19,6 +19,8 @@ import com.aiosman.ravenow.entity.MomentEntity import com.aiosman.ravenow.entity.MomentPagingSource import com.aiosman.ravenow.entity.MomentRemoteDataSource import com.aiosman.ravenow.entity.MomentServiceImpl +import com.aiosman.ravenow.event.MomentFavouriteChangeEvent +import com.aiosman.ravenow.event.MomentLikeChangeEvent import com.aiosman.ravenow.entity.AgentEntity import com.aiosman.ravenow.entity.AgentRemoteDataSource import com.aiosman.ravenow.entity.AgentSearchPagingSource @@ -31,6 +33,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import org.greenrobot.eventbus.EventBus object SearchViewModel : ViewModel() { var searchText by mutableStateOf("") @@ -204,7 +207,14 @@ object SearchViewModel : ViewModel() { suspend fun likeMoment(id: Int) { try { momentService.likeMoment(id) - updateMomentLike(id, true) + val likeCount = updateMomentLike(id, true) + EventBus.getDefault().post( + MomentLikeChangeEvent( + postId = id, + likeCount = likeCount, + isLike = true + ) + ) } catch (e: Exception) { e.printStackTrace() } @@ -213,7 +223,14 @@ object SearchViewModel : ViewModel() { suspend fun dislikeMoment(id: Int) { try { momentService.dislikeMoment(id) - updateMomentLike(id, false) + val likeCount = updateMomentLike(id, false) + EventBus.getDefault().post( + MomentLikeChangeEvent( + postId = id, + likeCount = likeCount, + isLike = false + ) + ) } catch (e: Exception) { e.printStackTrace() } @@ -223,6 +240,12 @@ object SearchViewModel : ViewModel() { try { momentService.favoriteMoment(id) updateMomentFavorite(id, true) + EventBus.getDefault().post( + MomentFavouriteChangeEvent( + postId = id, + isFavourite = true + ) + ) } catch (e: Exception) { e.printStackTrace() } @@ -232,6 +255,12 @@ object SearchViewModel : ViewModel() { try { momentService.unfavoriteMoment(id) updateMomentFavorite(id, false) + EventBus.getDefault().post( + MomentFavouriteChangeEvent( + postId = id, + isFavourite = false + ) + ) } catch (e: Exception) { e.printStackTrace() } @@ -241,19 +270,23 @@ object SearchViewModel : ViewModel() { updateMomentCommentCount(id, 1) } - private fun updateMomentLike(id: Int, isLike: Boolean) { + private fun updateMomentLike(id: Int, isLike: Boolean): Int? { + var latestLikeCount: Int? = null val currentPagingData = _momentsFlow.value val updatedPagingData = currentPagingData.map { momentItem -> if (momentItem.id == id) { + val nextCount = (momentItem.likeCount + if (isLike) 1 else -1).coerceAtLeast(0) + latestLikeCount = nextCount momentItem.copy( liked = isLike, - likeCount = momentItem.likeCount + if (isLike) 1 else -1 + likeCount = nextCount ) } else { momentItem } } _momentsFlow.value = updatedPagingData + return latestLikeCount } private fun updateMomentFavorite(id: Int, isFavorite: Boolean) { @@ -262,7 +295,7 @@ object SearchViewModel : ViewModel() { if (momentItem.id == id) { momentItem.copy( isFavorite = isFavorite, - favoriteCount = momentItem.favoriteCount + if (isFavorite) 1 else -1 + favoriteCount = (momentItem.favoriteCount + if (isFavorite) 1 else -1).coerceAtLeast(0) ) } else { momentItem