package com.craigvg.lichun_android.ui.screens.home.components import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.craigvg.lichun_android.R import com.craigvg.lichun_android.domain.models.MessageEvent 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.HapticFeedback /** * Individual claimable event card * Ported from iOS LifeEventCard.swift */ @Composable fun LifeEventCard( event: MessageEvent, onClaim: () -> Unit ) { val isClaimed = event.claimed val isClaimable = event.isClaimable && !isClaimed val view = LocalView.current Card( modifier = Modifier .fillMaxWidth() .then( if (isClaimable) { Modifier.clickable { HapticFeedback.success(view) onClaim() } } else { Modifier } ), shape = RoundedCornerShape(AppSpacing.smallCornerRadius), colors = CardDefaults.cardColors( containerColor = if (isClaimed) { AppColors.surfaceSubtle.copy(alpha = 0.7f) } else if (isClaimable) { AppColors.primary.copy(alpha = 0.1f) } else { AppColors.surfaceSubtle } ), border = if (isClaimable) { BorderStroke(2.dp, AppColors.primary) } else null ) { Row( modifier = Modifier .fillMaxWidth() .padding(AppSpacing.sm), verticalAlignment = Alignment.CenterVertically ) { Column(modifier = Modifier.weight(1f)) { Text( text = event.message, style = AppTypography.body, color = if (isClaimed) AppColors.disabledText else AppColors.primaryText ) if (event.date != null) { Text( text = "${event.date} • ${event.hour ?: ""}", style = AppTypography.caption, color = AppColors.secondaryText ) } } if (isClaimable) { Text( text = stringResource(R.string.tap_to_claim), style = AppTypography.captionBold, color = AppColors.primary ) } else if (isClaimed) { Icon( imageVector = Icons.Default.Check, contentDescription = "Claimed", tint = AppColors.success, modifier = Modifier.size(20.dp) ) } } } }