Coverage Summary for Class: SurferInvitePendingRowKt (com.georgeci.moneysurfer.uikit.components.workspace)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| SurferInvitePendingRowKt |
0%
(0/1)
|
0%
(0/4)
|
0%
(0/12)
|
0%
(0/72)
|
0%
(0/684)
|
package com.georgeci.moneysurfer.uikit.components.workspace
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.georgeci.moneysurfer.uikit.icons.SurferIcons
import com.georgeci.moneysurfer.uikit.preview.SurferComponentPreview
import com.georgeci.moneysurfer.uikit.semantics.SurferSemantics
import com.georgeci.moneysurfer.uikit.theme.AppTheme
/**
* Pending invite row: dashed-circle bell avatar, email, status line (pending / expired with a
* colored dot), and an outlined role chip. Trailing area is reserved for caller-supplied
* actions like "more" or "resend / cancel".
*/
@Composable
fun SurferInvitePendingRow(
email: String,
statusLabel: String,
isExpired: Boolean,
roleLabel: String,
modifier: Modifier = Modifier,
) {
val statusDotColor = if (isExpired) {
AppTheme.materialColors.error
} else {
AppTheme.materialColors.tertiary
}
val outline = AppTheme.materialColors.outlineVariant
Row(
modifier = modifier
.fillMaxWidth()
.padding(horizontal = AppTheme.spacing.large, vertical = 10.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(AppTheme.spacing.medium),
) {
Box(
modifier = Modifier
.size(40.dp)
.clip(CircleShape)
.background(AppTheme.materialColors.surfaceContainerHighest)
.drawBehind {
drawRoundRect(
color = outline,
style = Stroke(width = 1.dp.toPx()),
cornerRadius = CornerRadius(size.minDimension / 2f),
)
},
contentAlignment = Alignment.Center,
) {
Icon(
imageVector = SurferIcons.Mail,
contentDescription = SurferSemantics.Decorative,
tint = AppTheme.materialColors.onSurfaceVariant,
modifier = Modifier.size(18.dp),
)
}
Column(Modifier.weight(1f)) {
Text(
text = email,
style = AppTheme.typography.bodyLarge,
color = AppTheme.materialColors.onSurface,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(6.dp),
modifier = Modifier.padding(top = 2.dp),
) {
Box(
modifier = Modifier
.size(8.dp)
.clip(CircleShape)
.background(statusDotColor),
)
Text(
text = statusLabel,
style = AppTheme.typography.bodySmall,
color = AppTheme.materialColors.onSurfaceVariant,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
}
InvitePendingRoleChip(roleLabel)
}
}
@Composable
private fun InvitePendingRoleChip(label: String) {
val outlineVariant = AppTheme.materialColors.outlineVariant
Row(
modifier = Modifier
.height(26.dp)
.clip(RoundedCornerShape(13.dp))
.drawBehind {
drawRoundRect(
color = outlineVariant,
style = Stroke(width = 1.dp.toPx()),
cornerRadius = CornerRadius(13.dp.toPx(), 13.dp.toPx()),
)
}
.padding(horizontal = 10.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = label,
style = AppTheme.typography.labelMedium,
color = AppTheme.materialColors.onSurfaceVariant,
)
}
}
@Suppress("UnusedPrivateMember")
@Preview
@Composable
private fun SurferInvitePendingRowPreview() {
SurferComponentPreview {
Column {
SurferInvitePendingRow(
email = "kasia.nowak@gmail.com",
statusLabel = "Pending ยท expires in 5 days",
isExpired = false,
roleLabel = "Editor",
)
SurferInvitePendingRow(
email = "lena@mail.com",
statusLabel = "Expired",
isExpired = true,
roleLabel = "Viewer",
)
}
}
}