common: flesh out UserProfile

This commit is contained in:
Harsh Shandilya 2022-05-10 14:32:59 +05:30
parent 74a7e0428d
commit 50b4e8bf8c
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80

View file

@ -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,
)
}
}
}