mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 11:47:04 +05:30
common: flesh out UserProfile
This commit is contained in:
parent
74a7e0428d
commit
50b4e8bf8c
1 changed files with 72 additions and 0 deletions
|
@ -1,7 +1,31 @@
|
|||
package dev.msfjarvis.claw.common.user
|
||||
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.requiredSize
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.produceState
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.text.SpanStyle
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
import androidx.compose.ui.text.style.TextDecoration
|
||||
import androidx.compose.ui.text.withStyle
|
||||
import androidx.compose.ui.unit.dp
|
||||
import dev.msfjarvis.claw.common.NetworkState
|
||||
import dev.msfjarvis.claw.common.NetworkState.Loading
|
||||
import dev.msfjarvis.claw.common.NetworkState.Success
|
||||
import dev.msfjarvis.claw.common.ui.NetworkError
|
||||
import dev.msfjarvis.claw.common.ui.NetworkImage
|
||||
import dev.msfjarvis.claw.common.ui.ProgressBar
|
||||
import dev.msfjarvis.claw.model.User
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
|
@ -11,4 +35,52 @@ fun UserProfile(
|
|||
getProfile: suspend (username: String) -> User,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val user by produceState<NetworkState>(Loading) { value = Success(getProfile(username)) }
|
||||
when (user) {
|
||||
is Success<*> -> {
|
||||
UserProfileInternal((user as Success<User>).data)
|
||||
}
|
||||
is NetworkState.Error -> {
|
||||
NetworkError((user as NetworkState.Error).message)
|
||||
}
|
||||
Loading -> ProgressBar(modifier)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun UserProfileInternal(
|
||||
user: User,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
Surface(modifier = modifier) {
|
||||
Column(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp),
|
||||
modifier = Modifier.fillMaxSize().padding(top = 8.dp),
|
||||
) {
|
||||
NetworkImage(
|
||||
url = "https://lobste.rs/${user.avatarUrl}",
|
||||
contentDescription = "Avatar of ${user.username}",
|
||||
modifier = Modifier.requiredSize(120.dp).clip(CircleShape),
|
||||
)
|
||||
Text(
|
||||
text = user.username,
|
||||
style = MaterialTheme.typography.displaySmall,
|
||||
)
|
||||
Text(
|
||||
text = user.about,
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
)
|
||||
Text(
|
||||
text =
|
||||
buildAnnotatedString {
|
||||
append("Invited by ")
|
||||
withStyle(style = SpanStyle(textDecoration = TextDecoration.Underline)) {
|
||||
append(user.invitedBy)
|
||||
}
|
||||
},
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue