From 50b4e8bf8c1e6d33b0e502dfe7a8e6d09afaa215 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Tue, 10 May 2022 14:32:59 +0530 Subject: [PATCH] common: flesh out UserProfile --- .../msfjarvis/claw/common/user/UserProfile.kt | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/user/UserProfile.kt b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/user/UserProfile.kt index 4c5089cd..e96345a6 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/user/UserProfile.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/user/UserProfile.kt @@ -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(Loading) { value = Success(getProfile(username)) } + when (user) { + is Success<*> -> { + UserProfileInternal((user as Success).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, + ) + } + } }