Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,22 @@ abstract class BaseStateMachineViewModel<TState : Any, TEvent : Any, TUiSideEffe
val newState = stateMachine.process(event)
if (newState != currentState) {
logger.verbose { "event(${event::class.simpleName}): state update." }
} else {
onEventWithoutStateModification(event, currentState)
}

sideEffectHandlers.forEach { it.handle(event, oldState = currentState, newState = newState) }
}
}

/**
* Processes an event without making changes to the state machine's state. Useful for
* events without state transition.
*
* @param event The [TEvent] to be processed.
* @param currentState The current state of the [StateMachine].
*/
protected open fun onEventWithoutStateModification(event: TEvent, currentState: TState) {
// Override this method to handle events that doesn't trigger state changes.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,8 @@ sealed interface MessageListEffect {
data class ScrollToMessage(val message: MessageItemUi) : MessageListEffect

data class OpenMessage(val message: MessageItemUi) : MessageListEffect

// region [ Legacy Support ]
data object TriggerOnFooterClicked : MessageListEffect
// endregion [ Legacy Support ]
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,8 @@ sealed interface MessageListEvent {
* @see MessageListEvent
*/
data object LoadNextPage : UserEvent

// region [ Legacy Support events ]
data class UpdateFooter(val footer: String?) : SystemEvent
// endregion [ Legacy Support events ]
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,11 @@ internal class MessageListViewModel(
}
.launchIn(viewModelScope)
}

override fun onEventWithoutStateModification(event: MessageListEvent, currentState: MessageListState) {
when (event) {
is MessageListEvent.OnFooterClick -> emitEffect(MessageListEffect.TriggerOnFooterClicked)
else -> Unit
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package net.thunderbird.feature.mail.message.list.internal.ui.component.template

import androidx.compose.animation.core.snap
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
Expand All @@ -20,6 +22,7 @@ import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch
import net.thunderbird.core.ui.compose.common.modifier.testTagAsResourceId
import net.thunderbird.core.ui.compose.theme2.MainTheme
import net.thunderbird.feature.mail.message.list.internal.ui.component.MessageListItem
import net.thunderbird.feature.mail.message.list.internal.ui.component.organism.MessageListFooter
import net.thunderbird.feature.mail.message.list.internal.ui.component.organism.MessageListSwipeableItem
Expand Down Expand Up @@ -49,6 +52,7 @@ internal fun MessageListScope.MessageList(
LazyColumn(
modifier = modifier.testTagAsResourceId(TEST_TAG_MESSAGE_LIST_ROOT),
state = listState,
contentPadding = PaddingValues(bottom = MainTheme.sizes.large),
) {
items(
items = state.messages,
Expand Down Expand Up @@ -81,8 +85,11 @@ internal fun MessageListScope.MessageList(
)
}
}
item {
MessageListFooter(state, dispatchEvent, Modifier.animateItem())

if (state.metadata.footer.text.isNotBlank()) {
item {
MessageListFooter(state, dispatchEvent, Modifier.animateItem(placementSpec = snap()))
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,14 @@ internal fun StateMachineBuilder<MessageListState, MessageListEvent>.globalState
transition<MessageItemEvent.OnFocusExit> { currentState, _ ->
currentState.withMetadata { copy(focusedMessage = null) }
}

// #region [ Legacy support ]
transition<MessageListEvent.UpdateFooter> { state, event ->
state.withMetadata {
val showFooter = event.footer?.isNotBlank() == true
copy(footer = footer.copy(showFooter = showFooter, text = event.footer.orEmpty()))
}
}
// #endregion [ Legacy support ]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1303,7 +1303,7 @@ class MessageListFragment :
}

override fun updateFooterText(text: String?) {
// TODO(#10778): trigger update footer text event.
viewModel.event(MessageListEvent.UpdateFooter(text))
}

private fun selectAll() {
Expand Down Expand Up @@ -2452,6 +2452,7 @@ class MessageListFragment :
openMessage(messageReference)
}

MessageListEffect.TriggerOnFooterClicked -> onFooterClicked()
else -> Unit
}
}
Expand Down
Loading