Skip to content

Commit f5833f5

Browse files
committed
feat(message-list): mark message as read when clicked
1 parent 94ff105 commit f5833f5

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

  • feature/mail/message/list

feature/mail/message/list/api/src/main/kotlin/net/thunderbird/feature/mail/message/list/ui/state/MessageItemUi.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.thunderbird.feature.mail.message.list.ui.state
22

33
import androidx.compose.runtime.Immutable
4+
import kotlinx.collections.immutable.toPersistentList
45

56
/**
67
* Represents the UI state of a single message item in a message list.
@@ -65,3 +66,29 @@ data class MessageItemUi(
6566
Unread,
6667
}
6768
}
69+
70+
/**
71+
* Create a copy of this message item with the updated [state] and refreshed sender
72+
* display name styling.
73+
*
74+
* @param state The new state to apply.
75+
* @return A new [MessageItemUi] instance with the updated state and styling.
76+
*/
77+
fun MessageItemUi.withState(state: MessageItemUi.State): MessageItemUi {
78+
val styles = buildList {
79+
when (val separatorIndex = senders.displayName.indexOf(',')) {
80+
-1 if state != MessageItemUi.State.Read -> add(ComposedAddressStyle.Bold(start = 0))
81+
in 0..Int.MAX_VALUE if state != MessageItemUi.State.Read -> {
82+
add(ComposedAddressStyle.Bold(start = 0, end = separatorIndex))
83+
add(ComposedAddressStyle.Regular(start = separatorIndex))
84+
}
85+
86+
else -> add(ComposedAddressStyle.Regular(start = 0))
87+
}
88+
}.toPersistentList()
89+
90+
return copy(
91+
senders = senders.copy(displayNameStyles = styles),
92+
state = state,
93+
)
94+
}

feature/mail/message/list/internal/src/main/kotlin/net/thunderbird/feature/mail/message/list/internal/ui/state/machine/SetupLoadedMessagesState.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import net.thunderbird.core.common.state.builder.StateMachineBuilder
55
import net.thunderbird.feature.mail.message.list.ui.event.MessageItemEvent
66
import net.thunderbird.feature.mail.message.list.ui.event.MessageListEvent
77
import net.thunderbird.feature.mail.message.list.ui.event.MessageListSearchEvent
8+
import net.thunderbird.feature.mail.message.list.ui.state.MessageItemUi
89
import net.thunderbird.feature.mail.message.list.ui.state.MessageListState
10+
import net.thunderbird.feature.mail.message.list.ui.state.withState
911

1012
/**
1113
* Defines the state transitions for the [MessageListState.LoadedMessages] state.
@@ -59,7 +61,14 @@ internal fun StateMachineBuilder<MessageListState, MessageListEvent>.loadedMessa
5961
transition<MessageItemEvent.OnMessageClick> { state, event ->
6062
state
6163
.mapMessages { message ->
62-
message.copy(active = message.id == event.message.id)
64+
val isCurrent = message.id == event.message.id
65+
message.copy(active = isCurrent).withState(
66+
if (isCurrent && message.state != MessageItemUi.State.Read) {
67+
MessageItemUi.State.Read
68+
} else {
69+
message.state
70+
},
71+
)
6372
}
6473
.withMetadata { copy(activeMessage = event.message) }
6574
}

0 commit comments

Comments
 (0)