This commit is contained in:
coco
2026-07-15 16:12:04 +08:00
parent f42d112862
commit 7eb3c177b4
@@ -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()
}