From cfe5ce8102ba8b6f3a963abd0558fece59069d2c Mon Sep 17 00:00:00 2001 From: zhong <2724770085@qq.com> Date: Wed, 26 Nov 2025 18:45:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E7=95=8C=E9=9D=A2UI?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E4=BF=AE=E5=A4=8DBUG=EF=BC=9A=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E7=95=8C=E9=9D=A2=E7=B3=BB=E7=BB=9F=E6=A0=8F=E7=A9=BA?= =?UTF-8?q?=E7=99=BD=E5=8C=BA=E5=9F=9F=E8=B0=83=E6=95=B4=E5=90=88=E9=80=82?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=EF=BC=8C=E7=BB=9F=E4=B8=80=E7=82=B9=E8=B5=9E?= =?UTF-8?q?/=E7=B2=89=E4=B8=9D/=E8=AF=84=E8=AE=BA3=E4=B8=AA=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E6=B6=88=E6=81=AF=E9=95=BF=E5=AE=BD=E5=92=8C?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/comment/notice/CommentNotice.kt | 94 +++---- .../ravenow/ui/follower/FollowerNotice.kt | 59 ++-- .../com/aiosman/ravenow/ui/like/LikePage.kt | 263 +++++++++--------- .../ravenow/ui/notification/Notification.kt | 2 +- app/src/main/res/values-ja/strings.xml | 2 + app/src/main/res/values-zh/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 7 files changed, 227 insertions(+), 197 deletions(-) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt b/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt index fcffc06..cbafd30 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt @@ -41,9 +41,8 @@ import com.aiosman.ravenow.R import com.aiosman.ravenow.entity.CommentEntity import com.aiosman.ravenow.exp.timeAgo import com.aiosman.ravenow.ui.NavigationRoute -import com.aiosman.ravenow.ui.comment.NoticeScreenHeader import com.aiosman.ravenow.ui.composables.CustomAsyncImage -import com.aiosman.ravenow.ui.composables.StatusBarSpacer +import com.aiosman.ravenow.ui.composables.StatusBarMaskLayout import com.aiosman.ravenow.ui.modifiers.noRippleClickable import com.aiosman.ravenow.ui.navigateToPost import kotlinx.coroutines.launch @@ -68,10 +67,14 @@ fun CommentNoticeScreen(includeStatusBarPadding: Boolean = true){ val navController = LocalNavController.current val AppColors = LocalAppTheme.current - Column( - modifier = Modifier.fillMaxSize().background(color = AppColors.background) + StatusBarMaskLayout( + modifier = Modifier + .background(color = AppColors.background) + .padding(horizontal = 16.dp), + darkIcons = !AppState.darkMode, + maskBoxBackgroundColor = AppColors.background, + includeStatusBarPadding = includeStatusBarPadding ) { - StatusBarSpacer() val isNetworkAvailable = NetworkUtils.isNetworkAvailable(LocalContext.current) if (!isNetworkAvailable) { @@ -109,7 +112,8 @@ fun CommentNoticeScreen(includeStatusBarPadding: Boolean = true){ } else { LazyColumn( modifier = Modifier - .fillMaxSize().padding(horizontal = 16.dp) + .weight(1f) + .background(color = AppColors.background) ) { items(comments.itemCount) { index -> comments[index]?.let { comment -> @@ -183,55 +187,58 @@ fun CommentNoticeItem( val navController = LocalNavController.current val context = LocalContext.current val AppColors = LocalAppTheme.current + val commentPrefix = stringResource(R.string.comment_notice) Row( - modifier = Modifier.padding(vertical = 20.dp, horizontal = 16.dp) + modifier = Modifier.padding(vertical = 12.dp) ) { - Box { - CustomAsyncImage( - context = context, - imageUrl = commentItem.avatar, - contentDescription = commentItem.name, - modifier = Modifier - .size(48.dp) - .clip(CircleShape) - .noRippleClickable { - navController.navigate( - NavigationRoute.AccountProfile.route.replace( - "{id}", - commentItem.author.toString() - ) + // 左侧头像区域 + CustomAsyncImage( + context = context, + imageUrl = commentItem.avatar, + contentDescription = commentItem.name, + modifier = Modifier + .size(40.dp) + .clip(CircleShape) + .noRippleClickable { + navController.navigate( + NavigationRoute.AccountProfile.route.replace( + "{id}", + commentItem.author.toString() ) - } - ) - } + ) + } + ) + + // 右侧内容区域 Row( modifier = Modifier .weight(1f) - .padding(start = 12.dp) + .padding(start = 8.dp) .noRippleClickable { onPostClick() } ) { + // 主要信息列 Column( modifier = Modifier.weight(1f) ) { Text( text = commentItem.name, - fontSize = 18.sp, - modifier = Modifier, + fontSize = 14.sp, color = AppColors.text, maxLines = 1, overflow = TextOverflow.Ellipsis ) Spacer(modifier = Modifier.height(4.dp)) + // 评论内容行 Row { var text = commentItem.comment if (commentItem.parentCommentId != null) { text = "Reply you: $text" } Text( - text = text, + text = "$commentPrefix $text", fontSize = 14.sp, maxLines = 1, color = AppColors.secondaryText, @@ -245,25 +252,20 @@ fun CommentNoticeItem( color = AppColors.secondaryText, ) } - } - Spacer(modifier = Modifier.width(24.dp)) + Spacer(modifier = Modifier.width(4.dp)) + // 右侧帖子图片 commentItem.post?.let { Box { - Box( - modifier = Modifier.padding(4.dp) - ) { - CustomAsyncImage( - context = context, - imageUrl = it.images[0].thumbnail, - contentDescription = "Post Image", - modifier = Modifier - .size(48.dp).clip(RoundedCornerShape(8.dp)) - ) - // unread indicator - - } - + CustomAsyncImage( + context = context, + imageUrl = it.images[0].thumbnail, + contentDescription = "Post Image", + modifier = Modifier + .size(40.dp) + .clip(RoundedCornerShape(8.dp)) + ) + // 未读指示器 if (commentItem.unread) { Box( modifier = Modifier @@ -273,11 +275,7 @@ fun CommentNoticeItem( ) } } - - } } - - } } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt b/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt index d4be489..c639f27 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt @@ -141,42 +141,57 @@ fun FollowItem( val AppColors = LocalAppTheme.current val context = LocalContext.current val navController = LocalNavController.current - Box( + val followText = stringResource(R.string.followed_you) + + Row( modifier = Modifier - .padding(vertical = 16.dp) - .noRippleClickable { - navController.navigate( - NavigationRoute.AccountProfile.route.replace( - "{id}", - userId.toString() - ) - ) - } + .fillMaxWidth() + .padding(vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically ) { + // 左侧头像区域 + CustomAsyncImage( + context = context, + imageUrl = avatar, + contentDescription = nickname, + modifier = Modifier + .size(40.dp) + .clip(CircleShape) + .noRippleClickable { + navController.navigate( + NavigationRoute.AccountProfile.route.replace( + "{id}", + userId.toString() + ) + ) + } + ) + // 右侧内容区域 Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .weight(1f) + .padding(start = 8.dp), + verticalAlignment = Alignment.CenterVertically ) { - CustomAsyncImage( - context = context, - imageUrl = avatar, - contentDescription = nickname, - modifier = Modifier - .size(40.dp) - .clip(CircleShape) - ) - Spacer(modifier = Modifier.width(12.dp)) Column( modifier = Modifier.weight(1f) ) { Text( text = nickname, fontWeight = FontWeight.Bold, - fontSize = 16.sp, + fontSize = 14.sp, color = AppColors.text, maxLines = 1, overflow = TextOverflow.Ellipsis ) + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = followText, + fontSize = 14.sp, + color = AppColors.secondaryText, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) } if (!isFollowing && userId != AppState.UserId) { FollowButton( diff --git a/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt b/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt index 190d4cf..c3581a2 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt @@ -155,64 +155,83 @@ fun ActionPostNoticeItem( val navController = LocalNavController.current val AppColors = LocalAppTheme.current - Box( - modifier = Modifier.padding(vertical = 16.dp) + val actionLabel = when (action) { + "favourite" -> stringResource(R.string.favourite_your_post) + else -> stringResource(R.string.like_your_post) + } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 12.dp, horizontal = 0.dp), + verticalAlignment = Alignment.CenterVertically ) { + CustomAsyncImage( + context = context, + imageUrl = avatar, + modifier = Modifier + .size(40.dp) + .clip(CircleShape) + .noRippleClickable { + navController.navigate( + NavigationRoute.AccountProfile.route.replace( + "{id}", + userId.toString() + ) + ) + }, + contentDescription = action, + ) Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.Top, + modifier = Modifier + .weight(1f) + .padding(start = 8.dp) + .noRippleClickable { + navController.navigateToPost( + id = postId, + highlightCommentId = 0, + initImagePagerIndex = 0 + ) + }, + verticalAlignment = Alignment.CenterVertically ) { - CustomAsyncImage( - context, - imageUrl = avatar, - modifier = Modifier - .size(48.dp) - .clip(CircleShape) - .noRippleClickable { - navController.navigate( - NavigationRoute.AccountProfile.route.replace( - "{id}", - userId.toString() - ) - ) - }, - contentDescription = action, - ) - Spacer(modifier = Modifier.width(12.dp)) Column( - modifier = Modifier - .weight(1f) - .noRippleClickable { - navController.navigateToPost( - id = postId, - highlightCommentId = 0, - initImagePagerIndex = 0 - ) - } + modifier = Modifier.weight(1f) ) { Text( text = nickName, fontWeight = FontWeight.Bold, - fontSize = 16.sp, + fontSize = 14.sp, color = AppColors.text, maxLines = 1, overflow = TextOverflow.Ellipsis ) - Spacer(modifier = Modifier.height(2.dp)) - when (action) { - "like" -> Text(stringResource(R.string.like_your_post), color = AppColors.text) - "favourite" -> Text(stringResource(R.string.favourite_your_post), color = AppColors.text) - } - Spacer(modifier = Modifier.height(2.dp)) - Row { - Text(likeTime.timeAgo(context), fontSize = 12.sp, color = AppColors.secondaryText) + Spacer(modifier = Modifier.height(4.dp)) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = actionLabel, + fontSize = 14.sp, + color = AppColors.secondaryText, + modifier = Modifier.weight(1f), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = likeTime.timeAgo(context), + fontSize = 14.sp, + color = AppColors.secondaryText + ) } } + Spacer(modifier = Modifier.width(4.dp)) CustomAsyncImage( - context, + context = context, imageUrl = thumbnail, modifier = Modifier - .size(48.dp) + .size(40.dp) .clip(RoundedCornerShape(8.dp)), contentDescription = action, ) @@ -227,10 +246,11 @@ fun LikeCommentNoticeItem( val navController = LocalNavController.current val context = LocalContext.current val AppColors = LocalAppTheme.current + val previewPost = item.comment?.replyComment?.post ?: item.comment?.post - Box( + Column( modifier = Modifier - .padding(vertical = 16.dp) + .padding(vertical = 12.dp) .noRippleClickable { item.comment?.postId.let { navController.navigateToPost( @@ -241,112 +261,103 @@ fun LikeCommentNoticeItem( } } ) { - Row { - Column( - modifier = Modifier.weight(1f) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + CustomAsyncImage( + imageUrl = item.user.avatar, + modifier = Modifier + .size(40.dp) + .clip(CircleShape), + contentDescription = stringResource(R.string.like_your_comment) + ) + Row( + modifier = Modifier + .weight(1f) + .padding(start = 8.dp), + verticalAlignment = Alignment.CenterVertically ) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.Top, + Column( + modifier = Modifier.weight(1f) ) { - CustomAsyncImage( - imageUrl = item.user.avatar, - modifier = Modifier - .size(48.dp) - .clip(CircleShape), - contentDescription = stringResource(R.string.like_your_comment) + Text( + text = item.user.nickName, + fontWeight = FontWeight.Bold, + fontSize = 14.sp, + color = AppColors.text, + maxLines = 1, + overflow = TextOverflow.Ellipsis ) - Spacer(modifier = Modifier.width(12.dp)) - Column( - modifier = Modifier - .weight(1f) + Spacer(modifier = Modifier.height(4.dp)) + Row( + verticalAlignment = Alignment.CenterVertically ) { Text( - text = item.user.nickName, - fontWeight = FontWeight.Bold, - fontSize = 16.sp, - color = AppColors.text, + text = stringResource(R.string.like_your_comment), + fontSize = 14.sp, + color = AppColors.secondaryText, + modifier = Modifier.weight(1f), maxLines = 1, overflow = TextOverflow.Ellipsis ) - Spacer(modifier = Modifier.height(2.dp)) - Text(stringResource(R.string.like_your_comment), color = AppColors.text) - Spacer(modifier = Modifier.height(2.dp)) - Row { - Text( - item.likeTime.timeAgo(context), - fontSize = 12.sp, - color = AppColors.secondaryText - ) - } - } - } - Spacer(modifier = Modifier.height(12.dp)) - Row( - modifier = Modifier.padding(start = 48.dp) - ) { - Box( - modifier = Modifier - .size(24.dp) - .background(Color.Gray.copy(alpha = 0.1f)) - ) { - CustomAsyncImage( - context = context, - imageUrl = AppState.profile?.avatar ?: "", - contentDescription = "Comment Profile Picture", - modifier = Modifier - .size(24.dp) - .clip(RoundedCornerShape(24.dp)), - contentScale = ContentScale.Crop - ) - } - Spacer(modifier = Modifier.width(8.dp)) - Column( - modifier = Modifier.weight(1f) - ) { + Spacer(modifier = Modifier.width(4.dp)) Text( - text = AppState.profile?.nickName ?: "", - fontWeight = FontWeight.W600, + text = item.likeTime.timeAgo(context), fontSize = 14.sp, - color = AppColors.text - ) - Text( - text = item.comment?.content ?: "", - fontSize = 12.sp, - color = AppColors.secondaryText, - maxLines = 2 + color = AppColors.secondaryText ) } } - } - Spacer(modifier = Modifier.width(16.dp)) - if (item.comment?.replyComment?.post != null) { - item.comment.replyComment.post.let { + Spacer(modifier = Modifier.width(4.dp)) + previewPost?.let { CustomAsyncImage( context = context, imageUrl = it.images[0].thumbnail, contentDescription = "Post Thumbnail", modifier = Modifier - .size(48.dp) - .clip(RoundedCornerShape(8.dp)), - contentScale = ContentScale.Crop - ) - } - } else { - item.comment?.post?.let { - CustomAsyncImage( - context = context, - imageUrl = it.images[0].thumbnail, - contentDescription = "Post Thumbnail", - modifier = Modifier - .size(48.dp) + .size(40.dp) .clip(RoundedCornerShape(8.dp)), contentScale = ContentScale.Crop ) } } - - + } + Spacer(modifier = Modifier.height(8.dp)) + Row( + modifier = Modifier.padding(start = 48.dp) + ) { + Box( + modifier = Modifier + .size(24.dp) + .background(Color.Gray.copy(alpha = 0.1f)) + ) { + CustomAsyncImage( + context = context, + imageUrl = AppState.profile?.avatar ?: "", + contentDescription = "Comment Profile Picture", + modifier = Modifier + .size(24.dp) + .clip(RoundedCornerShape(24.dp)), + contentScale = ContentScale.Crop + ) + } + Spacer(modifier = Modifier.width(8.dp)) + Column( + modifier = Modifier.weight(1f) + ) { + Text( + text = AppState.profile?.nickName ?: "", + fontWeight = FontWeight.W600, + fontSize = 14.sp, + color = AppColors.text + ) + Text( + text = item.comment?.content ?: "", + fontSize = 12.sp, + color = AppColors.secondaryText, + maxLines = 2 + ) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt b/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt index 20dbf7c..7f9e39a 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt @@ -107,7 +107,7 @@ fun NotificationScreen() { TabSpacer() TabItem( - text = stringResource(R.string.followers_upper), + text = stringResource(R.string.follow_upper), isSelected = pagerState.currentPage == 1, onClick = { scope.launch { diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c7bd3a3..5287f98 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -75,6 +75,7 @@ 署名 名前 コメント + コメント: デフォルト 最新 最も古い @@ -102,6 +103,7 @@ Rave Nowのプライバシーポリシー ギャラリー チャット + フォローしました あなたの投稿にいいねしました あなたの投稿をお気に入りにしました あなたのコメントにいいねしました diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 9e10ddd..1e0f616 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -80,6 +80,7 @@ 个性签名 昵称 评论 + 评论: 默认 最新 最早 @@ -107,6 +108,7 @@ 用户协议 图片 私信 + 关注了你 喜欢了你的动态 收藏了你的动态 喜欢了你的评论 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 845bec5..80bb713 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,6 +74,7 @@ Signature Name COMMENTS + commented: Default Latest Earliest @@ -101,6 +102,7 @@ Rave Now’s Privacy Policy Gallery CHAT + followed you Like your post Favourite your post Like your comment From 084eb7bb52550e297fa966f5db0304ada782b5a0 Mon Sep 17 00:00:00 2001 From: zhong <2724770085@qq.com> Date: Thu, 27 Nov 2025 18:57:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=8F=91=E9=80=81=E6=8C=89=E9=92=AE=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=EF=BC=9B=20=E4=BF=AE=E5=A4=8D=E7=BE=A4=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E7=95=8C=E9=9D=A2=E9=A1=B6=E9=83=A8=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=BE=A4=E5=A4=B4=E5=83=8F=E4=BB=A5=E5=8F=8A=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=BC=82=E5=B8=B8=E6=98=BE=E7=A4=BA=EF=BC=9B=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BE=A4=E8=81=8A=E4=BF=A1=E6=81=AF=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E7=BE=A4=E8=AE=B0=E5=BF=86UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiosman/ravenow/ui/chat/ChatAiScreen.kt | 2 +- .../com/aiosman/ravenow/ui/chat/ChatScreen.kt | 2 +- .../ravenow/ui/chat/GroupChatScreen.kt | 71 ++++++------------- .../ravenow/ui/chat/GroupChatViewModel.kt | 53 +++++++++++--- .../ravenow/ui/group/GroupChatInfoScreen.kt | 8 ++- 5 files changed, 71 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt index 1dbd4f6..5ef8399 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt @@ -617,7 +617,7 @@ fun ChatAiInput( animationSpec = tween(300) ) Image( - painter = painterResource(R.mipmap.rider_pro_im_send), + painter = painterResource(R.mipmap.btn), modifier = Modifier .size(24.dp) .alpha(alpha) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt index c8cf846..981a2fc 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt @@ -650,7 +650,7 @@ fun ChatInput( animationSpec = tween(300) ) Image( - painter = painterResource(R.mipmap.rider_pro_im_send), + painter = painterResource(R.mipmap.btn), modifier = Modifier .size(24.dp) .alpha(alpha) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt index 6845ff6..01f1724 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt @@ -182,46 +182,22 @@ fun GroupChatScreen(groupId: String,name: String,avatar: String,) { colorFilter = ColorFilter.tint(AppColors.text) ) Spacer(modifier = Modifier.width(16.dp)) - - if (viewModel.groupAvatar.isNotEmpty()) { + + if (viewModel.groupInfo?.groupAvatar?.isNotEmpty() == true) { CustomAsyncImage( - imageUrl = viewModel.groupAvatar, + imageUrl = viewModel.groupInfo!!.groupAvatar, modifier = Modifier - .size(32.dp) - .clip(RoundedCornerShape(8.dp)) - .noRippleClickable { - navController.navigateToGroupInfo(groupId) - }, + .size(35.dp) + .clip(RoundedCornerShape(15.dp)), contentDescription = "群聊头像" ) - } else { - Box( - modifier = Modifier - .size(24.dp) - .clip(RoundedCornerShape(8.dp)) - .background(AppColors.decentBackground) - .noRippleClickable { - navController.navigateToGroupInfo(groupId) - }, - contentAlignment = Alignment.Center - ) { - Text( - text = viewModel.groupName, - style = TextStyle( - color = AppColors.text, - fontSize = 18.sp, - - fontWeight = androidx.compose.ui.text.font.FontWeight.W700 - ), - maxLines = 1, - overflow =TextOverflow.Ellipsis, - - ) - } } Spacer(modifier = Modifier.width(8.dp)) - Column { + Column( + modifier = Modifier.weight(1f), + horizontalAlignment = Alignment.Start + ) { Text( text = viewModel.groupName, style = TextStyle( @@ -229,24 +205,21 @@ fun GroupChatScreen(groupId: String,name: String,avatar: String,) { fontSize = 18.sp, fontWeight = androidx.compose.ui.text.font.FontWeight.Bold ), - maxLines = 1, - overflow =TextOverflow.Ellipsis, + maxLines = 1, + overflow = TextOverflow.Ellipsis ) } - Spacer(modifier = Modifier.weight(1f)) - Box { - Image( - painter = painterResource(R.drawable.rider_pro_more_horizon), - modifier = Modifier - .size(28.dp) - .noRippleClickable { - navController.navigateToGroupInfo(groupId) - }, - contentDescription = null, - colorFilter = ColorFilter.tint(AppColors.text) - ) - } + Image( + painter = painterResource(R.drawable.rider_pro_more_horizon), + modifier = Modifier + .size(28.dp) + .noRippleClickable { + navController.navigateToGroupInfo(groupId) + }, + contentDescription = "更多", + colorFilter = ColorFilter.tint(AppColors.text) + ) } } }, @@ -677,7 +650,7 @@ fun GroupChatInput( animationSpec = tween(300) ) Image( - painter = painterResource(R.mipmap.rider_pro_im_send), + painter = painterResource(R.mipmap.btn), modifier = Modifier .size(24.dp) .alpha(alpha) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt index c64a773..38abb0b 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt @@ -1,11 +1,13 @@ package com.aiosman.ravenow.ui.chat import android.content.Context +import android.util.Base64 import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.viewModelScope +import com.aiosman.ravenow.AppStore import com.aiosman.ravenow.data.api.ApiClient import com.aiosman.ravenow.data.api.SendChatAiRequestBody import io.openim.android.sdk.enums.ConversationType @@ -50,17 +52,46 @@ class GroupChatViewModel( } private suspend fun getGroupInfo() { - // 简化群组信息获取,使用默认信息 - groupInfo = GroupInfo( - groupId = groupId, - groupName = name, - groupAvatar = avatar, - memberCount = 0, - ownerId = "" - ) - groupName = groupInfo?.groupName ?: "" - groupAvatar = groupInfo?.groupAvatar ?: "" - memberCount = groupInfo?.memberCount ?: 0 + try { + val response = ApiClient.api.getRoomDetail(trtcId = groupId) + val room = response.body()?.data + groupInfo = room?.let { + GroupInfo( + groupId = groupId, + groupName = it.name, + groupAvatar = if (it.avatar.isNullOrEmpty()) { + val groupIdBase64 = Base64.encodeToString( + groupId.toByteArray(), + Base64.NO_WRAP + ) + "${ApiClient.RETROFIT_URL}group/avatar?groupIdBase64=$groupIdBase64&token=${AppStore.token}" + } else { + "${ApiClient.BASE_API_URL}/outside${it.avatar}?token=${AppStore.token}" + }, + memberCount = it.userCount, + ownerId = it.creator.userId + ) + } ?: GroupInfo( + groupId = groupId, + groupName = name, + groupAvatar = avatar, + memberCount = 0, + ownerId = "" + ) + } catch (e: Exception) { + Log.e("GroupChatViewModel", "加载群信息失败: ${e.message}", e) + groupInfo = GroupInfo( + groupId = groupId, + groupName = name, + groupAvatar = avatar, + memberCount = 0, + ownerId = "" + ) + } finally { + groupName = groupInfo?.groupName ?: "" + groupAvatar = groupInfo?.groupAvatar ?: "" + memberCount = groupInfo?.memberCount ?: 0 + } } override fun getConversationParams(): Triple { diff --git a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt index 3bb6e71..fa30f92 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt @@ -2,6 +2,7 @@ package com.aiosman.ravenow.ui.group import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -302,8 +303,9 @@ fun GroupChatInfoScreen(groupId: String) { Column( modifier = Modifier .fillMaxWidth() + .border(1.dp, AppColors.decentBackground, RoundedCornerShape(12.dp)) .clip(RoundedCornerShape(12.dp)) - .background(AppColors.decentBackground.copy(alpha = 0.28f)) + .background(AppColors.background) .padding(12.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { @@ -340,7 +342,7 @@ fun GroupChatInfoScreen(groupId: String) { modifier = Modifier .weight(1f) .clip(RoundedCornerShape(20.dp)) - .background(AppColors.background) + .background(AppColors.decentBackground) .padding(vertical = 8.dp) .noRippleClickable { showAddMemoryDialog = true @@ -359,7 +361,7 @@ fun GroupChatInfoScreen(groupId: String) { modifier = Modifier .weight(1f) .clip(RoundedCornerShape(20.dp)) - .background(AppColors.background) + .background(AppColors.decentBackground) .padding(vertical = 8.dp) .noRippleClickable { showMemoryManageDialog = true