Skip to content

Commit e16adb9

Browse files
committed
Send failure verified user : handle click on failed send icon.
1 parent ff368b4 commit e16adb9

File tree

16 files changed

+75
-81
lines changed

16 files changed

+75
-81
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import io.element.android.features.messages.impl.actionlist.ActionListEvents
3030
import io.element.android.features.messages.impl.actionlist.ActionListPresenter
3131
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
3232
import io.element.android.features.messages.impl.actionlist.model.TimelineItemActionPostProcessor
33-
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState
3433
import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvents
3534
import io.element.android.features.messages.impl.messagecomposer.MessageComposerPresenter
3635
import io.element.android.features.messages.impl.messagecomposer.MessageComposerState
@@ -96,7 +95,6 @@ class MessagesPresenter @AssistedInject constructor(
9695
private val reactionSummaryPresenter: ReactionSummaryPresenter,
9796
private val readReceiptBottomSheetPresenter: ReadReceiptBottomSheetPresenter,
9897
private val pinnedMessagesBannerPresenter: Presenter<PinnedMessagesBannerState>,
99-
private val resolveVerifiedUserSendFailurePresenter: Presenter<ResolveVerifiedUserSendFailureState>,
10098
private val networkMonitor: NetworkMonitor,
10199
private val snackbarDispatcher: SnackbarDispatcher,
102100
private val dispatchers: CoroutineDispatchers,
@@ -130,7 +128,6 @@ class MessagesPresenter @AssistedInject constructor(
130128
val reactionSummaryState = reactionSummaryPresenter.present()
131129
val readReceiptBottomSheetState = readReceiptBottomSheetPresenter.present()
132130
val pinnedMessagesBannerState = pinnedMessagesBannerPresenter.present()
133-
val resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailurePresenter.present()
134131

135132
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
136133

@@ -230,7 +227,6 @@ class MessagesPresenter @AssistedInject constructor(
230227
appName = buildMeta.applicationName,
231228
callState = callState,
232229
pinnedMessagesBannerState = pinnedMessagesBannerState,
233-
resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState,
234230
eventSink = { handleEvents(it) }
235231
)
236232
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package io.element.android.features.messages.impl
99

1010
import androidx.compose.runtime.Immutable
1111
import io.element.android.features.messages.impl.actionlist.ActionListState
12-
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState
1312
import io.element.android.features.messages.impl.messagecomposer.MessageComposerState
1413
import io.element.android.features.messages.impl.pinned.banner.PinnedMessagesBannerState
1514
import io.element.android.features.messages.impl.timeline.TimelineState
@@ -48,7 +47,6 @@ data class MessagesState(
4847
val callState: RoomCallState,
4948
val appName: String,
5049
val pinnedMessagesBannerState: PinnedMessagesBannerState,
51-
val resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState,
5250
val eventSink: (MessagesEvents) -> Unit
5351
)
5452

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ package io.element.android.features.messages.impl
1010
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
1111
import io.element.android.features.messages.impl.actionlist.ActionListState
1212
import io.element.android.features.messages.impl.actionlist.anActionListState
13-
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState
14-
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.aResolveVerifiedUserSendFailureState
1513
import io.element.android.features.messages.impl.messagecomposer.AttachmentsState
1614
import io.element.android.features.messages.impl.messagecomposer.MessageComposerState
1715
import io.element.android.features.messages.impl.messagecomposer.aMessageComposerState
@@ -115,7 +113,6 @@ fun aMessagesState(
115113
enableVoiceMessages: Boolean = true,
116114
callState: RoomCallState = RoomCallState.ENABLED,
117115
pinnedMessagesBannerState: PinnedMessagesBannerState = aLoadedPinnedMessagesBannerState(),
118-
resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState = aResolveVerifiedUserSendFailureState(),
119116
eventSink: (MessagesEvents) -> Unit = {},
120117
) = MessagesState(
121118
roomId = RoomId("!id:domain"),
@@ -140,7 +137,6 @@ fun aMessagesState(
140137
callState = callState,
141138
appName = "Element",
142139
pinnedMessagesBannerState = pinnedMessagesBannerState,
143-
resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState,
144140
eventSink = eventSink,
145141
)
146142

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ import io.element.android.features.messages.impl.actionlist.ActionListEvents
5757
import io.element.android.features.messages.impl.actionlist.ActionListView
5858
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
5959
import io.element.android.features.messages.impl.attachments.Attachment
60-
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureEvents
61-
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureView
6260
import io.element.android.features.messages.impl.messagecomposer.AttachmentsBottomSheet
6361
import io.element.android.features.messages.impl.messagecomposer.AttachmentsState
6462
import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvents
@@ -244,14 +242,10 @@ fun MessagesView(
244242
},
245243
onEmojiReactionClick = ::onEmojiReactionClick,
246244
onVerifiedUserSendFailureClick = { event ->
247-
state.resolveVerifiedUserSendFailureState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(event))
245+
state.timelineState.eventSink(TimelineEvents.ComputeVerifiedUserSendFailure(event))
248246
},
249247
)
250248

251-
ResolveVerifiedUserSendFailureView(
252-
state = state.resolveVerifiedUserSendFailureState,
253-
)
254-
255249
CustomReactionBottomSheet(
256250
state = state.customReactionState,
257251
onSelectEmoji = { uniqueId, emoji ->

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/sendfailure/resolve/ResolveVerifiedUserSendFailureView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fun ResolveVerifiedUserSendFailureView(
4343
state: ResolveVerifiedUserSendFailureState,
4444
modifier: Modifier = Modifier,
4545
) {
46-
val sheetState = rememberModalBottomSheetState()
46+
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
4747
var showSheet by remember { mutableStateOf(false) }
4848

4949
fun dismiss() {

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,19 +200,18 @@ private fun PinnedMessagesListLoaded(
200200
renderReadReceipts = false,
201201
isLastOutgoingMessage = false,
202202
focusedEventId = null,
203-
onClick = onEventClick,
204-
onLongClick = ::onMessageLongClick,
205203
onUserDataClick = onUserDataClick,
206204
onLinkClick = onLinkClick,
205+
onClick = onEventClick,
206+
onLongClick = ::onMessageLongClick,
207207
inReplyToClick = {},
208208
onReactionClick = { _, _ -> },
209209
onReactionLongClick = { _, _ -> },
210210
onMoreReactionsClick = {},
211211
onReadReceiptClick = {},
212-
eventSink = {},
213212
onSwipeToReply = {},
214213
onJoinCallClick = {},
215-
onShieldClick = {},
214+
eventSink = {},
216215
eventContentView = { event, contentModifier, onContentLayoutChange ->
217216
TimelineItemEventContentViewWrapper(
218217
event = event,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineEvents.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package io.element.android.features.messages.impl.timeline
99

10+
import io.element.android.features.messages.impl.timeline.model.TimelineItem
1011
import io.element.android.libraries.matrix.api.core.EventId
1112
import io.element.android.libraries.matrix.api.timeline.Timeline
1213
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
@@ -19,14 +20,15 @@ sealed interface TimelineEvents {
1920
data object OnFocusEventRender : TimelineEvents
2021
data object JumpToLive : TimelineEvents
2122

22-
data class ShowShieldDialog(val messageShield: MessageShield) : TimelineEvents
2323
data object HideShieldDialog : TimelineEvents
2424

2525
/**
2626
* Events coming from a timeline item.
2727
*/
2828
sealed interface EventFromTimelineItem : TimelineEvents
2929

30+
data class ComputeVerifiedUserSendFailure(val event: TimelineItem.Event) : EventFromTimelineItem
31+
data class ShowShieldDialog(val messageShield: MessageShield) : EventFromTimelineItem
3032
data class LoadMore(val direction: Timeline.PaginationDirection) : EventFromTimelineItem
3133

3234
/**

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import dagger.assisted.Assisted
2121
import dagger.assisted.AssistedFactory
2222
import dagger.assisted.AssistedInject
2323
import io.element.android.features.messages.impl.MessagesNavigator
24+
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureEvents
25+
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState
2426
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory
2527
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactoryConfig
2628
import io.element.android.features.messages.impl.timeline.model.NewEventState
@@ -66,6 +68,7 @@ class TimelinePresenter @AssistedInject constructor(
6668
private val endPollAction: EndPollAction,
6769
private val sessionPreferencesStore: SessionPreferencesStore,
6870
private val timelineController: TimelineController,
71+
private val resolveVerifiedUserSendFailurePresenter: Presenter<ResolveVerifiedUserSendFailureState>,
6972
) : Presenter<TimelineState> {
7073
@AssistedFactory
7174
interface Factory {
@@ -101,6 +104,7 @@ class TimelinePresenter @AssistedInject constructor(
101104
val newEventState = remember { mutableStateOf(NewEventState.None) }
102105
val messageShield: MutableState<MessageShield?> = remember { mutableStateOf(null) }
103106

107+
val resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailurePresenter.present()
104108
val isSendPublicReadReceiptsEnabled by sessionPreferencesStore.isSendPublicReadReceiptsEnabled().collectAsState(initial = true)
105109
val renderReadReceipts by sessionPreferencesStore.isRenderReadReceiptsEnabled().collectAsState(initial = true)
106110
val isLive by timelineController.isLive().collectAsState(initial = true)
@@ -156,6 +160,9 @@ class TimelinePresenter @AssistedInject constructor(
156160
}
157161
TimelineEvents.HideShieldDialog -> messageShield.value = null
158162
is TimelineEvents.ShowShieldDialog -> messageShield.value = event.messageShield
163+
is TimelineEvents.ComputeVerifiedUserSendFailure -> {
164+
resolveVerifiedUserSendFailureState.eventSink(ResolveVerifiedUserSendFailureEvents.ComputeForMessage(event.event))
165+
}
159166
}
160167
}
161168

@@ -232,6 +239,7 @@ class TimelinePresenter @AssistedInject constructor(
232239
isLive = isLive,
233240
focusRequestState = focusRequestState.value,
234241
messageShield = messageShield.value,
242+
resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState,
235243
eventSink = { handleEvents(it) }
236244
)
237245
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package io.element.android.features.messages.impl.timeline
99

1010
import androidx.compose.runtime.Immutable
11+
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState
1112
import io.element.android.features.messages.impl.timeline.model.NewEventState
1213
import io.element.android.features.messages.impl.timeline.model.TimelineItem
1314
import io.element.android.libraries.matrix.api.core.EventId
@@ -25,6 +26,7 @@ data class TimelineState(
2526
val focusRequestState: FocusRequestState,
2627
// If not null, info will be rendered in a dialog
2728
val messageShield: MessageShield?,
29+
val resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState,
2830
val eventSink: (TimelineEvents) -> Unit,
2931
) {
3032
val hasAnyEvent = timelineItems.any { it is TimelineItem.Event }

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
package io.element.android.features.messages.impl.timeline
99

10+
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailureState
11+
import io.element.android.features.messages.impl.crypto.sendfailure.resolve.aResolveVerifiedUserSendFailureState
1012
import io.element.android.features.messages.impl.timeline.components.receipt.aReadReceiptData
1113
import io.element.android.features.messages.impl.timeline.model.NewEventState
1214
import io.element.android.features.messages.impl.timeline.model.ReadReceiptData
@@ -44,6 +46,7 @@ fun aTimelineState(
4446
focusedEventIndex: Int = -1,
4547
isLive: Boolean = true,
4648
messageShield: MessageShield? = null,
49+
resolveVerifiedUserSendFailureState: ResolveVerifiedUserSendFailureState = aResolveVerifiedUserSendFailureState(),
4750
eventSink: (TimelineEvents) -> Unit = {},
4851
): TimelineState {
4952
val focusedEventId = timelineItems.filterIsInstance<TimelineItem.Event>().getOrNull(focusedEventIndex)?.eventId
@@ -60,6 +63,7 @@ fun aTimelineState(
6063
isLive = isLive,
6164
focusRequestState = focusRequestState,
6265
messageShield = messageShield,
66+
resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailureState,
6367
eventSink = eventSink,
6468
)
6569
}

0 commit comments

Comments
 (0)