diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/message/CatalogMessageItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/message/CatalogMessageItems.kt index c4db7f02ec6..17b4584f69d 100644 --- a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/message/CatalogMessageItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/message/CatalogMessageItems.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -29,11 +30,14 @@ import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleSmall import app.k9mail.core.ui.compose.designsystem.atom.textfield.TextFieldOutlined import app.k9mail.core.ui.compose.designsystem.molecule.input.CheckboxInput +import app.k9mail.core.ui.compose.designsystem.organism.snackbar.SnackbarHost +import app.k9mail.core.ui.compose.designsystem.organism.snackbar.rememberSnackbarHostState import app.k9mail.core.ui.compose.theme2.MainTheme import kotlin.math.roundToInt import kotlin.random.Random import kotlin.time.Clock import kotlin.time.ExperimentalTime +import kotlinx.coroutines.launch import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime import net.thunderbird.core.ui.compose.designsystem.organism.message.ActiveMessageItem @@ -99,6 +103,7 @@ private data class MessageItemConfiguration( val maxPreviewLines: Int, ) +@Suppress("LongMethod") @Composable private fun MessageItemConfiguration( config: MessageItemConfiguration, @@ -141,21 +146,27 @@ private fun MessageItemConfiguration( label = "Sender", onValueChange = onSenderChange, isSingleLine = true, - modifier = Modifier.fillMaxWidth().padding(horizontal = MainTheme.spacings.double), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MainTheme.spacings.double), ) TextFieldOutlined( value = config.subject, label = "Subject", onValueChange = onSubjectChange, isSingleLine = true, - modifier = Modifier.fillMaxWidth().padding(horizontal = MainTheme.spacings.double), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MainTheme.spacings.double), ) TextFieldOutlined( value = config.preview, label = "Preview", onValueChange = onPreviewChange, isSingleLine = false, - modifier = Modifier.fillMaxWidth().padding(horizontal = MainTheme.spacings.double), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = MainTheme.spacings.double), ) Column(modifier = Modifier.padding(horizontal = MainTheme.spacings.double)) { TextLabelSmall(text = "Preview lines: ${config.maxPreviewLines}") @@ -181,12 +192,17 @@ private fun CatalogMessageItems(config: MessageItemConfiguration, modifier: Modi } @Composable -private fun ColumnScope.CatalogNewMessageItem(config: MessageItemConfiguration) { +private fun ColumnScope.CatalogNewMessageItem( + config: MessageItemConfiguration, +) { if (!config.hideSection) { Section(text = "New Message", modifier = Modifier.padding(vertical = MainTheme.spacings.double)) } var selected by remember { mutableStateOf(false) } var favourite by remember { mutableStateOf(false) } + val snackbarHostState = rememberSnackbarHostState() + val coroutineScope = rememberCoroutineScope() + NewMessageItem( sender = config.sender, subject = config.subject, @@ -204,10 +220,18 @@ private fun ColumnScope.CatalogNewMessageItem(config: MessageItemConfiguration) } }, onClick = { - if (selected) { - selected = false + coroutineScope.launch { + snackbarHostState.showSnackbar("Clicked!") + } + }, + onLongClick = { + coroutineScope.launch { + snackbarHostState.showSnackbar("Long clicked!") } }, + onLeadingClick = { + selected = !selected + }, onFavouriteChange = { favourite = it }, modifier = Modifier.fillMaxWidth(), selected = selected, @@ -217,15 +241,23 @@ private fun ColumnScope.CatalogNewMessageItem(config: MessageItemConfiguration) }, maxPreviewLines = config.maxPreviewLines, ) + + SnackbarHost(snackbarHostState) } @Composable -private fun ColumnScope.CatalogUnreadMessageItem(config: MessageItemConfiguration) { +private fun ColumnScope.CatalogUnreadMessageItem( + config: MessageItemConfiguration, +) { if (!config.hideSection) { Section(text = "Unread Message", modifier = Modifier.padding(vertical = MainTheme.spacings.double)) } var selected by remember { mutableStateOf(false) } var favourite by remember { mutableStateOf(false) } + + val snackbarHostState = rememberSnackbarHostState() + val coroutineScope = rememberCoroutineScope() + UnreadMessageItem( sender = config.sender, subject = config.subject, @@ -243,10 +275,18 @@ private fun ColumnScope.CatalogUnreadMessageItem(config: MessageItemConfiguratio } }, onClick = { - if (selected) { - selected = false + coroutineScope.launch { + snackbarHostState.showSnackbar("Clicked!") + } + }, + onLongClick = { + coroutineScope.launch { + snackbarHostState.showSnackbar("Long clicked!") } }, + onLeadingClick = { + selected = !selected + }, onFavouriteChange = { favourite = it }, modifier = Modifier.fillMaxWidth(), selected = selected, @@ -256,15 +296,23 @@ private fun ColumnScope.CatalogUnreadMessageItem(config: MessageItemConfiguratio }, maxPreviewLines = config.maxPreviewLines, ) + + SnackbarHost(snackbarHostState) } @Composable -private fun ColumnScope.CatalogReadMessageItem(config: MessageItemConfiguration) { +private fun ColumnScope.CatalogReadMessageItem( + config: MessageItemConfiguration, +) { if (!config.hideSection) { Section(text = "Read Message", modifier = Modifier.padding(vertical = MainTheme.spacings.double)) } var selected by remember { mutableStateOf(false) } var favourite by remember { mutableStateOf(false) } + + val snackbarHostState = rememberSnackbarHostState() + val coroutineScope = rememberCoroutineScope() + ReadMessageItem( sender = config.sender, subject = config.subject, @@ -282,10 +330,18 @@ private fun ColumnScope.CatalogReadMessageItem(config: MessageItemConfiguration) } }, onClick = { - if (selected) { - selected = false + coroutineScope.launch { + snackbarHostState.showSnackbar("Clicked!") } }, + onLongClick = { + coroutineScope.launch { + snackbarHostState.showSnackbar("Long clicked!") + } + }, + onLeadingClick = { + selected = !selected + }, onFavouriteChange = { favourite = it }, modifier = Modifier.fillMaxWidth(), selected = selected, @@ -295,15 +351,23 @@ private fun ColumnScope.CatalogReadMessageItem(config: MessageItemConfiguration) }, maxPreviewLines = config.maxPreviewLines, ) + + SnackbarHost(snackbarHostState) } @Composable -private fun ColumnScope.CatalogActiveMessageItem(config: MessageItemConfiguration) { +private fun ColumnScope.CatalogActiveMessageItem( + config: MessageItemConfiguration, +) { if (!config.hideSection) { Section(text = "Active Message", modifier = Modifier.padding(vertical = MainTheme.spacings.double)) } var selected by remember { mutableStateOf(false) } var favourite by remember { mutableStateOf(false) } + + val snackbarHostState = rememberSnackbarHostState() + val coroutineScope = rememberCoroutineScope() + ActiveMessageItem( sender = config.sender, subject = config.subject, @@ -321,10 +385,18 @@ private fun ColumnScope.CatalogActiveMessageItem(config: MessageItemConfiguratio } }, onClick = { - if (selected) { - selected = false + coroutineScope.launch { + snackbarHostState.showSnackbar("Clicked!") } }, + onLongClick = { + coroutineScope.launch { + snackbarHostState.showSnackbar("Long clicked!") + } + }, + onLeadingClick = { + selected = !selected + }, onFavouriteChange = { favourite = it }, modifier = Modifier.fillMaxWidth(), selected = selected, @@ -334,14 +406,22 @@ private fun ColumnScope.CatalogActiveMessageItem(config: MessageItemConfiguratio }, maxPreviewLines = config.maxPreviewLines, ) + + SnackbarHost(snackbarHostState) } @Composable -private fun ColumnScope.CatalogJunkMessageItem(config: MessageItemConfiguration) { +private fun ColumnScope.CatalogJunkMessageItem( + config: MessageItemConfiguration, +) { if (!config.hideSection) { Section(text = "Junk Message", modifier = Modifier.padding(vertical = MainTheme.spacings.double)) } var selected by remember { mutableStateOf(false) } + + val snackbarHostState = rememberSnackbarHostState() + val coroutineScope = rememberCoroutineScope() + JunkMessageItem( sender = config.sender, subject = config.subject, @@ -358,10 +438,18 @@ private fun ColumnScope.CatalogJunkMessageItem(config: MessageItemConfiguration) } }, onClick = { - if (selected) { - selected = false + coroutineScope.launch { + snackbarHostState.showSnackbar("Clicked!") } }, + onLongClick = { + coroutineScope.launch { + snackbarHostState.showSnackbar("Long clicked!") + } + }, + onLeadingClick = { + selected = !selected + }, modifier = Modifier.fillMaxWidth(), selected = selected, swapSenderWithSubject = config.swapSenderAndSubject, @@ -370,6 +458,8 @@ private fun ColumnScope.CatalogJunkMessageItem(config: MessageItemConfiguration) }, maxPreviewLines = config.maxPreviewLines, ) + + SnackbarHost(snackbarHostState) } @Composable diff --git a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItemPreview.kt b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItemPreview.kt index fdcef01a9e1..6bc93496083 100644 --- a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItemPreview.kt +++ b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItemPreview.kt @@ -132,7 +132,9 @@ private fun PreviewDefault( } }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -156,7 +158,9 @@ private fun PreviewCompact( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -181,6 +185,8 @@ private fun PreviewRelaxed( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, + onLongClick = { }, + onLeadingClick = { }, onFavouriteChange = {}, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, diff --git a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItemPreview.kt b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItemPreview.kt index 87afc401322..2dfd3d8b66b 100644 --- a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItemPreview.kt +++ b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItemPreview.kt @@ -127,6 +127,8 @@ private fun PreviewDefault( } }, onClick = { }, + onLongClick = { }, + onLeadingClick = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -149,6 +151,8 @@ private fun PreviewCompact( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, + onLongClick = { }, + onLeadingClick = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -172,6 +176,8 @@ private fun PreviewRelaxed( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, + onLongClick = { }, + onLeadingClick = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, diff --git a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItemPreview.kt b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItemPreview.kt index cf1f9436bfa..7165cd33e5e 100644 --- a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItemPreview.kt +++ b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItemPreview.kt @@ -113,6 +113,8 @@ private fun PreviewDefault( }, receivedAt = params.receivedAt, onClick = { }, + onLongClick = { }, + onLeadingClick = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -149,6 +151,8 @@ private fun PreviewCompact( }, receivedAt = params.receivedAt, onClick = { }, + onLongClick = { }, + onLeadingClick = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -186,6 +190,8 @@ private fun PreviewRelaxed( }, receivedAt = params.receivedAt, onClick = { }, + onLongClick = { }, + onLeadingClick = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, diff --git a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItemPreview.kt b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItemPreview.kt index f76d5fee015..102bbda692f 100644 --- a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItemPreview.kt +++ b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItemPreview.kt @@ -132,7 +132,9 @@ private fun PreviewDefault( } }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -156,7 +158,9 @@ private fun PreviewCompact( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -181,7 +185,9 @@ private fun PreviewRelaxed( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, diff --git a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItemPreview.kt b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItemPreview.kt index 885e09deb01..6a70dae118a 100644 --- a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItemPreview.kt +++ b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItemPreview.kt @@ -132,7 +132,9 @@ private fun PreviewDefault( } }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -156,7 +158,9 @@ private fun PreviewCompact( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -181,7 +185,9 @@ private fun PreviewRelaxed( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, diff --git a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItemPreview.kt b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItemPreview.kt index a19cf3c86ab..bb594aaee64 100644 --- a/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItemPreview.kt +++ b/core/ui/compose/designsystem/src/debug/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItemPreview.kt @@ -132,7 +132,9 @@ private fun PreviewDefault( } }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -156,7 +158,9 @@ private fun PreviewCompact( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, @@ -181,7 +185,9 @@ private fun PreviewRelaxed( receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC), avatar = { }, onClick = { }, - onFavouriteChange = {}, + onLongClick = { }, + onLeadingClick = { }, + onFavouriteChange = { }, modifier = Modifier.padding(MainTheme.spacings.double), hasAttachments = params.hasAttachments, selected = params.selected, diff --git a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItem.kt b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItem.kt index 4e05044b33d..c8b5b930ba8 100644 --- a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItem.kt +++ b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ActiveMessageItem.kt @@ -20,6 +20,8 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param favourite Whether the message is marked as favourite. * @param avatar A composable function to display the sender's avatar. * @param onClick A lambda function to be invoked when the message item is clicked. + * @param onLongClick A lambda function to be invoked when the message item is long-clicked. + * @param onLeadingClick A lambda function to be invoked when the leading avatar is clicked. * @param onFavouriteChange A lambda function to be invoked when the favourite button is clicked. * @param modifier A [Modifier] to be applied to the message item. * @param hasAttachments Whether the message has attachments. Defaults to `false`. @@ -32,6 +34,7 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param swapSenderWithSubject If `true`, the sender and subject will be swapped in their display positions. * Defaults to `false`. */ +@Suppress("LongParameterList") @Composable fun ActiveMessageItem( sender: String, @@ -40,6 +43,8 @@ fun ActiveMessageItem( receivedAt: LocalDateTime, avatar: @Composable () -> Unit, onClick: () -> Unit, + onLongClick: () -> Unit, + onLeadingClick: () -> Unit, onFavouriteChange: (Boolean) -> Unit, modifier: Modifier = Modifier, favourite: Boolean = false, @@ -72,6 +77,8 @@ fun ActiveMessageItem( action = { FavouriteButtonIcon(favourite = favourite, onFavouriteChange = onFavouriteChange) }, receivedAt = receivedAt, onClick = onClick, + onLongClick = onLongClick, + onLeadingClick = onLeadingClick, colors = if (selected) { MessageItemDefaults.selectedMessageItemColors() } else { diff --git a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItem.kt b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItem.kt index 70b760e12df..f129c5ac0b9 100644 --- a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItem.kt +++ b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/JunkMessageItem.kt @@ -11,6 +11,7 @@ import app.k9mail.core.ui.compose.theme2.MainTheme import kotlinx.datetime.LocalDateTime import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItemSenderBodyMedium +@Suppress("LongParameterList") @Composable fun JunkMessageItem( sender: String, @@ -19,6 +20,8 @@ fun JunkMessageItem( receivedAt: LocalDateTime, avatar: @Composable () -> Unit, onClick: () -> Unit, + onLongClick: () -> Unit, + onLeadingClick: () -> Unit, modifier: Modifier = Modifier, hasAttachments: Boolean = false, threadCount: Int = 0, @@ -54,6 +57,8 @@ fun JunkMessageItem( }, receivedAt = receivedAt, onClick = onClick, + onLongClick = onLongClick, + onLeadingClick = onLeadingClick, colors = if (selected) { MessageItemDefaults.selectedMessageItemColors( containerColor = MainTheme.colors.errorContainer, diff --git a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItem.kt b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItem.kt index 218c10934b7..c690d657529 100644 --- a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItem.kt +++ b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/MessageItem.kt @@ -1,6 +1,7 @@ package net.thunderbird.core.ui.compose.designsystem.organism.message import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize @@ -68,6 +69,8 @@ private const val WEEK_DAYS = 7 * @param action A composable function to display actions related to the message (e.g., star). * @param receivedAt The date and time the message was received. * @param onClick A callback function to be invoked when the message item is clicked. + * @param onLongClick A lambda function to be invoked when the message item is long-clicked. + * @param onLeadingClick A callback function to be invoked when the leading content is clicked. * @param colors The colors to be used for the message item. See [MessageItemDefaults]. * @param modifier The modifier to be applied to the message item. * @param hasAttachments A boolean indicating whether the message has attachments. @@ -80,6 +83,7 @@ private const val WEEK_DAYS = 7 * Defaults to [MessageItemDefaults.defaultContentPadding]. * @see MessageItemDefaults */ +@Suppress("LongParameterList") @Composable internal fun MessageItem( leading: @Composable () -> Unit, @@ -89,6 +93,8 @@ internal fun MessageItem( action: @Composable () -> Unit, receivedAt: LocalDateTime, onClick: () -> Unit, + onLongClick: () -> Unit, + onLeadingClick: () -> Unit, modifier: Modifier = Modifier, colors: MessageItemColors = MessageItemDefaults.readMessageItemColors(), hasAttachments: Boolean = false, @@ -100,8 +106,11 @@ internal fun MessageItem( var contentStart by remember { mutableFloatStateOf(0f) } val layoutDirection = LocalLayoutDirection.current Surface( - onClick = onClick, modifier = modifier + .combinedClickable( + onClick = onClick, + onLongClick = onLongClick, + ) .drawWithCache { onDrawWithContent { drawContent() @@ -125,7 +134,7 @@ internal fun MessageItem( .padding(contentPadding) .height(intrinsicSize = IntrinsicSize.Min), ) { - LeadingElements(selected, onClick, leading) + LeadingElements(selected, onLeadingClick, leading) Spacer(modifier = Modifier.width(MainTheme.spacings.default)) Column( modifier = Modifier @@ -177,7 +186,7 @@ private fun PreviewText( private fun LeadingElements( selected: Boolean, onClick: () -> Unit, - trailing: @Composable (() -> Unit), + leading: @Composable (() -> Unit), modifier: Modifier = Modifier, ) { AnimatedContent( @@ -187,7 +196,7 @@ private fun LeadingElements( if (selected) { SelectedIcon(onClick = onClick) } else { - trailing() + leading() } } } diff --git a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItem.kt b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItem.kt index 07e6c549c96..0d7e90cdc47 100644 --- a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItem.kt +++ b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/NewMessageItem.kt @@ -25,6 +25,8 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param favourite Whether the message is marked as favourite. * @param avatar A composable function to display the sender's avatar. * @param onClick A lambda function to be invoked when the message item is clicked. + * @param onLongClick A lambda function to be invoked when the message item is long-clicked. + * @param onLeadingClick A lambda function to be invoked when the leading avatar is clicked. * @param onFavouriteChange A lambda function to be invoked when the favourite button is clicked. * @param modifier A [Modifier] to be applied to the message item. * @param hasAttachments Whether the message has attachments. Defaults to `false`. @@ -37,6 +39,7 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param swapSenderWithSubject If `true`, the sender and subject will be swapped in their display positions. * Defaults to `false`. */ +@Suppress("LongParameterList") @Composable fun NewMessageItem( sender: String, @@ -45,6 +48,8 @@ fun NewMessageItem( receivedAt: LocalDateTime, avatar: @Composable () -> Unit, onClick: () -> Unit, + onLongClick: () -> Unit, + onLeadingClick: () -> Unit, onFavouriteChange: (Boolean) -> Unit, modifier: Modifier = Modifier, favourite: Boolean = false, @@ -86,6 +91,8 @@ fun NewMessageItem( action = { FavouriteButtonIcon(favourite = favourite, onFavouriteChange = onFavouriteChange) }, receivedAt = receivedAt, onClick = onClick, + onLongClick = onLongClick, + onLeadingClick = onLeadingClick, colors = if (selected) { MessageItemDefaults.selectedMessageItemColors() } else { diff --git a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItem.kt b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItem.kt index 8ee82fcee16..223cbc242b1 100644 --- a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItem.kt +++ b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/ReadMessageItem.kt @@ -19,6 +19,8 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param favourite Whether the message is marked as favourite. * @param avatar A composable function to display the sender's avatar. * @param onClick A lambda function to be invoked when the message item is clicked. + * @param onLongClick A lambda function to be invoked when the message item is long-clicked. + * @param onLeadingClick A lambda function to be invoked when the leading avatar is clicked. * @param onFavouriteChange A lambda function to be invoked when the favourite button is clicked. * @param modifier A [Modifier] to be applied to the message item. * @param hasAttachments Whether the message has attachments. Defaults to `false`. @@ -31,6 +33,7 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param swapSenderWithSubject If `true`, the sender and subject will be swapped in their display positions. * Defaults to `false`. */ +@Suppress("LongParameterList") @Composable fun ReadMessageItem( sender: String, @@ -39,6 +42,8 @@ fun ReadMessageItem( receivedAt: LocalDateTime, avatar: @Composable () -> Unit, onClick: () -> Unit, + onLongClick: () -> Unit, + onLeadingClick: () -> Unit, onFavouriteChange: (Boolean) -> Unit, modifier: Modifier = Modifier, favourite: Boolean = false, @@ -72,6 +77,8 @@ fun ReadMessageItem( action = { FavouriteButtonIcon(favourite = favourite, onFavouriteChange = onFavouriteChange) }, receivedAt = receivedAt, onClick = onClick, + onLongClick = onLongClick, + onLeadingClick = onLeadingClick, colors = if (selected) { MessageItemDefaults.selectedMessageItemColors() } else { diff --git a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItem.kt b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItem.kt index 3622098c920..2f60c0a8de2 100644 --- a/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItem.kt +++ b/core/ui/compose/designsystem/src/main/kotlin/net/thunderbird/core/ui/compose/designsystem/organism/message/UnreadMessageItem.kt @@ -25,6 +25,8 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param favourite Whether the message is marked as favourite. * @param avatar A composable function to display the sender's avatar. * @param onClick A lambda function to be invoked when the message item is clicked. + * @param onLongClick A lambda function to be invoked when the message item is long-clicked. + * @param onLeadingClick A lambda function to be invoked when the leading avatar is clicked. * @param onFavouriteChange A lambda function to be invoked when the favourite button is clicked. * @param modifier A [Modifier] to be applied to the message item. * @param hasAttachments Whether the message has attachments. Defaults to `false`. @@ -37,6 +39,7 @@ import net.thunderbird.core.ui.compose.designsystem.molecule.message.MessageItem * @param swapSenderWithSubject If `true`, the sender and subject will be swapped in their display positions. * Defaults to `false`. */ +@Suppress("LongParameterList") @Composable fun UnreadMessageItem( sender: String, @@ -45,6 +48,8 @@ fun UnreadMessageItem( receivedAt: LocalDateTime, avatar: @Composable () -> Unit, onClick: () -> Unit, + onLongClick: () -> Unit, + onLeadingClick: () -> Unit, onFavouriteChange: (Boolean) -> Unit, modifier: Modifier = Modifier, favourite: Boolean = false, @@ -85,6 +90,8 @@ fun UnreadMessageItem( action = { FavouriteButtonIcon(favourite = favourite, onFavouriteChange = onFavouriteChange) }, receivedAt = receivedAt, onClick = onClick, + onLongClick = onLongClick, + onLeadingClick = onLeadingClick, colors = if (selected) { MessageItemDefaults.selectedMessageItemColors() } else {