更新个人主页及其他页面

- 个人主页UI更新,支持工具栏滚动
- 调整个人主页背景颜色
- 更新个人主页为空时的
UI
- 更新用户信息编辑页面样式
- 更新点赞和收藏通知页面的文案
- 更新点赞和收藏通知页面的国际化
- 修复 UserContentPageIndicator 的滚动问题
- 更新评论通知页面的标题文案
- 更新评论通知页面的国际化
This commit is contained in:
2024-10-03 16:38:32 +08:00
parent e48c9cc688
commit 775c6a3c14
9 changed files with 107 additions and 61 deletions

View File

@@ -161,7 +161,7 @@ fun AccountEditScreen2() {
} }
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize(), .fillMaxSize().background(Color.White),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
StatusBarSpacer() StatusBarSpacer()
@@ -210,13 +210,13 @@ fun AccountEditScreen2() {
.size(32.dp) .size(32.dp)
.clip(CircleShape) .clip(CircleShape)
.background(AppColors.mainColor) .background(AppColors.mainColor)
.align(Alignment.BottomEnd).noRippleClickable { .align(Alignment.BottomEnd)
.noRippleClickable {
Intent(Intent.ACTION_PICK).apply { Intent(Intent.ACTION_PICK).apply {
type = "image/*" type = "image/*"
pickImageLauncher.launch(this) pickImageLauncher.launch(this)
} }
} },
,
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Icon( Icon(
@@ -229,14 +229,16 @@ fun AccountEditScreen2() {
} }
Spacer(modifier = Modifier.height(46.dp)) Spacer(modifier = Modifier.height(46.dp))
Column( Column(
modifier = Modifier.padding(horizontal = 24.dp).border( modifier = Modifier
width = 1.dp, .padding(horizontal = 16.dp)
color = Color(0xFFEBEBEB),
)
) { ) {
Row( Row(
modifier = Modifier.padding(16.dp), modifier = Modifier
.clip(RoundedCornerShape(24.dp))
.background(Color(0xfff8f8f8))
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
Text( Text(
text = stringResource(R.string.nickname), text = stringResource(R.string.nickname),
@@ -263,15 +265,12 @@ fun AccountEditScreen2() {
.padding(start = 16.dp) .padding(start = 16.dp)
) )
} }
Box( Spacer(modifier = Modifier.height(16.dp))
modifier = Modifier
.fillMaxWidth()
.height(1.dp)
.padding(horizontal = 16.dp)
.background(Color(0xFFEBEBEB))
)
Row( Row(
modifier = Modifier.padding(16.dp), modifier = Modifier
.clip(RoundedCornerShape(16.dp))
.background(Color(0xfff8f8f8))
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
Text( Text(

View File

@@ -22,6 +22,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
@@ -32,6 +33,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.LocalNavController
import com.aiosman.riderpro.R
import com.aiosman.riderpro.entity.CommentEntity import com.aiosman.riderpro.entity.CommentEntity
import com.aiosman.riderpro.exp.timeAgo import com.aiosman.riderpro.exp.timeAgo
import com.aiosman.riderpro.ui.NavigationRoute import com.aiosman.riderpro.ui.NavigationRoute
@@ -68,7 +70,7 @@ fun CommentNoticeScreen() {
.fillMaxWidth() .fillMaxWidth()
.padding(16.dp) .padding(16.dp)
) { ) {
NoticeScreenHeader("Comment", moreIcon = false) NoticeScreenHeader(stringResource(R.string.comment), moreIcon = false)
} }
LazyColumn( LazyColumn(

View File

@@ -22,7 +22,13 @@
package com.aiosman.riderpro.ui.composables.toolbar package com.aiosman.riderpro.ui.composables.toolbar
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.gestures.ScrollableDefaults import androidx.compose.foundation.gestures.ScrollableDefaults
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@@ -35,7 +41,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.ParentDataModifier import androidx.compose.ui.layout.ParentDataModifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.IntSize
import kotlin.math.max import kotlin.math.max
@@ -87,6 +95,7 @@ fun CollapsingToolbarScaffold(
enabled: Boolean = true, enabled: Boolean = true,
toolbarModifier: Modifier = Modifier, toolbarModifier: Modifier = Modifier,
toolbarClipToBounds: Boolean = true, toolbarClipToBounds: Boolean = true,
toolbarScrollable: Boolean = false,
toolbar: @Composable CollapsingToolbarScope.() -> Unit, toolbar: @Composable CollapsingToolbarScope.() -> Unit,
body: @Composable CollapsingToolbarScaffoldScope.() -> Unit body: @Composable CollapsingToolbarScaffoldScope.() -> Unit
) { ) {
@@ -98,6 +107,7 @@ fun CollapsingToolbarScaffold(
} }
val toolbarState = state.toolbarState val toolbarState = state.toolbarState
val toolbarScrollState = rememberScrollState()
Layout( Layout(
content = { content = {
@@ -106,6 +116,12 @@ fun CollapsingToolbarScaffold(
clipToBounds = toolbarClipToBounds, clipToBounds = toolbarClipToBounds,
collapsingToolbarState = toolbarState, collapsingToolbarState = toolbarState,
) { ) {
ToolbarScrollableBox(
enabled,
toolbarScrollable,
toolbarState,
toolbarScrollState
)
toolbar() toolbar()
} }
@@ -181,6 +197,24 @@ fun CollapsingToolbarScaffold(
} }
} }
@Composable
private fun ToolbarScrollableBox(
enabled: Boolean,
toolbarScrollable: Boolean,
toolbarState: CollapsingToolbarState,
toolbarScrollState: ScrollState
) {
val toolbarScrollableEnabled = enabled && toolbarScrollable
if (toolbarScrollableEnabled && toolbarState.height != Constraints.Infinity) {
Box(
modifier = Modifier
.fillMaxWidth()
.height(with(LocalDensity.current) { toolbarState.height.toDp() })
.verticalScroll(state = toolbarScrollState)
)
}
}
internal object CollapsingToolbarScaffoldScopeInstance: CollapsingToolbarScaffoldScope { internal object CollapsingToolbarScaffoldScopeInstance: CollapsingToolbarScaffoldScope {
@ExperimentalToolbarApi @ExperimentalToolbarApi
override fun Modifier.align(alignment: Alignment): Modifier = override fun Modifier.align(alignment: Alignment): Modifier =

View File

@@ -15,6 +15,7 @@ fun ToolbarWithFabScaffold(
toolbarModifier: Modifier = Modifier, toolbarModifier: Modifier = Modifier,
toolbarClipToBounds: Boolean = true, toolbarClipToBounds: Boolean = true,
toolbar: @Composable CollapsingToolbarScope.() -> Unit, toolbar: @Composable CollapsingToolbarScope.() -> Unit,
toolbarScrollable: Boolean = false,
fab: @Composable () -> Unit, fab: @Composable () -> Unit,
fabPosition: FabPosition = FabPosition.End, fabPosition: FabPosition = FabPosition.End,
body: @Composable CollapsingToolbarScaffoldScope.() -> Unit body: @Composable CollapsingToolbarScaffoldScope.() -> Unit
@@ -37,7 +38,8 @@ fun ToolbarWithFabScaffold(
toolbarModifier = toolbarModifier, toolbarModifier = toolbarModifier,
toolbarClipToBounds = toolbarClipToBounds, toolbarClipToBounds = toolbarClipToBounds,
toolbar = toolbar, toolbar = toolbar,
body = body body = body,
toolbarScrollable = toolbarScrollable
) )
}.map { it.measure(toolbarScaffoldConstraints) } }.map { it.measure(toolbarScaffoldConstraints) }

View File

@@ -8,6 +8,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts 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.ScrollState
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -33,6 +34,7 @@ import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
@@ -48,8 +50,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.geometry.Offset
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.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@@ -58,8 +64,11 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.media3.common.util.Log
import androidx.media3.common.util.UnstableApi
import androidx.paging.PagingData import androidx.paging.PagingData
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import com.aiosman.riderpro.AppState
import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.LocalNavController
import com.aiosman.riderpro.R import com.aiosman.riderpro.R
import com.aiosman.riderpro.entity.AccountProfileEntity import com.aiosman.riderpro.entity.AccountProfileEntity
@@ -122,9 +131,12 @@ fun ProfileV3(
Box { Box {
CollapsingToolbarScaffold( CollapsingToolbarScaffold(
modifier = Modifier.fillMaxSize(), modifier = Modifier
.fillMaxSize()
.background(Color(0xfff8f8f8)),
state = state, state = state,
scrollStrategy = ScrollStrategy.ExitUntilCollapsed, scrollStrategy = ScrollStrategy.ExitUntilCollapsed,
toolbarScrollable = true,
enabled = enabled, enabled = enabled,
toolbar = { toolbar = {
Column( Column(
@@ -133,8 +145,6 @@ fun ProfileV3(
// 保持在最低高度和当前高度之间 // 保持在最低高度和当前高度之间
.background(Color(0xfff8f8f8)) .background(Color(0xfff8f8f8))
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
) { ) {
StatusBarSpacer() StatusBarSpacer()
@@ -161,20 +171,6 @@ fun ProfileV3(
} }
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
} }
// Column(
// modifier = Modifier.fillMaxWidth()
//
// ) {
// StatusBarSpacer()
// Box(
// modifier = Modifier
// .background(Color.White)
// .fillMaxWidth()
// .height(64.dp)
// ) {
//
// }
// }
Box( Box(
modifier = Modifier modifier = Modifier
.parallax(0.5f) .parallax(0.5f)
@@ -333,15 +329,18 @@ fun ProfileV3(
navController.navigate(NavigationRoute.AccountEdit.route) navController.navigate(NavigationRoute.AccountEdit.route)
} }
} else { } else {
OtherProfileAction( if (it.id != AppState.UserId) {
it, OtherProfileAction(
onFollow = { it,
onFollowClick() onFollow = {
}, onFollowClick()
onChat = { },
onChatClick() onChat = {
} onChatClick()
) }
)
}
} }
} }
@@ -414,7 +413,7 @@ fun ProfileV3(
} }
items(moments.itemCount) { idx -> items(moments.itemCount) { idx ->
val moment = moments[idx] ?: return@items val moment = moments[idx] ?: return@items
GalleryItem(moment,idx) GalleryItem(moment, idx)
} }
items(2) { items(2) {
Spacer(modifier = Modifier.height(120.dp)) Spacer(modifier = Modifier.height(120.dp))
@@ -426,7 +425,7 @@ fun ProfileV3(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
) { ) {
if (moments.itemCount == 0) { if (moments.itemCount == 0 && isSelf) {
item { item {
EmptyMomentPostUnit() EmptyMomentPostUnit()
} }

View File

@@ -9,7 +9,9 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@@ -33,6 +35,7 @@ fun UserContentPageIndicator(
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
Row( Row(
modifier = Modifier modifier = Modifier
.verticalScroll(rememberScrollState())
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp), .padding(horizontal = 16.dp),
) { ) {

View File

@@ -114,7 +114,6 @@ fun LikeNoticeScreen() {
} }
} }
@Composable @Composable
fun ActionPostNoticeItem( fun ActionPostNoticeItem(
avatar: String, avatar: String,
@@ -165,8 +164,8 @@ fun ActionPostNoticeItem(
Text(nickName, fontWeight = FontWeight.Bold, fontSize = 16.sp) Text(nickName, fontWeight = FontWeight.Bold, fontSize = 16.sp)
Spacer(modifier = Modifier.height(2.dp)) Spacer(modifier = Modifier.height(2.dp))
when (action) { when (action) {
"like" -> Text("Like your post") "like" -> Text(stringResource(R.string.like_your_post))
"favourite" -> Text("Favourite your post") "favourite" -> Text(stringResource(R.string.favourite_your_post))
} }
Spacer(modifier = Modifier.height(2.dp)) Spacer(modifier = Modifier.height(2.dp))
Row { Row {
@@ -190,16 +189,18 @@ fun LikeCommentNoticeItem(
val navController = LocalNavController.current val navController = LocalNavController.current
val context = LocalContext.current val context = LocalContext.current
Box( Box(
modifier = Modifier.padding(vertical = 16.dp).noRippleClickable { modifier = Modifier
item.comment?.postId.let { .padding(vertical = 16.dp)
navController.navigateToPost( .noRippleClickable {
id = it ?: 0, item.comment?.postId.let {
highlightCommentId = item.comment?.id ?: 0, navController.navigateToPost(
initImagePagerIndex = 0 id = it ?: 0,
) highlightCommentId = item.comment?.id ?: 0,
} initImagePagerIndex = 0
)
}
} }
) { ) {
Column( Column(
@@ -213,7 +214,7 @@ fun LikeCommentNoticeItem(
modifier = Modifier modifier = Modifier
.size(48.dp) .size(48.dp)
.clip(CircleShape), .clip(CircleShape),
contentDescription = "Like your comment" contentDescription = stringResource(R.string.like_your_comment)
) )
Spacer(modifier = Modifier.width(12.dp)) Spacer(modifier = Modifier.width(12.dp))
Column( Column(
@@ -222,7 +223,7 @@ fun LikeCommentNoticeItem(
) { ) {
Text(item.user.nickName, fontWeight = FontWeight.Bold, fontSize = 16.sp) Text(item.user.nickName, fontWeight = FontWeight.Bold, fontSize = 16.sp)
Spacer(modifier = Modifier.height(2.dp)) Spacer(modifier = Modifier.height(2.dp))
Text("Like your comment") Text(stringResource(R.string.like_your_comment))
Spacer(modifier = Modifier.height(2.dp)) Spacer(modifier = Modifier.height(2.dp))
Row { Row {
Text( Text(

View File

@@ -76,4 +76,7 @@
<string name="private_policy_keyword">用户协议</string> <string name="private_policy_keyword">用户协议</string>
<string name="gallery">图片</string> <string name="gallery">图片</string>
<string name="chat_upper">私信</string> <string name="chat_upper">私信</string>
<string name="like_your_post">喜欢了你的动态</string>
<string name="favourite_your_post">收藏了你的动态</string>
<string name="like_your_comment">喜欢了你的评论</string>
</resources> </resources>

View File

@@ -75,4 +75,7 @@
<string name="private_policy_keyword">Rider Pros Privacy Policy</string> <string name="private_policy_keyword">Rider Pros Privacy Policy</string>
<string name="gallery">Gallery</string> <string name="gallery">Gallery</string>
<string name="chat_upper">CHAT</string> <string name="chat_upper">CHAT</string>
<string name="like_your_post">Like your post</string>
<string name="favourite_your_post">Favourite your post</string>
<string name="like_your_comment">Like your comment</string>
</resources> </resources>