From 712ff915d8674520788fd1edea887b073ab922fc Mon Sep 17 00:00:00 2001 From: iammm0 Date: Mon, 26 Jan 2026 11:54:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E5=9B=9E?= =?UTF-8?q?=E5=BF=86=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构MyMemoirScreen我的回忆录页面 - 优化MyMemoirViewModel回忆录ViewModel --- .../life_echo/ui/screens/MyMemoirScreen.kt | 181 ++---------------- .../ui/viewmodel/MyMemoirViewModel.kt | 76 -------- 2 files changed, 16 insertions(+), 241 deletions(-) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/MyMemoirScreen.kt b/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/MyMemoirScreen.kt index fc2c623..bf7a3b0 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/MyMemoirScreen.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/MyMemoirScreen.kt @@ -28,14 +28,15 @@ import androidx.compose.material3.pulltorefresh.PullToRefreshBox import com.huaga.life_echo.data.database.Chapter import com.huaga.life_echo.network.models.ChapterContentDto import com.huaga.life_echo.network.models.ChapterDto -import com.huaga.life_echo.ui.components.memoir.* +import com.huaga.life_echo.ui.components.memoir.BookInfoCard +import com.huaga.life_echo.ui.components.memoir.ChapterCard +import com.huaga.life_echo.ui.components.memoir.ChapterReadingView +import com.huaga.life_echo.ui.components.memoir.FullTextReadingView import com.huaga.life_echo.ui.components.common.EmptyStateView import com.huaga.life_echo.ui.theme.LightPurple import com.huaga.life_echo.ui.viewmodel.MyMemoirViewModel import com.huaga.life_echo.ui.viewmodel.ViewModelFactory -import com.huaga.life_echo.ui.viewmodel.ConversationListViewModel import com.huaga.life_echo.ui.icons.AppIcons -import com.huaga.life_echo.network.models.ConversationListItemDto @OptIn(ExperimentalMaterial3Api::class) @RequiresApi(Build.VERSION_CODES.O) @@ -44,9 +45,6 @@ fun MyMemoirScreen( navController: androidx.navigation.NavHostController? = null, viewModel: MyMemoirViewModel = viewModel( factory = ViewModelFactory(LocalContext.current) - ), - conversationListViewModel: ConversationListViewModel = viewModel( - factory = ViewModelFactory(LocalContext.current) ) ) { val chapters by viewModel.chapters.collectAsState(initial = emptyList()) @@ -55,14 +53,7 @@ fun MyMemoirScreen( val bookInfo by viewModel.bookInfo.collectAsState() val showFullTextReading by viewModel.showFullTextReading.collectAsState() - // 整理对话相关状态 - var showOrganizeDialog by remember { mutableStateOf(false) } - var showOrganizeSuccessDialog by remember { mutableStateOf(false) } - val conversations by conversationListViewModel.conversations.collectAsState(initial = emptyList()) - val conversationsLoading by conversationListViewModel.isLoading.collectAsState() - val isOrganizing by viewModel.isOrganizing.collectAsState() - val organizingProgress by viewModel.organizingProgress.collectAsState() - val organizingStatus by viewModel.organizingStatus.collectAsState() + // 注意:整理功能已自动化,不再需要手动触发 // 下拉刷新状态 var isRefreshing by remember { mutableStateOf(false) } @@ -80,31 +71,11 @@ fun MyMemoirScreen( } } - // 加载对话列表(转换为ConversationListItemDto格式) - val conversationDtos = remember(conversations) { - conversations.map { conv -> - ConversationListItemDto( - id = conv.id, - title = conv.title ?: "回忆录助手", - avatarUrl = conv.avatarUrl, - latestMessagePreview = conv.latestMessagePreview, - latestMessageTime = conv.latestMessageTime ?: conv.startedAt, - unreadCount = 0, - isDefaultAssistant = conv.title == null - ) - } - } - // 加载对话列表 - LaunchedEffect(showOrganizeDialog) { - if (showOrganizeDialog) { - conversationListViewModel.refreshConversations() - } - } - - // 加载书籍信息 + // 加载书籍信息和章节列表 LaunchedEffect(Unit) { viewModel.loadBookInfo() + viewModel.refreshChapters() } // 转换Chapter为ChapterDto用于显示 @@ -209,63 +180,17 @@ fun MyMemoirScreen( // 操作按钮区域 item { - Column( + Row( modifier = Modifier .fillMaxWidth() - .padding(vertical = 16.dp) + .padding(horizontal = 16.dp, vertical = 16.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp) ) { - // 整理进度条(如果正在整理) - if (isOrganizing) { - Card( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 8.dp), - shape = RoundedCornerShape(12.dp), - colors = CardDefaults.cardColors( - containerColor = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f) - ) - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - ) { - Text( - text = organizingStatus.ifEmpty { "正在整理对话..." }, - fontSize = 14.sp, - fontWeight = FontWeight.Medium, - color = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.padding(bottom = 8.dp) - ) - LinearProgressIndicator( - progress = organizingProgress, - modifier = Modifier.fillMaxWidth(), - color = LightPurple, - trackColor = MaterialTheme.colorScheme.surfaceVariant - ) - Spacer(modifier = Modifier.height(4.dp)) - Text( - text = "${(organizingProgress * 100).toInt()}%", - fontSize = 12.sp, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.align(Alignment.End) - ) - } - } - } - - // 操作按钮 - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - horizontalArrangement = Arrangement.spacedBy(12.dp) - ) { - // 整理对话按钮(改进样式) + // 「阅读全文」按钮 - 只在有章节时显示 + if (chapterDtos.isNotEmpty()) { Button( - onClick = { showOrganizeDialog = true }, - modifier = Modifier.weight(1f), - enabled = !isOrganizing, + onClick = { viewModel.toggleFullTextReading() }, + modifier = Modifier.fillMaxWidth(), colors = ButtonDefaults.buttonColors( containerColor = LightPurple ), @@ -276,49 +201,19 @@ fun MyMemoirScreen( horizontalArrangement = Arrangement.Center ) { Icon( - imageVector = AppIcons.Edit, + imageVector = AppIcons.Reading, contentDescription = null, tint = Color.White, modifier = Modifier.size(20.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text( - "整理对话", + "阅读全文", color = Color.White, fontSize = 14.sp ) } } - - // 「阅读全文」按钮 - 只在有章节时显示 - if (chapterDtos.isNotEmpty()) { - Button( - onClick = { viewModel.toggleFullTextReading() }, - modifier = Modifier.weight(1f), - colors = ButtonDefaults.buttonColors( - containerColor = LightPurple - ), - shape = RoundedCornerShape(12.dp) - ) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - Icon( - imageVector = AppIcons.Reading, - contentDescription = null, - tint = Color.White, - modifier = Modifier.size(20.dp) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - "阅读全文", - color = Color.White, - fontSize = 14.sp - ) - } - } - } } } } @@ -396,49 +291,5 @@ fun MyMemoirScreen( } } } - - // 整理对话对话框 - if (showOrganizeDialog) { - OrganizeConversationDialog( - conversations = conversationDtos, - isLoading = conversationsLoading, - onDismiss = { showOrganizeDialog = false }, - onSelectConversation = { conversationId -> - viewModel.organizeConversation( - conversationId = conversationId, - onSuccess = { - showOrganizeSuccessDialog = true - }, - onError = { errorMsg -> - // 错误处理可以在这里添加 - } - ) - } - ) - } - - // 整理成功对话框 - if (showOrganizeSuccessDialog) { - AlertDialog( - onDismissRequest = { showOrganizeSuccessDialog = false }, - title = { Text("整理成功") }, - text = { - Text( - text = "对话内容正在整理中,请稍后刷新查看章节。", - modifier = Modifier.wrapContentHeight() - ) - }, - confirmButton = { - TextButton( - onClick = { - showOrganizeSuccessDialog = false - viewModel.refreshChapters() - } - ) { - Text("确定", color = LightPurple) - } - } - ) - } } } diff --git a/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt b/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt index 9526df3..22e3586 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt @@ -29,11 +29,6 @@ class MyMemoirViewModel( val memoirState = MutableStateFlow(null) val tasksStatus = MutableStateFlow(null) - // 整理对话进度 - val isOrganizing = MutableStateFlow(false) - val organizingProgress = MutableStateFlow(0f) // 0.0 - 1.0 - val organizingStatus = MutableStateFlow("") // 状态文本 - fun selectChapter(chapter: Chapter) { selectedChapter.value = chapter } @@ -172,76 +167,5 @@ class MyMemoirViewModel( fun toggleFullTextReading() { showFullTextReading.value = !showFullTextReading.value } - - /** - * 整理对话内容成章节 - */ - fun organizeConversation(conversationId: String, onSuccess: () -> Unit, onError: (String) -> Unit) { - viewModelScope.launch { - isOrganizing.value = true - organizingProgress.value = 0f - organizingStatus.value = "正在提交整理任务..." - error.value = null - - try { - val result = apiService.organizeConversation(conversationId) - result.fold( - onSuccess = { - organizingProgress.value = 0.3f - organizingStatus.value = "任务已提交,正在处理..." - - // 模拟进度更新(实际应该通过任务状态API获取) - var progress = 0.3f - val progressSteps = listOf(0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f) - val statusSteps = listOf( - "正在分析对话内容...", - "正在分类整理...", - "正在生成章节...", - "正在优化内容...", - "即将完成..." - ) - - progressSteps.forEachIndexed { index, step -> - delay(1000) - progress = step - organizingProgress.value = progress - if (index < statusSteps.size) { - organizingStatus.value = statusSteps[index] - } - } - - // 等待处理完成 - delay(2000) - organizingProgress.value = 1.0f - organizingStatus.value = "整理完成!" - - delay(500) - isOrganizing.value = false - organizingProgress.value = 0f - organizingStatus.value = "" - - // 刷新章节列表 - refreshChapters() - onSuccess() - }, - onFailure = { exception -> - isOrganizing.value = false - organizingProgress.value = 0f - organizingStatus.value = "" - val errorMsg = "整理失败: ${exception.message}" - error.value = errorMsg - onError(errorMsg) - } - ) - } catch (e: Exception) { - isOrganizing.value = false - organizingProgress.value = 0f - organizingStatus.value = "" - val errorMsg = "整理失败: ${e.message}" - error.value = errorMsg - onError(errorMsg) - } - } - } }