修正个人信息主页
This commit is contained in:
@@ -1,11 +1,8 @@
|
|||||||
package com.aiosman.riderpro.ui.index.tabs.profile
|
package com.aiosman.riderpro.ui.index.tabs.profile
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
@@ -53,7 +50,9 @@ import androidx.compose.ui.draw.shadow
|
|||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.graphicsLayer
|
import androidx.compose.ui.graphics.graphicsLayer
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
|
import androidx.compose.ui.layout.onGloballyPositioned
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
@@ -110,6 +109,7 @@ fun ProfileV3(
|
|||||||
var enabled by remember { mutableStateOf(true) }
|
var enabled by remember { mutableStateOf(true) }
|
||||||
val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues()
|
val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues()
|
||||||
var expanded by remember { mutableStateOf(false) }
|
var expanded by remember { mutableStateOf(false) }
|
||||||
|
var minibarExpanded by remember { mutableStateOf(false) }
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val navController = LocalNavController.current
|
val navController = LocalNavController.current
|
||||||
@@ -126,6 +126,8 @@ fun ProfileV3(
|
|||||||
val refreshState = rememberPullRefreshState(model.refreshing, onRefresh = {
|
val refreshState = rememberPullRefreshState(model.refreshing, onRefresh = {
|
||||||
model.loadProfile(pullRefresh = true)
|
model.loadProfile(pullRefresh = true)
|
||||||
})
|
})
|
||||||
|
var miniToolbarHeight by remember { mutableStateOf(0) }
|
||||||
|
val density = LocalDensity.current
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier.pullRefresh(refreshState)
|
modifier = Modifier.pullRefresh(refreshState)
|
||||||
) {
|
) {
|
||||||
@@ -141,49 +143,29 @@ fun ProfileV3(
|
|||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
.height(miniToolbarHeight.dp)
|
||||||
// 保持在最低高度和当前高度之间
|
// 保持在最低高度和当前高度之间
|
||||||
.background(Color(0xfff8f8f8))
|
.background(Color(0xfff8f8f8))
|
||||||
.padding(horizontal = 16.dp)
|
|
||||||
|
|
||||||
) {
|
) {
|
||||||
StatusBarSpacer()
|
|
||||||
|
|
||||||
Row(
|
|
||||||
modifier = Modifier,
|
|
||||||
verticalAlignment = Alignment.CenterVertically
|
|
||||||
) {
|
|
||||||
CustomAsyncImage(
|
|
||||||
LocalContext.current,
|
|
||||||
profile?.avatar,
|
|
||||||
modifier = Modifier
|
|
||||||
.size(48.dp)
|
|
||||||
.clip(CircleShape),
|
|
||||||
contentDescription = "",
|
|
||||||
contentScale = ContentScale.Crop
|
|
||||||
)
|
|
||||||
Spacer(modifier = Modifier.width(16.dp))
|
|
||||||
androidx.compose.material3.Text(
|
|
||||||
text = profile?.nickName ?: "",
|
|
||||||
fontSize = 16.sp,
|
|
||||||
fontWeight = FontWeight.W600,
|
|
||||||
color = Color.Black
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Spacer(modifier = Modifier.height(8.dp))
|
|
||||||
}
|
}
|
||||||
|
// header
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.parallax(0.5f)
|
.parallax(0.5f)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.height(600.dp)
|
.height(600.dp)
|
||||||
.graphicsLayer {
|
.verticalScroll(toolbarScrollState)
|
||||||
// change alpha of Image as the toolbar expands
|
) {
|
||||||
alpha = state.toolbarState.progress
|
Box(
|
||||||
}.verticalScroll(toolbarScrollState)
|
modifier = Modifier.fillMaxSize()
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
.graphicsLayer {
|
||||||
|
alpha = state.toolbarState.progress
|
||||||
|
}
|
||||||
) {
|
) {
|
||||||
// banner
|
// banner
|
||||||
Box(
|
Box(
|
||||||
@@ -195,7 +177,7 @@ fun ProfileV3(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.let {
|
.let {
|
||||||
if (isSelf) {
|
if (isSelf && state.toolbarState.progress == 0f) {
|
||||||
it.noRippleClickable {
|
it.noRippleClickable {
|
||||||
Intent(Intent.ACTION_PICK).apply {
|
Intent(Intent.ACTION_PICK).apply {
|
||||||
type = "image/*"
|
type = "image/*"
|
||||||
@@ -263,7 +245,6 @@ fun ProfileV3(
|
|||||||
tint = Color.Black
|
tint = Color.Black
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
DropdownMenu(
|
DropdownMenu(
|
||||||
expanded = expanded,
|
expanded = expanded,
|
||||||
onDismissRequest = { expanded = false },
|
onDismissRequest = { expanded = false },
|
||||||
@@ -360,6 +341,102 @@ fun ProfileV3(
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.graphicsLayer {
|
||||||
|
alpha = 1 - state.toolbarState.progress
|
||||||
|
}
|
||||||
|
.onGloballyPositioned {
|
||||||
|
miniToolbarHeight = with(density) {
|
||||||
|
it.size.height.toDp().value.toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
StatusBarSpacer()
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
CustomAsyncImage(
|
||||||
|
LocalContext.current,
|
||||||
|
profile?.avatar,
|
||||||
|
modifier = Modifier
|
||||||
|
.size(48.dp)
|
||||||
|
.clip(CircleShape),
|
||||||
|
contentDescription = "",
|
||||||
|
contentScale = ContentScale.Crop
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(16.dp))
|
||||||
|
androidx.compose.material3.Text(
|
||||||
|
text = profile?.nickName ?: "",
|
||||||
|
fontSize = 16.sp,
|
||||||
|
fontWeight = FontWeight.W600,
|
||||||
|
color = Color.Black
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.weight(1f))
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
) {
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(16.dp)
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(id = R.drawable.rider_pro_more_horizon),
|
||||||
|
contentDescription = "",
|
||||||
|
modifier = Modifier.noRippleClickable {
|
||||||
|
minibarExpanded = true
|
||||||
|
},
|
||||||
|
tint = Color.Black
|
||||||
|
)
|
||||||
|
}
|
||||||
|
DropdownMenu(
|
||||||
|
expanded = minibarExpanded,
|
||||||
|
onDismissRequest = { minibarExpanded = false },
|
||||||
|
width = 250,
|
||||||
|
menuItems = listOf(
|
||||||
|
MenuItem(
|
||||||
|
stringResource(R.string.logout),
|
||||||
|
R.mipmap.rider_pro_logout
|
||||||
|
) {
|
||||||
|
minibarExpanded = false
|
||||||
|
scope.launch {
|
||||||
|
onLogout()
|
||||||
|
navController.navigate(NavigationRoute.Login.route) {
|
||||||
|
popUpTo(NavigationRoute.Index.route) {
|
||||||
|
inclusive = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
MenuItem(
|
||||||
|
stringResource(R.string.change_password),
|
||||||
|
R.mipmap.rider_pro_change_password
|
||||||
|
) {
|
||||||
|
minibarExpanded = false
|
||||||
|
scope.launch {
|
||||||
|
navController.navigate(NavigationRoute.ChangePasswordScreen.route)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
MenuItem(
|
||||||
|
stringResource(R.string.favourites),
|
||||||
|
R.drawable.rider_pro_favourite
|
||||||
|
) {
|
||||||
|
minibarExpanded = false
|
||||||
|
scope.launch {
|
||||||
|
navController.navigate(NavigationRoute.FavouriteList.route)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
Column {
|
Column {
|
||||||
|
|||||||
Reference in New Issue
Block a user