Merge pull request #5698 from element-hq/feature/bma/handleEvent

Code consistency around view event handling
This commit is contained in:
Benoit Marty 2025-11-10 09:36:04 +01:00 committed by GitHub
commit 8769b98862
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
105 changed files with 260 additions and 250 deletions

View file

@ -221,7 +221,7 @@ class MessagesPresenter(
onPauseOrDispose {}
}
fun handleEvents(event: MessagesEvents) {
fun handleEvent(event: MessagesEvents) {
when (event) {
is MessagesEvents.HandleAction -> {
localCoroutineScope.handleTimelineAction(
@ -291,8 +291,9 @@ class MessagesPresenter(
pinnedMessagesBannerState = pinnedMessagesBannerState,
dmUserVerificationState = dmUserVerificationState,
roomMemberModerationState = roomMemberModerationState,
successorRoom = roomInfo.successorRoom
) { handleEvents(it) }
successorRoom = roomInfo.successorRoom,
eventSink = ::handleEvent,
)
}
@Composable

View file

@ -106,7 +106,7 @@ class DefaultActionListPresenter(
val isThreadsEnabled = featureFlagService.isFeatureEnabledFlow(FeatureFlags.Threads).collectAsState(false)
fun handleEvents(event: ActionListEvents) {
fun handleEvent(event: ActionListEvents) {
when (event) {
ActionListEvents.Clear -> target.value = ActionListState.Target.None
is ActionListEvents.ComputeForMessage -> localCoroutineScope.computeForMessage(
@ -122,7 +122,7 @@ class DefaultActionListPresenter(
return ActionListState(
target = target.value,
eventSink = ::handleEvents,
eventSink = ::handleEvent,
)
}

View file

@ -141,8 +141,8 @@ class AttachmentsPreviewPresenter(
}
}
fun handleEvents(attachmentsPreviewEvents: AttachmentsPreviewEvents) {
when (attachmentsPreviewEvents) {
fun handleEvent(event: AttachmentsPreviewEvents) {
when (event) {
is AttachmentsPreviewEvents.SendAttachment -> {
ongoingSendAttachmentJob.value = coroutineScope.launch {
// If the media optimization selector is displayed, we need to wait for the user to select the options
@ -230,7 +230,7 @@ class AttachmentsPreviewPresenter(
textEditorState = textEditorState,
mediaOptimizationSelectorState = mediaOptimizationSelectorState,
displayFileTooLargeError = displayFileTooLargeError,
eventSink = ::handleEvents
eventSink = ::handleEvent,
)
}

View file

@ -47,7 +47,7 @@ class ResolveVerifiedUserSendFailurePresenter(
}
val coroutineScope = rememberCoroutineScope()
fun handleEvents(event: ResolveVerifiedUserSendFailureEvents) {
fun handleEvent(event: ResolveVerifiedUserSendFailureEvents) {
when (event) {
is ResolveVerifiedUserSendFailureEvents.ComputeForMessage -> {
val sendState = event.messageEvent.localSendState as? LocalEventSendState.Failed.VerifiedUser
@ -92,7 +92,7 @@ class ResolveVerifiedUserSendFailurePresenter(
verifiedUserSendFailure = verifiedUserSendFailure,
resolveAction = resolveAction.value,
retryAction = retryAction.value,
eventSink = ::handleEvents
eventSink = ::handleEvent,
)
}
}

View file

@ -24,16 +24,16 @@ class LinkPresenter(
override fun present(): LinkState {
val linkClick: MutableState<AsyncAction<Link>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
fun handleEvents(linkEvents: LinkEvents) {
when (linkEvents) {
fun handleEvent(event: LinkEvents) {
when (event) {
is LinkEvents.OnLinkClick -> {
linkClick.value = AsyncAction.Loading
val result = linkChecker.isSafe(linkEvents.link)
val result = linkChecker.isSafe(event.link)
if (result) {
linkClick.value = AsyncAction.Success(linkEvents.link)
linkClick.value = AsyncAction.Success(event.link)
} else {
// Confirm first
linkClick.value = ConfirmingLinkClick(linkEvents.link)
linkClick.value = ConfirmingLinkClick(event.link)
}
}
LinkEvents.Confirm -> {
@ -48,7 +48,7 @@ class LinkPresenter(
}
return LinkState(
linkClick = linkClick.value,
eventSink = ::handleEvents,
eventSink = ::handleEvent,
)
}
}

View file

@ -227,7 +227,7 @@ class MessageComposerPresenter(
}
}
fun handleEvents(event: MessageComposerEvents) {
fun handleEvent(event: MessageComposerEvents) {
when (event) {
MessageComposerEvents.ToggleFullScreenState -> isFullScreen.value = !isFullScreen.value
MessageComposerEvents.CloseSpecialMode -> {
@ -382,7 +382,7 @@ class MessageComposerPresenter(
suggestions = suggestions.toImmutableList(),
resolveMentionDisplay = resolveMentionDisplay,
resolveAtRoomMentionDisplay = resolveAtRoomMentionDisplay,
eventSink = ::handleEvents,
eventSink = ::handleEvent,
)
}

View file

@ -70,7 +70,7 @@ class PinnedMessagesBannerPresenter(
expectedPinnedMessagesCount = expectedPinnedMessagesCount,
pinnedItems = pinnedItems.value,
currentPinnedMessageIndex = currentPinnedMessageIndex,
eventSink = ::handleEvent
eventSink = ::handleEvent,
)
}

View file

@ -130,7 +130,7 @@ class PinnedMessagesListPresenter(
}
)
fun handleEvents(event: PinnedMessagesListEvents) {
fun handleEvent(event: PinnedMessagesListEvents) {
when (event) {
is PinnedMessagesListEvents.HandleAction -> sessionCoroutineScope.handleTimelineAction(event.action, event.event)
}
@ -143,7 +143,7 @@ class PinnedMessagesListPresenter(
displayThreadSummaries = displayThreadSummaries,
userEventPermissions = userEventPermissions,
timelineItems = pinnedMessageItems,
eventSink = ::handleEvents
eventSink = ::handleEvent,
)
}

View file

@ -53,7 +53,7 @@ class ReportMessagePresenter(
var blockUser by rememberSaveable { mutableStateOf(false) }
var result: MutableState<AsyncAction<Unit>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
fun handleEvents(event: ReportMessageEvents) {
fun handleEvent(event: ReportMessageEvents) {
when (event) {
is ReportMessageEvents.UpdateReason -> reason = event.reason
ReportMessageEvents.ToggleBlockUser -> blockUser = !blockUser
@ -66,7 +66,7 @@ class ReportMessagePresenter(
reason = reason,
blockUser = blockUser,
result = result.value,
eventSink = ::handleEvents
eventSink = ::handleEvent,
)
}

View file

@ -140,7 +140,7 @@ class TimelinePresenter(
value = featureFlagService.isFeatureEnabled(FeatureFlags.Threads)
}
fun handleEvents(event: TimelineEvents) {
fun handleEvent(event: TimelineEvents) {
when (event) {
is TimelineEvents.LoadMore -> {
if (event.direction == Timeline.PaginationDirection.FORWARDS && timelineMode is Timeline.Mode.Thread) {
@ -289,7 +289,7 @@ class TimelinePresenter(
messageShield = messageShield.value,
resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState,
displayThreadSummaries = displayThreadSummaries,
eventSink = ::handleEvents,
eventSink = ::handleEvent,
)
}

View file

@ -53,7 +53,7 @@ class CustomReactionPresenter(
target.value = CustomReactionState.Target.None
}
fun handleEvents(event: CustomReactionEvents) {
fun handleEvent(event: CustomReactionEvents) {
when (event) {
is CustomReactionEvents.ShowCustomReactionSheet -> handleShowCustomReactionSheet(event.event)
is CustomReactionEvents.DismissCustomReactionSheet -> handleDismissCustomReactionSheet()
@ -71,7 +71,7 @@ class CustomReactionPresenter(
target = target.value,
selectedEmoji = selectedEmoji,
recentEmojis = recentEmojis,
eventSink = ::handleEvents,
eventSink = ::handleEvent,
)
}
}

View file

@ -90,7 +90,7 @@ class EmojiPickerPresenter(
}
val isInPreview = LocalInspectionMode.current
fun handleEvents(event: EmojiPickerEvents) {
fun handleEvent(event: EmojiPickerEvents) {
when (event) {
// For some reason, in preview mode the SearchBar emits this event with an `isActive = true` value automatically
is EmojiPickerEvents.ToggleSearchActive -> if (!isInPreview) {
@ -106,7 +106,7 @@ class EmojiPickerPresenter(
searchQuery = searchQuery,
isSearchActive = isSearchActive,
searchResults = emojiResults,
eventSink = ::handleEvents,
eventSink = ::handleEvent,
)
}
}

View file

@ -36,7 +36,7 @@ class ReactionSummaryPresenter(
}
val targetWithAvatars = populateSenderAvatars(members = membersState.roomMembers().orEmpty().toImmutableList(), summary = target.value)
fun handleEvents(event: ReactionSummaryEvents) {
fun handleEvent(event: ReactionSummaryEvents) {
when (event) {
is ReactionSummaryEvents.ShowReactionSummary -> target.value = ReactionSummaryState.Summary(
reactions = event.reactions.toImmutableList(),
@ -48,7 +48,7 @@ class ReactionSummaryPresenter(
}
return ReactionSummaryState(
target = targetWithAvatars.value,
eventSink = ::handleEvents,
eventSink = ::handleEvent,
)
}

View file

@ -68,7 +68,6 @@ class DefaultVoiceMessageComposerPresenter(
}
private val permissionsPresenter = permissionsPresenterFactory.create(Manifest.permission.RECORD_AUDIO)
private val mediaSender = mediaSenderFactory.create(timelineMode)
@Composable
@ -88,7 +87,7 @@ class DefaultVoiceMessageComposerPresenter(
player.setMedia(recording.file.path)
}
val onLifecycleEvent = { event: Lifecycle.Event ->
fun handleLifecycleEvent(event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_PAUSE -> {
sessionCoroutineScope.finishRecording()
@ -101,13 +100,12 @@ class DefaultVoiceMessageComposerPresenter(
}
}
val onVoiceMessageRecorderEvent = { event: VoiceMessageComposerEvents.RecorderEvent ->
val permissionGranted = permissionState.permissionGranted
when (event.recorderEvent) {
fun handleVoiceMessageRecorderEvent(event: VoiceMessageRecorderEvent) {
when (event) {
VoiceMessageRecorderEvent.Start -> {
Timber.v("Voice message record button pressed")
when {
permissionGranted -> {
permissionState.permissionGranted -> {
localCoroutineScope.startRecording()
}
else -> {
@ -126,7 +124,8 @@ class DefaultVoiceMessageComposerPresenter(
}
}
}
val onPlayerEvent = { event: VoiceMessagePlayerEvent ->
fun handleVoiceMessagePlayerEvent(event: VoiceMessagePlayerEvent) {
localCoroutineScope.launch {
when (event) {
VoiceMessagePlayerEvent.Play -> player.play()
@ -136,28 +135,16 @@ class DefaultVoiceMessageComposerPresenter(
}
}
val onAcceptPermissionsRationale = {
permissionState.eventSink(PermissionsEvents.OpenSystemSettingAndCloseDialog)
}
val onDismissPermissionsRationale = {
permissionState.eventSink(PermissionsEvents.CloseDialog)
}
val onDismissSendFailureDialog = {
showSendFailureDialog = false
}
val onSendButtonPress = lambda@{
fun sendVoiceMessage() {
val finishedState = recorderState as? VoiceRecorderState.Finished
if (finishedState == null) {
val exception = VoiceMessageException.FileException("No file to send")
analyticsService.trackError(exception)
Timber.e(exception)
return@lambda
return
}
if (isSending) {
return@lambda
return
}
isSending = true
player.pause()
@ -176,21 +163,27 @@ class DefaultVoiceMessageComposerPresenter(
}
}
val handleEvents: (VoiceMessageComposerEvents) -> Unit = { event ->
fun handleEvent(event: VoiceMessageComposerEvents) {
when (event) {
is VoiceMessageComposerEvents.RecorderEvent -> onVoiceMessageRecorderEvent(event)
is VoiceMessageComposerEvents.PlayerEvent -> onPlayerEvent(event.playerEvent)
is VoiceMessageComposerEvents.RecorderEvent -> handleVoiceMessageRecorderEvent(event.recorderEvent)
is VoiceMessageComposerEvents.PlayerEvent -> handleVoiceMessagePlayerEvent(event.playerEvent)
is VoiceMessageComposerEvents.SendVoiceMessage -> localCoroutineScope.launch {
onSendButtonPress()
sendVoiceMessage()
}
VoiceMessageComposerEvents.DeleteVoiceMessage -> {
player.pause()
localCoroutineScope.deleteRecording()
}
VoiceMessageComposerEvents.DismissPermissionsRationale -> onDismissPermissionsRationale()
VoiceMessageComposerEvents.AcceptPermissionRationale -> onAcceptPermissionsRationale()
is VoiceMessageComposerEvents.LifecycleEvent -> onLifecycleEvent(event.event)
VoiceMessageComposerEvents.DismissSendFailureDialog -> onDismissSendFailureDialog()
VoiceMessageComposerEvents.DismissPermissionsRationale -> {
permissionState.eventSink(PermissionsEvents.CloseDialog)
}
VoiceMessageComposerEvents.AcceptPermissionRationale -> {
permissionState.eventSink(PermissionsEvents.OpenSystemSettingAndCloseDialog)
}
is VoiceMessageComposerEvents.LifecycleEvent -> handleLifecycleEvent(event.event)
VoiceMessageComposerEvents.DismissSendFailureDialog -> {
showSendFailureDialog = false
}
}
}
@ -211,7 +204,7 @@ class DefaultVoiceMessageComposerPresenter(
showPermissionRationaleDialog = permissionState.showDialog,
showSendFailureDialog = showSendFailureDialog,
keepScreenOn = keepScreenOn,
eventSink = handleEvents,
eventSink = ::handleEvent,
)
}