From 550de8d1572f7b7bcbbd71cf53a2feeb27cb3c2e Mon Sep 17 00:00:00 2001 From: iammm0 Date: Tue, 10 Feb 2026 17:10:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=A5=97=E9=A4=90?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E9=A1=B5=E9=9D=A2=E4=B8=8E=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E8=B5=84=E6=96=99=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增PlanBalanceScreen套餐余额屏幕 - 更新ProfileScreen个人资料页面入口 Co-authored-by: Cursor --- .../life_echo/ui/screens/PlanBalanceScreen.kt | 173 ++++++++++++++++++ .../life_echo/ui/screens/ProfileScreen.kt | 6 + 2 files changed, 179 insertions(+) create mode 100644 app-android/app/src/main/java/com/huaga/life_echo/ui/screens/PlanBalanceScreen.kt diff --git a/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/PlanBalanceScreen.kt b/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/PlanBalanceScreen.kt new file mode 100644 index 0000000..aa4cc41 --- /dev/null +++ b/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/PlanBalanceScreen.kt @@ -0,0 +1,173 @@ +package com.huaga.life_echo.ui.screens + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.huaga.life_echo.ui.components.common.LoadingIndicator +import com.huaga.life_echo.ui.components.payment.QuotaIndicator +import com.huaga.life_echo.ui.icons.AppIcons +import com.huaga.life_echo.ui.theme.LightPurple +import com.huaga.life_echo.ui.theme.MediumPurple +import com.huaga.life_echo.ui.theme.SlatePurple +import com.huaga.life_echo.ui.viewmodel.PaymentViewModel +import com.huaga.life_echo.ui.viewmodel.ViewModelFactory + +/** + * 套餐余额页:展示当前套餐账户剩余额度(对话轮数、章节等) + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PlanBalanceScreen( + navController: androidx.navigation.NavHostController? = null, + viewModel: PaymentViewModel = viewModel( + factory = ViewModelFactory(LocalContext.current) + ) +) { + val quota by viewModel.quota.collectAsState() + val currentPlan by viewModel.currentPlan.collectAsState() + val isLoading by viewModel.isLoading.collectAsState() + + LaunchedEffect(Unit) { + viewModel.checkQuota() + viewModel.loadCurrentPlan() + } + + Scaffold( + topBar = { + TopAppBar( + title = { Text("套餐余额") }, + navigationIcon = { + IconButton(onClick = { navController?.popBackStack() }) { + Icon( + imageVector = AppIcons.ArrowBack, + contentDescription = "返回", + tint = Color.White + ) + } + }, + actions = { + IconButton( + onClick = { + viewModel.checkQuota() + } + ) { + Icon( + imageVector = AppIcons.Refresh, + contentDescription = "刷新", + tint = Color.White + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MediumPurple, + titleContentColor = Color.White, + navigationIconContentColor = Color.White, + actionIconContentColor = Color.White + ) + ) + } + ) { paddingValues -> + if (isLoading && quota == null) { + LoadingIndicator(modifier = Modifier.padding(paddingValues)) + } else { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + .background(MaterialTheme.colorScheme.background), + contentPadding = PaddingValues(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + currentPlan?.let { plan -> + item { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = LightPurple.copy(alpha = 0.3f)), + shape = MaterialTheme.shapes.medium + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "当前套餐", + fontSize = 14.sp, + color = SlatePurple + ) + Text( + text = plan.displayName, + fontSize = 16.sp, + fontWeight = FontWeight.Bold, + color = MediumPurple + ) + } + } + } + } + item { + Text( + text = "账户额度", + fontSize = 15.sp, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + quota?.let { q -> + item { + QuotaIndicator(quota = q) + } + } ?: item { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant), + shape = MaterialTheme.shapes.medium + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = "暂无额度信息,请稍后刷新", + fontSize = 14.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } + } + } + } +} diff --git a/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/ProfileScreen.kt b/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/ProfileScreen.kt index 42659c4..f46663f 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/ProfileScreen.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/ui/screens/ProfileScreen.kt @@ -184,6 +184,12 @@ fun ProfileScreen( onPress = { navController?.navigate(Screen.PlanDetails.route) } ) } + SettingItem( + icon = AppIcons.Info, + label = "套餐余额", + description = "查看当前套餐剩余额度", + onPress = { navController?.navigate(Screen.PlanBalance.route) } + ) SettingItem( icon = AppIcons.Upgrade, label = "升级套餐",