refactor: 优化回忆录功能
- 重构MyMemoirScreen我的回忆录页面 - 优化MyMemoirViewModel回忆录ViewModel
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,11 +29,6 @@ class MyMemoirViewModel(
|
||||
val memoirState = MutableStateFlow<MemoirStateDto?>(null)
|
||||
val tasksStatus = MutableStateFlow<TasksStatusDto?>(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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user