package com.craigvg.lichun_android.ui.screens.messaging.components import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ChevronRight import androidx.compose.material.icons.filled.Favorite import androidx.compose.material3.* 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.graphics.Brush import androidx.compose.ui.unit.dp import com.craigvg.lichun_android.domain.models.ConversationMessage import com.craigvg.lichun_android.domain.models.Person import com.craigvg.lichun_android.ui.components.cards.BaseCard import com.craigvg.lichun_android.ui.components.images.CharacterAvatar import com.craigvg.lichun_android.ui.theme.AppColors import com.craigvg.lichun_android.ui.theme.AppSpacing import com.craigvg.lichun_android.ui.theme.AppTypography import com.craigvg.lichun_android.utils.getAffinityColor /** * Message row wrapper card with avatar, affinity, relationship badge, and unread indicator. * Ported from iOS MessageRowCard.swift */ @Composable fun MessageRowCard( person: Person, lastMessage: ConversationMessage?, isUnread: Boolean = false, modifier: Modifier = Modifier ) { val affinityColor = getAffinityColor(person.affinity) val primaryRelationship = person.relationships.firstOrNull() ?.replace("_", " ") ?.replaceFirstChar { it.uppercase() } ?: "Acquaintance" val lastMessagePreview = lastMessage?.message?.let { if (it.length > 60) it.take(60) + "..." else it } ?: "No recent messages" BaseCard(modifier = modifier) { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { // Avatar with gradient border Box( modifier = Modifier .size(66.dp) .clip(CircleShape) .background( Brush.linearGradient( listOf( affinityColor.copy(alpha = 0.25f), AppColors.accent.copy(alpha = 0.25f) ) ) ), contentAlignment = Alignment.Center ) { CharacterAvatar( imageUrl = person.image, firstName = person.firstname, lastName = person.lastname, size = 60.dp, showGlow = false ) } Spacer(modifier = Modifier.width(AppSpacing.md)) // Content Column(modifier = Modifier.weight(1f)) { // Name + affinity Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = person.fullName, style = AppTypography.headline, color = AppColors.primaryText, maxLines = 1 ) Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(2.dp) ) { Icon( imageVector = Icons.Default.Favorite, contentDescription = null, tint = affinityColor, modifier = Modifier.size(11.dp) ) Text( text = "${person.affinity}", style = AppTypography.caption, color = affinityColor ) } } // Relationship badge RelationshipBadge(relationship = primaryRelationship) Spacer(modifier = Modifier.height(4.dp)) // Message preview Text( text = lastMessagePreview, style = AppTypography.caption, color = AppColors.secondaryText, maxLines = 2 ) // Unread indicator if (isUnread) { Spacer(modifier = Modifier.height(4.dp)) Box( modifier = Modifier .size(10.dp) .clip(CircleShape) .background(AppColors.primary) ) } } // Chevron Icon( imageVector = Icons.Default.ChevronRight, contentDescription = null, tint = AppColors.secondaryText, modifier = Modifier.size(14.dp) ) } } }