diff --git a/app/src/main/java/com/aiosman/ravenow/ui/agent/AddAgent.kt b/app/src/main/java/com/aiosman/ravenow/ui/agent/AddAgent.kt index 440599f..3d2c851 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/agent/AddAgent.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/agent/AddAgent.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons @@ -568,7 +569,7 @@ fun AddAgentScreen() { Box( modifier = Modifier .align(Alignment.Start) - .width(140.dp) + .widthIn(min = 140.dp,max = 250.dp) .height(40.dp) .shadow( elevation = 10.dp, 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 b10fd7b..73500c2 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 @@ -399,7 +399,7 @@ fun GroupChatInfoScreen(groupId: String) { ) Spacer(modifier = Modifier.width(10.dp)) Text( - text = "群资料设置", + text = stringResource(R.string.group_chat_info_group_settings), style = androidx.compose.ui.text.TextStyle( color = AppColors.text, fontSize = 15.sp diff --git a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt index b35de50..ef35a72 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt @@ -41,6 +41,7 @@ import android.widget.Toast import androidx.compose.ui.graphics.Brush import com.aiosman.ravenow.ui.composables.CustomAsyncImage import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.stringResource @Composable fun GroupMemoryManageContent( @@ -79,7 +80,7 @@ fun GroupMemoryManageContent( ) { // 中间标题 - 绝对居中,不受其他组件影响 Text( - text = "记忆管理", + text = stringResource(R.string.group_chat_info_memory_manage2), style = TextStyle( color = Color.Black, fontSize = 17.sp, @@ -107,7 +108,7 @@ fun GroupMemoryManageContent( colorFilter = ColorFilter.tint(Color.Black) ) Text( - text = "返回", + text = stringResource(R.string.back_upper), style = TextStyle( color = Color.Black, fontSize = 15.sp, @@ -148,7 +149,7 @@ fun GroupMemoryManageContent( ) { Row(horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically) { Row(verticalAlignment = Alignment.CenterVertically) { - Text("已付费:", style = TextStyle(color = Color(0x993C3C43), fontSize = 13.sp)) + Text(stringResource(R.string.memory_paid), style = TextStyle(color = Color(0x993C3C43), fontSize = 13.sp)) Spacer(Modifier.width(3.dp)) Text( "${quota?.purchasedCount ?: 0}", @@ -156,7 +157,7 @@ fun GroupMemoryManageContent( ) } Row(verticalAlignment = Alignment.CenterVertically) { - Text("已使用:", style = TextStyle(color = Color(0x993C3C43), fontSize = 13.sp)) + Text(stringResource(R.string.memory_used), style = TextStyle(color = Color(0x993C3C43), fontSize = 13.sp)) Spacer(Modifier.width(3.dp)) Text( "${quota?.currentCount ?: 0}", @@ -165,7 +166,7 @@ fun GroupMemoryManageContent( } } Row(verticalAlignment = Alignment.CenterVertically) { - Text("可用上限:", style = TextStyle(color = Color(0x993C3C43), fontSize = 13.sp)) + Text(stringResource(R.string.upper_limit), style = TextStyle(color = Color(0x993C3C43), fontSize = 13.sp)) Spacer(Modifier.width(3.dp)) Text( "50", @@ -235,12 +236,12 @@ fun GroupMemoryManageContent( Spacer(Modifier.height(10.dp)) Text( - text = "暂无记忆", + text = stringResource(R.string.no_memory), style = TextStyle(color = Color.Black, fontSize = 16.sp, fontWeight = FontWeight.SemiBold) ) Spacer(Modifier.height(6.dp)) Text( - text = "点击上方按钮添加群记忆", + text = stringResource(R.string.add_memory), style = TextStyle(color = Color.Black, fontSize = 14.sp, fontWeight = FontWeight.Normal) ) } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt index 7a49e2c..3270941 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt @@ -70,6 +70,7 @@ import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -574,38 +575,33 @@ fun SideMenuContent( // 顶部状态栏间距 val statusBarHeight = WindowInsets.systemBars.asPaddingValues().calculateTopPadding() - // 扫一扫功能入口 - 右边距离右边66pt - Row( - modifier = Modifier - .align(Alignment.TopEnd) - .offset(x = (-112).dp, y = 88.dp) - .noRippleClickable { - // 扫一扫功能:跳转到扫码页面 - coroutineScope.launch { - onClose() - navController.navigate(NavigationRoute.ScanQr.route) - } - }, - horizontalArrangement = Arrangement.spacedBy(16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - // 扫一扫图标(使用现有图标或占位) - Image( - painter = painterResource(id = R.mipmap.sao), - contentDescription = null, - modifier = Modifier.size(24.dp), - colorFilter = ColorFilter.tint(iconColor) - ) - } -// 绝对定位的"扫一扫"文字:上方71.5dp,右侧66dp + // 扫一扫功能入口 + Row( + modifier = Modifier + .align(Alignment.TopEnd) + .offset(x = (-60).dp, y = 88.dp) + .noRippleClickable { + coroutineScope.launch { + onClose() + navController.navigate(NavigationRoute.ScanQr.route) + } + }, + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painter = painterResource(id = R.mipmap.sao), + contentDescription = null, + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(iconColor) + ) Text( text = stringResource(R.string.scan_qr), fontSize = 14.sp, color = textColor, - modifier = Modifier - .align(Alignment.TopEnd) - .offset(x = (-66).dp, y = 91.5.dp) + textAlign = TextAlign.Center ) + } // QR码图标 - 右边距离右边112dp,上边距离上边68pt Image( painter = painterResource(id = R.mipmap.qr_code_icon), diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsCommentModal.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsCommentModal.kt index 8e0f4ff..0f86130 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsCommentModal.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsCommentModal.kt @@ -35,6 +35,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -237,24 +239,53 @@ fun NewsCommentModal( .fillMaxWidth() .weight(1f) ) { - LazyColumn { - item { - CommentContent( - viewModel = commentViewModel, - onLongClick = { comment -> - showCommentMenu = true - contextComment = comment - }, - onReply = { parentComment, _, _, _ -> - if (GuestLoginCheckOut.needLogin(GuestLoginCheckOutScene.COMMENT_MOMENT)) { - debouncedNavigation { - navController.navigate(NavigationRoute.Login.route) - } - } else { - replyComment = parentComment - } - } + val isCommentListEmpty = !commentViewModel.isLoading && + currentCommentCount == 0 && + commentViewModel.commentsList.isEmpty() && + commentViewModel.addedCommentList.isEmpty() + + if (isCommentListEmpty) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 32.dp), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Image( + painter = painterResource(id = R.mipmap.invalid_name_3), + contentDescription = null, + modifier = Modifier + .width(160.dp) + .height(130.dp) ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(R.string.news_no_comments), + fontSize = 15.sp, + color = AppColors.text + ) + } + } else { + LazyColumn { + item { + CommentContent( + viewModel = commentViewModel, + onLongClick = { comment -> + showCommentMenu = true + contextComment = comment + }, + onReply = { parentComment, _, _, _ -> + if (GuestLoginCheckOut.needLogin(GuestLoginCheckOutScene.COMMENT_MOMENT)) { + debouncedNavigation { + navController.navigate(NavigationRoute.Login.route) + } + } else { + replyComment = parentComment + } + } + ) + } } } } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsScreen.kt index efa89a3..c35b40b 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/news/NewsScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.pager.VerticalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape @@ -401,7 +402,7 @@ fun NewsItem( count = "", isActive = false, text = stringResource(R.string.share), - textSize = 8.sp + textSize = 8.sp, ) } } @@ -425,7 +426,7 @@ fun NewsActionButton( Row( modifier = modifier - .width(60.dp) + .defaultMinSize(minWidth = 60.dp) .background( color = AppColors.secondaryBackground, shape = RoundedCornerShape(16.dp) @@ -449,7 +450,8 @@ fun NewsActionButton( Spacer(modifier = Modifier.width(4.dp)) Text( text = count, - fontSize = 12.sp, + fontSize = 8.sp, + fontWeight = FontWeight.Bold, color = AppColors.text ) } @@ -458,7 +460,8 @@ fun NewsActionButton( Text( text = text, fontSize = textSize, - color = AppColors.text + color = AppColors.text, + fontWeight = FontWeight.Bold ) } } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/recommend/RecommendScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/recommend/RecommendScreen.kt index ab10ca9..7a1ae26 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/recommend/RecommendScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/recommend/RecommendScreen.kt @@ -80,7 +80,7 @@ fun RecommendScreen() { ) { CircularProgressIndicator(color = AppColors.main) Text( - text = "加载中...", + text = "", modifier = Modifier.padding(top = 16.dp), color = AppColors.text, fontSize = 14.sp diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/shorts/ShortVideoScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/shorts/ShortVideoScreen.kt index 2542863..1fe62a1 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/shorts/ShortVideoScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/moment/tabs/shorts/ShortVideoScreen.kt @@ -84,7 +84,7 @@ fun ShortVideoScreen( ) { CircularProgressIndicator(color = AppColors.main) Text( - text = "加载中...", + text = "", modifier = Modifier.padding(top = 16.dp), color = AppColors.text, fontSize = 14.sp diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt index fee8e8f..f9b29d5 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt @@ -10,10 +10,12 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text @@ -102,40 +104,21 @@ fun UserItem( // 统计数据 Row( - modifier = Modifier.weight(1f), + modifier = Modifier + .weight(1f) + .fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(0.dp), verticalAlignment = Alignment.CenterVertically ) { - // 帖子数 - Column( - modifier = Modifier - .width(80.dp) - .height(40.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text( - text = postCount.toString(), - fontWeight = FontWeight.Medium, - fontSize = 15.sp, - color = AppColors.text, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(2.dp)) - Text( - text = stringResource(R.string.posts), - fontWeight = FontWeight.Normal, - fontSize = 11.sp, - color = AppColors.text, - textAlign = TextAlign.Center - ) - } + StatColumn( + modifier = Modifier.weight(1f), + value = postCount.toString(), + label = stringResource(R.string.posts) + ) - // 粉丝数 - Column( + StatColumn( modifier = Modifier - .width(80.dp) - .height(40.dp) + .weight(1f) .noRippleClickable { followerDebouncer { navController.navigate( @@ -146,32 +129,13 @@ fun UserItem( ) } }, - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text( - text = formattedFollowerCount, - fontWeight = FontWeight.Medium, - fontSize = 15.sp, - color = AppColors.text, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(2.dp)) - Text( - text = stringResource(R.string.followers_upper), - fontWeight = FontWeight.Normal, - fontSize = 11.sp, - color = AppColors.text, - textAlign = TextAlign.Center - ) - } + value = formattedFollowerCount, + label = stringResource(R.string.followers_upper) + ) - // 关注数 - Column( + StatColumn( modifier = Modifier - .width(80.dp) - .height(40.dp) - .offset(x = 6.dp) + .weight(1f) .noRippleClickable { followingDebouncer { navController.navigate( @@ -182,25 +146,9 @@ fun UserItem( ) } }, - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text( - text = accountProfileEntity.followingCount.toString(), - fontWeight = FontWeight.Medium, - fontSize = 15.sp, - color = AppColors.text, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(2.dp)) - Text( - text = stringResource(R.string.following_upper), - fontWeight = FontWeight.Normal, - fontSize = 11.sp, - color = AppColors.text, - textAlign = TextAlign.Center - ) - } + value = accountProfileEntity.followingCount.toString(), + label = stringResource(R.string.following_upper) + ) } } @@ -290,6 +238,38 @@ fun UserItem( } } +@Composable +private fun StatColumn( + modifier: Modifier = Modifier, + value: String, + label: String +) { + val AppColors = LocalAppTheme.current + Column( + modifier = modifier + .heightIn(min = 40.dp) + .wrapContentWidth(Alignment.CenterHorizontally), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = value, + fontWeight = FontWeight.Medium, + fontSize = 15.sp, + color = AppColors.text, + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(2.dp)) + Text( + text = label, + fontWeight = FontWeight.Normal, + fontSize = 11.sp, + color = AppColors.text, + textAlign = TextAlign.Center + ) + } +} + @Composable private fun ProfileTag( text: String, diff --git a/app/src/main/java/com/aiosman/ravenow/ui/post/DraftBox.kt b/app/src/main/java/com/aiosman/ravenow/ui/post/DraftBox.kt index c466408..3d01b00 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/post/DraftBox.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/post/DraftBox.kt @@ -18,6 +18,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.ModalBottomSheet @@ -33,7 +34,6 @@ import android.graphics.BitmapFactory import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource @@ -112,7 +112,7 @@ fun DraftBoxBottomSheet( contentAlignment = Alignment.Center ) { Text( - text = "暂无草稿", + text = stringResource(R.string.no_drafts), fontSize = 16.sp, color = AppColors.secondaryText ) @@ -122,7 +122,7 @@ fun DraftBoxBottomSheet( modifier = Modifier .fillMaxWidth() .weight(1f), - verticalArrangement = Arrangement.spacedBy(12.dp) + verticalArrangement = Arrangement.spacedBy(0.dp) ) { itemsIndexed(drafts) { index, draft -> DraftItem( @@ -141,12 +141,22 @@ fun DraftBoxBottomSheet( AppColors = AppColors, context = context ) + // 在草稿项之间添加分割线(最后一个不添加) + if (index < drafts.size - 1) { + Spacer(modifier = Modifier.height(12.dp)) + Divider( + color = AppColors.secondaryText.copy(alpha = 0.2f), + thickness = 0.5.dp, + modifier = Modifier.padding(horizontal = 16.dp) + ) + Spacer(modifier = Modifier.height(12.dp)) + } } } // 底部提示 Text( - text = "仅保存最近5个草稿", + text = stringResource(R.string.only_save_the_last_5_drafts), fontSize = 12.sp, color = AppColors.secondaryText, modifier = Modifier @@ -172,7 +182,7 @@ private fun DraftItem( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) - .background(Color.White) + .background(AppColors.secondaryBackground) .padding(12.dp) ) { Column { @@ -206,7 +216,8 @@ private fun DraftItem( DraftImageThumbnail( imageItem = imageItem, context = context, - modifier = Modifier.size(55.dp) + modifier = Modifier.size(55.dp), + AppColors = AppColors ) } @@ -216,7 +227,7 @@ private fun DraftItem( modifier = Modifier .size(55.dp) .clip(RoundedCornerShape(12.dp)) - .background(Color(0xFFFAF9FB)), + .background(AppColors.inputBackground), contentAlignment = Alignment.Center ) { Text( @@ -250,7 +261,7 @@ private fun DraftItem( verticalAlignment = Alignment.CenterVertically ) { Icon( - painter = painterResource(id = R.drawable.rider_pro_moment_apply), + painter = painterResource(id = R.mipmap.icons_infor_edit), contentDescription = "edit", modifier = Modifier.size(16.dp), tint = AppColors.text @@ -297,12 +308,13 @@ private fun DraftItem( private fun DraftImageThumbnail( imageItem: DraftImageItem, context: android.content.Context, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + AppColors: AppThemeData ) { Box( modifier = modifier .clip(RoundedCornerShape(12.dp)) - .background(Color(0xFFFAF9FB)) + ) { val file = File(context.cacheDir, imageItem.filename) if (file.exists()) { @@ -338,7 +350,7 @@ private fun DraftImageThumbnail( painter = painterResource(id = R.drawable.rider_pro_new_post_add_pic), contentDescription = "image", modifier = Modifier.size(24.dp), - tint = Color.Gray + tint = AppColors.secondaryText ) } } diff --git a/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt b/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt index 2179b24..d380a99 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/post/NewPost.kt @@ -221,7 +221,7 @@ fun NewPostScreen() { e.printStackTrace() Toast.makeText( context, - "文案优化失败:${e.message ?: "请稍后重试"}", + "${e.message ?: "请稍后重试"}", Toast.LENGTH_SHORT ).show() } finally { @@ -345,16 +345,18 @@ fun NewPostScreen() { // 底部背景图 if (isRequesting) { - Image( - painter = painterResource(id = R.mipmap.component), - contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .height(400.dp) - .align(Alignment.BottomStart) - .offset(y = (-40).dp), - contentScale = ContentScale.FillBounds - ) + if (!AppState.darkMode) { + Image( + painter = painterResource(id = R.mipmap.component), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .height(400.dp) + .align(Alignment.BottomStart) + .offset(y = (-40).dp), + contentScale = ContentScale.FillBounds + ) + } // 加载动画显示在背景图上方,按钮下方80dp区域 Box( diff --git a/app/src/main/java/com/aiosman/ravenow/ui/post/NewPostViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/post/NewPostViewModel.kt index 0d17471..b1800a3 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/post/NewPostViewModel.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/post/NewPostViewModel.kt @@ -106,6 +106,11 @@ data class Draft( val createdAt: Long = System.currentTimeMillis() ) object NewPostViewModel : ViewModel() { + private data class DraftSnapshot( + val textContent: String, + val images: List + ) + var momentService: MomentService = MomentServiceImpl() var textContent by mutableStateOf("") var aiTextContent by mutableStateOf("") @@ -117,6 +122,7 @@ object NewPostViewModel : ViewModel() { var currentPhotoUri: Uri? = null var draft: Draft? = null private var draftSaved = false // 标记草稿是否已保存,避免重复保存 + private var lastLoadedDraftSnapshot: DraftSnapshot? = null // watch textContent change and save draft // fun saveDraft() { // draft = Draft(textContent, imageList.map { @@ -131,6 +137,7 @@ object NewPostViewModel : ViewModel() { imageList = listOf() relPostId = null draftSaved = false // 重置保存标志 + lastLoadedDraftSnapshot = null } fun asNewPostWithImageUris(imageUris: List) { @@ -213,14 +220,25 @@ object NewPostViewModel : ViewModel() { if (draftSaved) { return } + + val currentSnapshot = DraftSnapshot( + textContent = textContent, + images = imageList.map { DraftImageItem.fromImageItem(it) } + ) + + if (lastLoadedDraftSnapshot == currentSnapshot) { + draftSaved = true + return + } val draftStore = DraftStore(context) val draft = Draft( - textContent = textContent, - imageList = imageList.map { DraftImageItem.fromImageItem(it) } + textContent = currentSnapshot.textContent, + imageList = currentSnapshot.images ) draftStore.saveDraft(draft) draftSaved = true // 标记已保存 + lastLoadedDraftSnapshot = currentSnapshot } /** @@ -230,6 +248,10 @@ object NewPostViewModel : ViewModel() { textContent = draft.textContent aiTextContent = "" draftSaved = false // 加载草稿后重置保存标志,允许重新保存 + lastLoadedDraftSnapshot = DraftSnapshot( + textContent = draft.textContent, + images = draft.imageList + ) // 从草稿的图片URI恢复图片列表 imageList = withContext(Dispatchers.IO) { diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 4367e5a..de2a662 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -210,7 +210,15 @@ パスワードは%1$d文字を超えることはできません ブロック 全文を読む + まだ誰もノックしてないよ ドラフトボックス + 草稿はしばらくありません + 最後の5つのドラフトのみ保存 + 支払い済み: + 使用済み: + 利用可能上限: + 記憶がありません + 上部のボタンをクリックしてグループ記憶を追加してください 作成 @@ -274,6 +282,7 @@ AIは記憶に基づいてグループチャットであなたをより理解します メモリを追加 メモリ管理 + メモリ管理 グループ設定 グループの可視性 ロック中 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index f125150..c1d2d99 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -70,7 +70,11 @@ 请输入新密码 确认新密码 请确认新密码 - + 已付费: + 已使用: + 可用上限: + 暂无记忆 + 点击上方按钮添加群记忆 取消 个性签名 @@ -213,7 +217,10 @@ 人正在热聊… 拉黑 查看全文 + 还没有人敲门 草稿箱 + 暂无草稿 + 仅保存最近5个草稿 创建 @@ -277,6 +284,7 @@ AI 会根据记忆在群聊里更懂你 添加记忆 记忆管理 + 记忆管理 群资料设置 群可见性 待解锁 @@ -367,21 +375,6 @@ 完成任务可获得奖励 充值派币 多种套餐可选,立即充值 - - - 新用户注册奖励 - 每日签到奖励 - 任务完成奖励 - 邀请好友奖励 - 充值获得 - 创建群聊 - 扩容群聊 - Agent 私密模式 - Agent 记忆添加 - 房间记忆添加 - 自定义聊天背景 - 定时事件解锁 - 创建群聊失败: %1$s 创建群聊确认 需要消耗: @@ -401,4 +394,18 @@ 去探索 回复@%1$s 请至少选择一张图片 + + + 新用户注册奖励 + 每日签到奖励 + 任务完成奖励 + 好友邀请奖励 + 充值 + 群聊创建 + 群聊扩展 + 智能体私密模式 + 智能体记忆添加 + 房间记忆添加 + 自定义聊天背景 + 日程事件解锁 \ 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 86ca961..dc01973 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -209,7 +209,15 @@ Password cannot exceed %1$d characters Block Read full article + No one’s knocked yet drafts + No draft + Only save the last 5 drafts + Paid: + Used: + Available Limit: + No memory yet + Click the button above to add group memory Create @@ -273,6 +281,7 @@ AI will understand you better in group chat based on memory Add Memory Memory Management + Memory Group Settings Group Visibility Locked @@ -361,21 +370,6 @@ Complete tasks to earn rewards Recharge Pai Coin Multiple packages available, recharge now - - - New User Registration Reward - Daily Check-in Reward - Task Completion Reward - Invite Friends Reward - Recharge - Create Group Chat - Expand Group Chat - Agent Private Mode - Agent Memory Added - Room Memory Added - Custom Chat Background - Scheduled Event Unlocked - Failed to create group chat: %1$s Create Group Chat Required consumption: @@ -395,4 +389,18 @@ Explore Reply @%1$s Please select at least one image + + + New User Registration Reward + Daily Check-in Reward + Task Completion Reward + Friend Invitation Reward + Recharge + Group Chat Creation + Group Chat Expansion + Agent Private Mode + Agent Memory Addition + Room Memory Addition + Custom Chat Background + Schedule Event Unlock \ No newline at end of file