修复bug、暗色模式适配

-密码界面和删除账户界面暗色模式适配
-调整消息:所有Tab 分类下的缺省图和文案大小和位置
-修复给搜索到的帖子点赞或者收藏再退出搜索界面 去动态界面或者关注界面找到这个帖子点赞或者收藏后 点进这个帖子点赞或者收藏会变为双倍
This commit is contained in:
2025-11-20 18:50:55 +08:00
parent bd5079806b
commit 958d1c16be
7 changed files with 315 additions and 253 deletions

View File

@@ -16,9 +16,11 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue 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.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.aiosman.ravenow.AppState
import com.aiosman.ravenow.LocalAppTheme import com.aiosman.ravenow.LocalAppTheme
import com.aiosman.ravenow.LocalNavController import com.aiosman.ravenow.LocalNavController
import com.aiosman.ravenow.R import com.aiosman.ravenow.R
@@ -68,6 +70,19 @@ fun ChangePasswordScreen() {
var confirmPasswordError by remember { mutableStateOf<String?>(null) } var confirmPasswordError by remember { mutableStateOf<String?>(null) }
var passwordError by remember { mutableStateOf<String?>(null) } var passwordError by remember { mutableStateOf<String?>(null) }
val AppColors = LocalAppTheme.current 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 { fun validate(): Boolean {
// 使用通用密码校验器校验当前密码 // 使用通用密码校验器校验当前密码
val currentPasswordValidation = PasswordValidator.validateCurrentPassword(currentPassword, context) val currentPasswordValidation = PasswordValidator.validateCurrentPassword(currentPassword, context)
@@ -112,7 +127,9 @@ fun ChangePasswordScreen() {
password = true, password = true,
label = stringResource(R.string.current_password), label = stringResource(R.string.current_password),
hint = stringResource(R.string.current_password_tip5), hint = stringResource(R.string.current_password_tip5),
error = oldPasswordError error = oldPasswordError,
customHintColor = hintColor,
customLabelColor = labelColor
) )
Spacer(modifier = Modifier.height(4.dp)) Spacer(modifier = Modifier.height(4.dp))
TextInputField( TextInputField(
@@ -121,7 +138,9 @@ fun ChangePasswordScreen() {
password = true, password = true,
label = stringResource(R.string.new_password), label = stringResource(R.string.new_password),
hint = 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)) Spacer(modifier = Modifier.height(4.dp))
TextInputField( TextInputField(
@@ -130,7 +149,9 @@ fun ChangePasswordScreen() {
password = true, password = true,
label = stringResource(R.string.confirm_new_password_tip1), label = stringResource(R.string.confirm_new_password_tip1),
hint = stringResource(R.string.new_password_tip1), hint = stringResource(R.string.new_password_tip1),
error = confirmPasswordError error = confirmPasswordError,
customHintColor = hintColor,
customLabelColor = labelColor
) )
Spacer(modifier = Modifier.height(50.dp)) Spacer(modifier = Modifier.height(50.dp))
ActionButton( ActionButton(

View File

@@ -17,6 +17,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue 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.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@@ -49,6 +50,14 @@ fun RemoveAccountScreen() {
var passwordError by remember { mutableStateOf<String?>(null) } var passwordError by remember { mutableStateOf<String?>(null) }
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val context = LocalContext.current 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) { fun removeAccount(password: String) {
// 使用通用密码校验器 // 使用通用密码校验器
@@ -132,7 +141,8 @@ fun RemoveAccountScreen() {
}, },
password = true, password = true,
hint = stringResource(R.string.remove_account_password_hint), hint = stringResource(R.string.remove_account_password_hint),
error = passwordError error = passwordError,
customHintColor = hintColor
) )
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))

View File

@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
@@ -89,72 +90,70 @@ fun AgentChatListScreen() {
.pullRefresh(state) .pullRefresh(state)
) { ) {
if (AgentChatListViewModel.agentChatList.isEmpty() && !AgentChatListViewModel.isLoading) { if (AgentChatListViewModel.agentChatList.isEmpty() && !AgentChatListViewModel.isLoading) {
// 空状态 Box(
Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(16.dp), .padding(horizontal = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally, 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) { if (isNetworkAvailable) {
Spacer(modifier = Modifier.height(39.dp)) Image(
Image( painter = painterResource(id = R.mipmap.invalid_name_3),
painter = painterResource(id = R.mipmap.invalid_name_3), contentDescription = "null data",
contentDescription = "null data", modifier = Modifier.size(120.dp)
modifier = Modifier )
.width(181.dp) Spacer(modifier = Modifier.height(12.dp))
.height(153.dp) Text(
) text = stringResource(R.string.no_one_knocked_yet),
Spacer(modifier = Modifier.height(9.dp)) color = AppColors.text,
Text( fontSize = 16.sp,
text = stringResource(R.string.no_one_knocked_yet), fontWeight = FontWeight.W600,
color = AppColors.text, textAlign = TextAlign.Center,
fontSize = 16.sp, modifier = Modifier.padding(horizontal = 24.dp),
fontWeight = FontWeight.W600, maxLines = 2,
textAlign = TextAlign.Center, overflow = TextOverflow.Ellipsis
modifier = Modifier.padding(horizontal = 24.dp), )
maxLines = 2, } else {
overflow = TextOverflow.Ellipsis Image(
) painter = painterResource(id = R.mipmap.invalid_name_10),
} contentDescription = "network error",
else { modifier = Modifier.size(120.dp)
Spacer(modifier = Modifier.height(39.dp)) )
Image( Spacer(modifier = Modifier.height(24.dp))
painter = painterResource(id = R.mipmap.invalid_name_10), Text(
contentDescription = "network error", text = stringResource(R.string.friend_chat_no_network_title),
modifier = Modifier color = AppColors.text,
.size(181.dp) fontSize = 16.sp,
) fontWeight = FontWeight.W600,
Spacer(modifier = Modifier.height(24.dp)) textAlign = TextAlign.Center,
Text( modifier = Modifier.padding(horizontal = 24.dp),
text = stringResource(R.string.friend_chat_no_network_title), maxLines = 2,
color = AppColors.text, overflow = TextOverflow.Ellipsis
fontSize = 16.sp, )
fontWeight = FontWeight.W600, Spacer(modifier = Modifier.height(8.dp))
textAlign = TextAlign.Center, Text(
modifier = Modifier.padding(horizontal = 24.dp), text = stringResource(R.string.friend_chat_no_network_subtitle),
maxLines = 2, color = AppColors.secondaryText,
overflow = TextOverflow.Ellipsis fontSize = 14.sp,
) textAlign = TextAlign.Center,
Spacer(modifier = Modifier.height(8.dp)) modifier = Modifier.padding(horizontal = 24.dp),
Text( maxLines = 3,
text = stringResource(R.string.friend_chat_no_network_subtitle), overflow = TextOverflow.Ellipsis
color = AppColors.secondaryText, )
fontSize = 14.sp, Spacer(modifier = Modifier.height(16.dp))
textAlign = TextAlign.Center, ReloadButton(
modifier = Modifier.padding(horizontal = 24.dp), onClick = {
maxLines = 3, AgentChatListViewModel.refreshPager(context = context)
overflow = TextOverflow.Ellipsis }
) )
Spacer(modifier = Modifier.height(16.dp)) }
ReloadButton(
onClick = {
AgentChatListViewModel.refreshPager(context = context)
}
)
} }
} }
} else { } else {

View File

@@ -217,73 +217,73 @@ fun AllChatListScreen() {
.pullRefresh(state) .pullRefresh(state)
) { ) {
if (allConversations.isEmpty() && !isLoading) { if (allConversations.isEmpty() && !isLoading) {
Column( Box(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(16.dp), .padding(horizontal = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally, 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) { if (isNetworkAvailable) {
Spacer(modifier = Modifier.height(39.dp)) Image(
Image( painter = painterResource(id = R.mipmap.invalid_name_3),
painter = painterResource(id = R.mipmap.invalid_name_3), contentDescription = "null data",
contentDescription = "null data", modifier = Modifier.size(120.dp)
modifier = Modifier )
.width(181.dp) Spacer(modifier = Modifier.height(12.dp))
.height(153.dp) Text(
) text = stringResource(R.string.no_one_knocked_yet),
Spacer(modifier = Modifier.height(9.dp)) color = AppColors.text,
Text( fontSize = 16.sp,
text = stringResource(R.string.no_one_knocked_yet), fontWeight = FontWeight.W600,
color = AppColors.text, textAlign = TextAlign.Center,
fontSize = 16.sp, modifier = Modifier.padding(horizontal = 24.dp),
fontWeight = FontWeight.W600, maxLines = 2,
textAlign = TextAlign.Center, overflow = TextOverflow.Ellipsis
modifier = Modifier.padding(horizontal = 24.dp), )
maxLines = 2, } else {
overflow = TextOverflow.Ellipsis Image(
) painter = painterResource(id = R.mipmap.invalid_name_10),
} else { contentDescription = "network error",
Spacer(modifier = Modifier.height(39.dp)) modifier = Modifier.size(120.dp)
Image( )
painter = painterResource(id = R.mipmap.invalid_name_10), Spacer(modifier = Modifier.height(24.dp))
contentDescription = "network error", Text(
modifier = Modifier text = stringResource(R.string.friend_chat_no_network_title),
.size(181.dp) color = AppColors.text,
) fontSize = 16.sp,
Spacer(modifier = Modifier.height(24.dp)) fontWeight = FontWeight.W600,
Text( textAlign = TextAlign.Center,
text = stringResource(R.string.friend_chat_no_network_title), modifier = Modifier.padding(horizontal = 24.dp),
color = AppColors.text, maxLines = 2,
fontSize = 16.sp, overflow = TextOverflow.Ellipsis
fontWeight = FontWeight.W600, )
textAlign = TextAlign.Center, Spacer(modifier = Modifier.height(8.dp))
modifier = Modifier.padding(horizontal = 24.dp), Text(
maxLines = 2, text = stringResource(R.string.friend_chat_no_network_subtitle),
overflow = TextOverflow.Ellipsis color = AppColors.secondaryText,
) fontSize = 14.sp,
Spacer(modifier = Modifier.height(8.dp)) textAlign = TextAlign.Center,
Text( modifier = Modifier.padding(horizontal = 24.dp),
text = stringResource(R.string.friend_chat_no_network_subtitle), maxLines = 3,
color = AppColors.secondaryText, overflow = TextOverflow.Ellipsis
fontSize = 14.sp, )
textAlign = TextAlign.Center, Spacer(modifier = Modifier.height(16.dp))
modifier = Modifier.padding(horizontal = 24.dp), ReloadButton(
maxLines = 3, onClick = {
overflow = TextOverflow.Ellipsis isLoading = true
) // 重新加载所有类型的数据
Spacer(modifier = Modifier.height(16.dp)) AgentChatListViewModel.refreshPager(context = context)
ReloadButton( GroupChatListViewModel.refreshPager(context = context)
onClick = { FriendChatListViewModel.refreshPager(context = context)
isLoading = true }
// 重新加载所有类型的数据 )
AgentChatListViewModel.refreshPager(context = context) }
GroupChatListViewModel.refreshPager(context = context)
FriendChatListViewModel.refreshPager(context = context)
}
)
} }
} }
} else { } else {

View File

@@ -72,70 +72,69 @@ fun FriendChatListScreen() {
.pullRefresh(state) .pullRefresh(state)
) { ) {
if (FriendChatListViewModel.friendChatList.isEmpty() && !FriendChatListViewModel.isLoading) { if (FriendChatListViewModel.friendChatList.isEmpty() && !FriendChatListViewModel.isLoading) {
Column( Box(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(16.dp), .padding(horizontal = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally, contentAlignment = Alignment.Center
//verticalArrangement = Arrangement.Center
) { ) {
val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context) Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.offset(y = (-40).dp)
) {
val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context)
if (isNetworkAvailable) { if (isNetworkAvailable) {
Spacer(modifier = Modifier.height(39.dp)) Image(
Image( painter = painterResource(id = R.mipmap.invalid_name_3),
painter = painterResource(id = R.mipmap.invalid_name_3), contentDescription = "null data",
contentDescription = "null data", modifier = Modifier.size(120.dp)
modifier = Modifier )
.width(181.dp) Spacer(modifier = Modifier.height(12.dp))
.height(153.dp) Text(
) text = stringResource(R.string.no_one_knocked_yet),
Spacer(modifier = Modifier.height(9.dp)) color = AppColors.text,
Text( fontSize = 16.sp,
text = stringResource(R.string.no_one_knocked_yet), fontWeight = FontWeight.W600,
color = AppColors.text, textAlign = TextAlign.Center,
fontSize = 16.sp, modifier = Modifier.padding(horizontal = 24.dp),
fontWeight = FontWeight.W600, maxLines = 2,
textAlign = TextAlign.Center, overflow = TextOverflow.Ellipsis
modifier = Modifier.padding(horizontal = 24.dp), )
maxLines = 2, } else {
overflow = TextOverflow.Ellipsis Image(
) painter = painterResource(id = R.mipmap.invalid_name_10),
}else { contentDescription = "network error",
Spacer(modifier = Modifier.height(39.dp)) modifier = Modifier.size(120.dp)
Image( )
painter = painterResource(id = R.mipmap.invalid_name_10), Spacer(modifier = Modifier.height(24.dp))
contentDescription = "network error", Text(
modifier = Modifier text = stringResource(R.string.friend_chat_no_network_title),
.size(181.dp) color = AppColors.text,
) fontSize = 16.sp,
Spacer(modifier = Modifier.height(24.dp)) fontWeight = FontWeight.W600,
Text( textAlign = TextAlign.Center,
text = stringResource(R.string.friend_chat_no_network_title), modifier = Modifier.padding(horizontal = 24.dp),
color = AppColors.text, maxLines = 2,
fontSize = 16.sp, overflow = TextOverflow.Ellipsis
fontWeight = FontWeight.W600, )
textAlign = TextAlign.Center, Spacer(modifier = Modifier.height(8.dp))
modifier = Modifier.padding(horizontal = 24.dp), Text(
maxLines = 2, text = stringResource(R.string.friend_chat_no_network_subtitle),
overflow = TextOverflow.Ellipsis color = AppColors.secondaryText,
) fontSize = 14.sp,
Spacer(modifier = Modifier.height(8.dp)) textAlign = TextAlign.Center,
Text( modifier = Modifier.padding(horizontal = 24.dp),
text = stringResource(R.string.friend_chat_no_network_subtitle), maxLines = 3,
color = AppColors.secondaryText, overflow = TextOverflow.Ellipsis
fontSize = 14.sp, )
textAlign = TextAlign.Center, Spacer(modifier = Modifier.height(16.dp))
modifier = Modifier.padding(horizontal = 24.dp), ReloadButton(
maxLines = 3, onClick = {
overflow = TextOverflow.Ellipsis FriendChatListViewModel.refreshPager(pullRefresh = true, context = context)
) }
Spacer(modifier = Modifier.height(16.dp)) )
ReloadButton( }
onClick = {
FriendChatListViewModel.refreshPager(pullRefresh = true, context = context)
}
)
} }
} }
} else { } else {

View File

@@ -67,69 +67,69 @@ fun GroupChatListScreen() {
.pullRefresh(state) .pullRefresh(state)
) { ) {
if (GroupChatListViewModel.groupChatList.isEmpty() && !GroupChatListViewModel.isLoading) { if (GroupChatListViewModel.groupChatList.isEmpty() && !GroupChatListViewModel.isLoading) {
Column( Box(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(16.dp), .padding(horizontal = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally, 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) { if (isNetworkAvailable) {
Spacer(modifier = Modifier.height(39.dp)) Image(
Image( painter = painterResource(id = R.mipmap.invalid_name_3),
painter = painterResource(id = R.mipmap.invalid_name_3), contentDescription = "null data",
contentDescription = "null data", modifier = Modifier.size(120.dp)
modifier = Modifier )
.width(181.dp) Spacer(modifier = Modifier.height(12.dp))
.height(153.dp) Text(
) text = stringResource(R.string.no_one_knocked_yet),
Spacer(modifier = Modifier.height(9.dp)) color = AppColors.text,
Text( fontSize = 16.sp,
text = stringResource(R.string.no_one_knocked_yet), fontWeight = FontWeight.W600,
color = AppColors.text, textAlign = TextAlign.Center,
fontSize = 16.sp, modifier = Modifier.padding(horizontal = 24.dp),
fontWeight = FontWeight.W600, maxLines = 2,
textAlign = TextAlign.Center, overflow = TextOverflow.Ellipsis
modifier = Modifier.padding(horizontal = 24.dp), )
maxLines = 2, } else {
overflow = TextOverflow.Ellipsis Image(
) painter = painterResource(id = R.mipmap.invalid_name_10),
}else { contentDescription = "network error",
Spacer(modifier = Modifier.height(39.dp)) modifier = Modifier.size(120.dp)
Image( )
painter = painterResource(id = R.mipmap.invalid_name_10), Spacer(modifier = Modifier.height(24.dp))
contentDescription = "network error", Text(
modifier = Modifier text = stringResource(R.string.friend_chat_no_network_title),
.size(181.dp) color = AppColors.text,
) fontSize = 16.sp,
Spacer(modifier = Modifier.height(24.dp)) fontWeight = FontWeight.W600,
Text( textAlign = TextAlign.Center,
text = stringResource(R.string.friend_chat_no_network_title), modifier = Modifier.padding(horizontal = 24.dp),
color = AppColors.text, maxLines = 2,
fontSize = 16.sp, overflow = TextOverflow.Ellipsis
fontWeight = FontWeight.W600, )
textAlign = TextAlign.Center, Spacer(modifier = Modifier.height(8.dp))
modifier = Modifier.padding(horizontal = 24.dp), Text(
maxLines = 2, text = stringResource(R.string.friend_chat_no_network_subtitle),
overflow = TextOverflow.Ellipsis color = AppColors.secondaryText,
) fontSize = 14.sp,
Spacer(modifier = Modifier.height(8.dp)) textAlign = TextAlign.Center,
Text( modifier = Modifier.padding(horizontal = 24.dp),
text = stringResource(R.string.friend_chat_no_network_subtitle), maxLines = 3,
color = AppColors.secondaryText, overflow = TextOverflow.Ellipsis
fontSize = 14.sp, )
textAlign = TextAlign.Center, Spacer(modifier = Modifier.height(16.dp))
modifier = Modifier.padding(horizontal = 24.dp), ReloadButton(
maxLines = 3, onClick = {
overflow = TextOverflow.Ellipsis GroupChatListViewModel.refreshPager(context = context)
) }
Spacer(modifier = Modifier.height(16.dp)) )
ReloadButton( }
onClick = {
GroupChatListViewModel.refreshPager(context = context)
}
)
} }
} }
} else { } else {

View File

@@ -19,6 +19,8 @@ import com.aiosman.ravenow.entity.MomentEntity
import com.aiosman.ravenow.entity.MomentPagingSource import com.aiosman.ravenow.entity.MomentPagingSource
import com.aiosman.ravenow.entity.MomentRemoteDataSource import com.aiosman.ravenow.entity.MomentRemoteDataSource
import com.aiosman.ravenow.entity.MomentServiceImpl 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.AgentEntity
import com.aiosman.ravenow.entity.AgentRemoteDataSource import com.aiosman.ravenow.entity.AgentRemoteDataSource
import com.aiosman.ravenow.entity.AgentSearchPagingSource import com.aiosman.ravenow.entity.AgentSearchPagingSource
@@ -31,6 +33,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
object SearchViewModel : ViewModel() { object SearchViewModel : ViewModel() {
var searchText by mutableStateOf("") var searchText by mutableStateOf("")
@@ -204,7 +207,14 @@ object SearchViewModel : ViewModel() {
suspend fun likeMoment(id: Int) { suspend fun likeMoment(id: Int) {
try { try {
momentService.likeMoment(id) momentService.likeMoment(id)
updateMomentLike(id, true) val likeCount = updateMomentLike(id, true)
EventBus.getDefault().post(
MomentLikeChangeEvent(
postId = id,
likeCount = likeCount,
isLike = true
)
)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
@@ -213,7 +223,14 @@ object SearchViewModel : ViewModel() {
suspend fun dislikeMoment(id: Int) { suspend fun dislikeMoment(id: Int) {
try { try {
momentService.dislikeMoment(id) momentService.dislikeMoment(id)
updateMomentLike(id, false) val likeCount = updateMomentLike(id, false)
EventBus.getDefault().post(
MomentLikeChangeEvent(
postId = id,
likeCount = likeCount,
isLike = false
)
)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
@@ -223,6 +240,12 @@ object SearchViewModel : ViewModel() {
try { try {
momentService.favoriteMoment(id) momentService.favoriteMoment(id)
updateMomentFavorite(id, true) updateMomentFavorite(id, true)
EventBus.getDefault().post(
MomentFavouriteChangeEvent(
postId = id,
isFavourite = true
)
)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
@@ -232,6 +255,12 @@ object SearchViewModel : ViewModel() {
try { try {
momentService.unfavoriteMoment(id) momentService.unfavoriteMoment(id)
updateMomentFavorite(id, false) updateMomentFavorite(id, false)
EventBus.getDefault().post(
MomentFavouriteChangeEvent(
postId = id,
isFavourite = false
)
)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
@@ -241,19 +270,23 @@ object SearchViewModel : ViewModel() {
updateMomentCommentCount(id, 1) 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 currentPagingData = _momentsFlow.value
val updatedPagingData = currentPagingData.map { momentItem -> val updatedPagingData = currentPagingData.map { momentItem ->
if (momentItem.id == id) { if (momentItem.id == id) {
val nextCount = (momentItem.likeCount + if (isLike) 1 else -1).coerceAtLeast(0)
latestLikeCount = nextCount
momentItem.copy( momentItem.copy(
liked = isLike, liked = isLike,
likeCount = momentItem.likeCount + if (isLike) 1 else -1 likeCount = nextCount
) )
} else { } else {
momentItem momentItem
} }
} }
_momentsFlow.value = updatedPagingData _momentsFlow.value = updatedPagingData
return latestLikeCount
} }
private fun updateMomentFavorite(id: Int, isFavorite: Boolean) { private fun updateMomentFavorite(id: Int, isFavorite: Boolean) {
@@ -262,7 +295,7 @@ object SearchViewModel : ViewModel() {
if (momentItem.id == id) { if (momentItem.id == id) {
momentItem.copy( momentItem.copy(
isFavorite = isFavorite, isFavorite = isFavorite,
favoriteCount = momentItem.favoriteCount + if (isFavorite) 1 else -1 favoriteCount = (momentItem.favoriteCount + if (isFavorite) 1 else -1).coerceAtLeast(0)
) )
} else { } else {
momentItem momentItem