Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit f9b7c542 authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

feat(message-list): add long click support to MessageItem

parent 9e6c3f82
Loading
Loading
Loading
Loading
+94 −18
Original line number Diff line number Diff line
@@ -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,16 @@ 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.SnackbarHostState
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.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import net.thunderbird.core.ui.compose.designsystem.organism.message.ActiveMessageItem
@@ -141,21 +147,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 +193,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,8 +221,13 @@ private fun ColumnScope.CatalogNewMessageItem(config: MessageItemConfiguration)
            }
        },
        onClick = {
            if (selected) {
                selected = false
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Clicked!")
            }
        },
        onLongClick = {
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Long clicked!")
            }
        },
        onFavouriteChange = { favourite = it },
@@ -217,15 +239,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,8 +273,13 @@ private fun ColumnScope.CatalogUnreadMessageItem(config: MessageItemConfiguratio
            }
        },
        onClick = {
            if (selected) {
                selected = false
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Clicked!")
            }
        },
        onLongClick = {
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Long clicked!")
            }
        },
        onFavouriteChange = { favourite = it },
@@ -256,15 +291,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,8 +325,13 @@ private fun ColumnScope.CatalogReadMessageItem(config: MessageItemConfiguration)
            }
        },
        onClick = {
            if (selected) {
                selected = false
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Clicked!")
            }
        },
        onLongClick = {
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Long clicked!")
            }
        },
        onFavouriteChange = { favourite = it },
@@ -295,15 +343,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,8 +377,13 @@ private fun ColumnScope.CatalogActiveMessageItem(config: MessageItemConfiguratio
            }
        },
        onClick = {
            if (selected) {
                selected = false
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Clicked!")
            }
        },
        onLongClick = {
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Long clicked!")
            }
        },
        onFavouriteChange = { favourite = it },
@@ -334,14 +395,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,8 +427,13 @@ private fun ColumnScope.CatalogJunkMessageItem(config: MessageItemConfiguration)
            }
        },
        onClick = {
            if (selected) {
                selected = false
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Clicked!")
            }
        },
        onLongClick = {
            coroutineScope.launch {
                snackbarHostState.showSnackbar("Long clicked!")
            }
        },
        modifier = Modifier.fillMaxWidth(),
@@ -370,6 +444,8 @@ private fun ColumnScope.CatalogJunkMessageItem(config: MessageItemConfiguration)
        },
        maxPreviewLines = config.maxPreviewLines,
    )

    SnackbarHost(snackbarHostState)
}

@Composable
+5 −2
Original line number Diff line number Diff line
@@ -132,6 +132,7 @@ private fun PreviewDefault(
                }
            },
            onClick = { },
            onLongClick = { },
            onFavouriteChange = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
@@ -156,6 +157,7 @@ private fun PreviewCompact(
            receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC),
            avatar = { },
            onClick = { },
            onLongClick = { },
            onFavouriteChange = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
@@ -181,6 +183,7 @@ private fun PreviewRelaxed(
            receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC),
            avatar = { },
            onClick = { },
            onLongClick = { },
            onFavouriteChange = {},
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
+3 −0
Original line number Diff line number Diff line
@@ -127,6 +127,7 @@ private fun PreviewDefault(
                }
            },
            onClick = { },
            onLongClick = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
            selected = params.selected,
@@ -149,6 +150,7 @@ private fun PreviewCompact(
            receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC),
            avatar = { },
            onClick = { },
            onLongClick = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
            selected = params.selected,
@@ -172,6 +174,7 @@ private fun PreviewRelaxed(
            receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC),
            avatar = { },
            onClick = { },
            onLongClick = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
            selected = params.selected,
+3 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ private fun PreviewDefault(
            },
            receivedAt = params.receivedAt,
            onClick = { },
            onLongClick = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
            selected = params.selected,
@@ -149,6 +150,7 @@ private fun PreviewCompact(
            },
            receivedAt = params.receivedAt,
            onClick = { },
            onLongClick = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
            selected = params.selected,
@@ -186,6 +188,7 @@ private fun PreviewRelaxed(
            },
            receivedAt = params.receivedAt,
            onClick = { },
            onLongClick = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
            selected = params.selected,
+6 −3
Original line number Diff line number Diff line
@@ -132,6 +132,7 @@ private fun PreviewDefault(
                }
            },
            onClick = { },
            onLongClick = { },
            onFavouriteChange = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
@@ -156,6 +157,7 @@ private fun PreviewCompact(
            receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC),
            avatar = { },
            onClick = { },
            onLongClick = { },
            onFavouriteChange = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
@@ -181,6 +183,7 @@ private fun PreviewRelaxed(
            receivedAt = @OptIn(ExperimentalTime::class) Clock.System.now().toLocalDateTime(TimeZone.UTC),
            avatar = { },
            onClick = { },
            onLongClick = { },
            onFavouriteChange = { },
            modifier = Modifier.padding(MainTheme.spacings.double),
            hasAttachments = params.hasAttachments,
Loading