From 48197ffd1e42742fb2564f8edd208c345394e81f Mon Sep 17 00:00:00 2001 From: null Date: Sat, 11 Jul 2026 19:31:42 -0500 Subject: [PATCH] refactor(home): extract action feed -> components/HomeActionFeed.kt Step 5/9. Verbatim move (section public, card private). compileDebugKotlin green. Co-Authored-By: Claude Fable 5 --- .../java/app/closer/ui/home/HomeScreen.kt | 97 +------------- .../ui/home/components/HomeActionFeed.kt | 124 ++++++++++++++++++ 2 files changed, 125 insertions(+), 96 deletions(-) create mode 100644 app/src/main/java/app/closer/ui/home/components/HomeActionFeed.kt diff --git a/app/src/main/java/app/closer/ui/home/HomeScreen.kt b/app/src/main/java/app/closer/ui/home/HomeScreen.kt index cd904e9b..7f51fd97 100644 --- a/app/src/main/java/app/closer/ui/home/HomeScreen.kt +++ b/app/src/main/java/app/closer/ui/home/HomeScreen.kt @@ -87,6 +87,7 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.hilt.navigation.compose.hiltViewModel import app.closer.R +import app.closer.ui.home.components.ActionFeedSection import app.closer.ui.home.components.CategoryPreviewGrid import app.closer.ui.home.components.EmptyHomeContent import app.closer.ui.home.components.ErrorHomeCard @@ -1181,102 +1182,6 @@ private fun PrimaryHomeActionCard( } } -@Composable -private fun ActionFeedSection( - actions: List, - onAction: (HomeAction) -> Unit -) { - if (actions.isEmpty()) return - - Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { - Text( - text = "More ways to connect", - style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.SemiBold), - color = MaterialTheme.colorScheme.onSurface - ) - actions.forEach { action -> - SecondaryHomeActionCard(action = action, onAction = onAction) - } - } -} - -@Composable -private fun SecondaryHomeActionCard( - action: HomeAction, - onAction: (HomeAction) -> Unit -) { - val colors = action.tone.actionColors() - - CloserClickableCard( - onClick = { onAction(action) }, - modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(CloserRadii.Card), - containerColor = MaterialTheme.colorScheme.surface, - elevation = CloserElevations.Card - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - horizontalArrangement = Arrangement.spacedBy(13.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Box( - modifier = Modifier - .size(40.dp) - .background(colors.soft, RoundedCornerShape(CloserRadii.Button)), - contentAlignment = Alignment.Center - ) { - HomeGlyphIcon( - resId = homeActionGlyph(action.target), - contentDescription = null, - tint = colors.deep, - modifier = Modifier.size(20.dp) - ) - } - Column( - modifier = Modifier.weight(1f), - verticalArrangement = Arrangement.spacedBy(4.dp) - ) { - Text( - text = action.eyebrow, - style = MaterialTheme.typography.labelMedium, - color = colors.deep, - fontWeight = FontWeight.SemiBold, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - Text( - text = action.title, - style = MaterialTheme.typography.titleSmall.copy(fontWeight = FontWeight.SemiBold), - color = MaterialTheme.colorScheme.onSurface, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - Text( - text = action.body, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - maxLines = 2, - overflow = TextOverflow.Ellipsis - ) - } - Surface( - shape = RoundedCornerShape(CloserRadii.Button), - color = colors.soft - ) { - HomeGlyphIcon( - resId = R.drawable.glyph_forward, - contentDescription = action.cta, - tint = colors.deep, - modifier = Modifier - .padding(9.dp) - .size(18.dp) - ) - } - } - } -} @Composable private fun MomentCueCard() { diff --git a/app/src/main/java/app/closer/ui/home/components/HomeActionFeed.kt b/app/src/main/java/app/closer/ui/home/components/HomeActionFeed.kt new file mode 100644 index 00000000..8c4b1ff6 --- /dev/null +++ b/app/src/main/java/app/closer/ui/home/components/HomeActionFeed.kt @@ -0,0 +1,124 @@ +package app.closer.ui.home.components + +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.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import app.closer.R +import app.closer.ui.components.CloserClickableCard +import app.closer.ui.components.CloserElevations +import app.closer.ui.components.CloserRadii +import app.closer.ui.home.HomeAction + +/** Home's "More ways to connect" secondary action feed. Extracted from HomeScreen.kt. */ + +@Composable +fun ActionFeedSection( + actions: List, + onAction: (HomeAction) -> Unit +) { + if (actions.isEmpty()) return + + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Text( + text = "More ways to connect", + style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.SemiBold), + color = MaterialTheme.colorScheme.onSurface + ) + actions.forEach { action -> + SecondaryHomeActionCard(action = action, onAction = onAction) + } + } +} + +@Composable +private fun SecondaryHomeActionCard( + action: HomeAction, + onAction: (HomeAction) -> Unit +) { + val colors = action.tone.actionColors() + + CloserClickableCard( + onClick = { onAction(action) }, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(CloserRadii.Card), + containerColor = MaterialTheme.colorScheme.surface, + elevation = CloserElevations.Card + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalArrangement = Arrangement.spacedBy(13.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .size(40.dp) + .background(colors.soft, RoundedCornerShape(CloserRadii.Button)), + contentAlignment = Alignment.Center + ) { + HomeGlyphIcon( + resId = homeActionGlyph(action.target), + contentDescription = null, + tint = colors.deep, + modifier = Modifier.size(20.dp) + ) + } + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = action.eyebrow, + style = MaterialTheme.typography.labelMedium, + color = colors.deep, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = action.title, + style = MaterialTheme.typography.titleSmall.copy(fontWeight = FontWeight.SemiBold), + color = MaterialTheme.colorScheme.onSurface, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = action.body, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } + Surface( + shape = RoundedCornerShape(CloserRadii.Button), + color = colors.soft + ) { + HomeGlyphIcon( + resId = R.drawable.glyph_forward, + contentDescription = action.cta, + tint = colors.deep, + modifier = Modifier + .padding(9.dp) + .size(18.dp) + ) + } + } + } +}