mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-15 15:47:03 +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
|
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.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.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
|
import dev.msfjarvis.claw.model.User
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
@ -11,4 +35,52 @@ fun UserProfile(
|
||||||
getProfile: suspend (username: String) -> User,
|
getProfile: suspend (username: String) -> User,
|
||||||
modifier: Modifier = Modifier,
|
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