diff --git a/Pink/app/src/main/java/com/pinkbear/pinkov/ui/page/MinePage.kt b/Pink/app/src/main/java/com/pinkbear/pinkov/ui/page/MinePage.kt index 368fe1e..7042016 100644 --- a/Pink/app/src/main/java/com/pinkbear/pinkov/ui/page/MinePage.kt +++ b/Pink/app/src/main/java/com/pinkbear/pinkov/ui/page/MinePage.kt @@ -1,33 +1,176 @@ package com.pinkbear.pinkov.ui.page -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight +import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.* +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.pinkbear.pinkov.ui.theme.PinkOVTheme @Composable fun MinePage(modifier: Modifier = Modifier) { + // TODO: Replace with real login state from user repository + var isLoggedIn by remember { mutableStateOf(false) } + var userName by remember { mutableStateOf("") } + Scaffold(modifier = modifier) { innerPadding -> - Box( + Column( modifier = Modifier .fillMaxSize() - .padding(innerPadding), - contentAlignment = Alignment.Center + .padding(innerPadding) ) { - Text(text = "Mine") + // ---- Top ~20%: Profile section ---- + Box( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(0.2f) + .background(MaterialTheme.colorScheme.surface), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + // Avatar + Box( + modifier = Modifier + .size(64.dp) + .clip(CircleShape) + .background(MaterialTheme.colorScheme.primaryContainer), + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = Icons.Default.Person, + contentDescription = "头像", + modifier = Modifier.size(36.dp), + tint = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + + Spacer(modifier = Modifier.height(12.dp)) + + // Username or login prompt + Text( + text = if (isLoggedIn) userName else "点击登录", + color = MaterialTheme.colorScheme.onSurface, + fontSize = 16.sp, + fontWeight = FontWeight.Medium + ) + } + } + + HorizontalDivider( + thickness = 1.dp, + color = MaterialTheme.colorScheme.outlineVariant + ) + + // ---- Bottom ~80%: Menu items ---- + Column( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight() + ) { + MenuItemRow( + icon = Icons.Default.Info, + title = "关于我们", + onClick = { /* TODO: navigate to about page */ } + ) + HorizontalDivider( + thickness = 0.5.dp, + color = MaterialTheme.colorScheme.outlineVariant + ) + + MenuItemRow( + icon = Icons.Default.Refresh, + title = "版本更新", + onClick = { /* TODO: check for updates */ } + ) + HorizontalDivider( + thickness = 0.5.dp, + color = MaterialTheme.colorScheme.outlineVariant + ) + + MenuItemRow( + icon = Icons.Default.Settings, + title = "设置", + onClick = { /* TODO: navigate to settings page */ } + ) + + // Push version text to bottom + Spacer(modifier = Modifier.weight(1f)) + + Text( + text = "v1.0.0", + color = MaterialTheme.colorScheme.onSurfaceVariant, + fontSize = 12.sp, + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(bottom = 16.dp) + ) + } } } } -@Preview(showBackground = true) +/** + * A single menu item row with leading icon, title, and trailing arrow. + */ @Composable -fun MinePagePreview() { +private fun MenuItemRow( + icon: ImageVector, + title: String, + onClick: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onClick() } + .padding(horizontal = 16.dp, vertical = 14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = icon, + contentDescription = title, + modifier = Modifier.size(24.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + + Spacer(modifier = Modifier.width(16.dp)) + + Text( + text = title, + fontSize = 16.sp, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.weight(1f) + ) + + Icon( + imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + } +} + +@PreviewScreenSizes +@Composable +private fun MinePagePreview() { PinkOVTheme { MinePage() }