Skip to content

Commit a192a88

Browse files
committed
Ensure getEventTimelineItemByEventId is called when we enter in reply mode.
1 parent aefeb01 commit a192a88

File tree

4 files changed

+53
-7
lines changed
  • features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer
  • libraries/matrix
    • api/src/main/kotlin/io/element/android/libraries/matrix/api/room
    • impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room
    • test/src/main/kotlin/io/element/android/libraries/matrix/test/room

4 files changed

+53
-7
lines changed

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import android.Manifest
2020
import android.annotation.SuppressLint
2121
import android.net.Uri
2222
import androidx.compose.runtime.Composable
23+
import androidx.compose.runtime.DisposableEffect
2324
import androidx.compose.runtime.LaunchedEffect
2425
import androidx.compose.runtime.MutableState
2526
import androidx.compose.runtime.getValue
@@ -151,22 +152,38 @@ class MessageComposerPresenter @Inject constructor(
151152
}
152153
}
153154

155+
DisposableEffect(Unit) {
156+
onDispose {
157+
appCoroutineScope.launch {
158+
room.exitReplyMode()
159+
}
160+
}
161+
}
162+
154163
fun handleEvents(event: MessageComposerEvents) {
155164
when (event) {
156165
MessageComposerEvents.ToggleFullScreenState -> isFullScreen.value = !isFullScreen.value
157-
158166
MessageComposerEvents.CloseSpecialMode -> {
159167
richTextEditorState.setHtml("")
160168
messageComposerContext.composerMode = MessageComposerMode.Normal("")
169+
appCoroutineScope.launch {
170+
room.exitReplyMode()
171+
}
161172
}
162-
163173
is MessageComposerEvents.SendMessage -> appCoroutineScope.sendMessage(
164174
message = event.message,
165175
updateComposerMode = { messageComposerContext.composerMode = it },
166176
richTextEditorState = richTextEditorState,
167177
)
168178
is MessageComposerEvents.SetMode -> {
169179
messageComposerContext.composerMode = event.composerMode
180+
appCoroutineScope.launch {
181+
if (event.composerMode is MessageComposerMode.Reply) {
182+
room.enterReplyMode(event.composerMode.eventId)
183+
} else {
184+
room.exitReplyMode()
185+
}
186+
}
170187
}
171188
MessageComposerEvents.AddAttachment -> localCoroutineScope.launch {
172189
showAttachmentSourcePicker = true

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ interface MatrixRoom : Closeable {
8989

9090
suspend fun editMessage(originalEventId: EventId?, transactionId: TransactionId?, body: String, htmlBody: String?): Result<Unit>
9191

92+
suspend fun enterReplyMode(eventId: EventId): Result<Unit>
93+
94+
suspend fun exitReplyMode(): Result<Unit>
95+
9296
suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?): Result<Unit>
9397

9498
suspend fun redactEvent(eventId: EventId, reason: String? = null): Result<Unit>
@@ -184,7 +188,4 @@ interface MatrixRoom : Closeable {
184188
suspend fun endPoll(pollStartId: EventId, text: String): Result<Unit>
185189

186190
override fun close() = destroy()
187-
188191
}
189-
190-

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
6060
import kotlinx.coroutines.flow.StateFlow
6161
import kotlinx.coroutines.flow.asStateFlow
6262
import kotlinx.coroutines.withContext
63+
import org.matrix.rustcomponents.sdk.EventTimelineItem
6364
import org.matrix.rustcomponents.sdk.RequiredState
6465
import org.matrix.rustcomponents.sdk.Room
6566
import org.matrix.rustcomponents.sdk.RoomListItem
@@ -261,11 +262,30 @@ class RustMatrixRoom(
261262
}
262263
}
263264

265+
private var inReplyToEventTimelineItem: EventTimelineItem? = null
266+
267+
override suspend fun enterReplyMode(eventId: EventId): Result<Unit> = withContext(roomDispatcher) {
268+
runCatching {
269+
inReplyToEventTimelineItem?.destroy()
270+
inReplyToEventTimelineItem = null
271+
inReplyToEventTimelineItem = innerRoom.getEventTimelineItemByEventId(eventId.value)
272+
}
273+
}
274+
275+
override suspend fun exitReplyMode(): Result<Unit> = withContext(roomDispatcher) {
276+
runCatching {
277+
inReplyToEventTimelineItem?.destroy()
278+
inReplyToEventTimelineItem = null
279+
}
280+
}
281+
264282
override suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?): Result<Unit> = withContext(roomDispatcher) {
265283
runCatching {
266-
innerRoom.getEventTimelineItemByEventId(eventId.value).use { eventTimelineItem ->
284+
val inReplyTo = inReplyToEventTimelineItem ?: innerRoom.getEventTimelineItemByEventId(eventId.value)
285+
inReplyTo.use { eventTimelineItem ->
267286
innerRoom.sendReply(messageEventContentFromParts(body, htmlBody), eventTimelineItem)
268287
}
288+
inReplyToEventTimelineItem = null
269289
}
270290
}
271291

libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ import io.element.android.libraries.matrix.api.notificationsettings.Notification
3131
import io.element.android.libraries.matrix.api.poll.PollKind
3232
import io.element.android.libraries.matrix.api.room.MatrixRoom
3333
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
34-
import io.element.android.libraries.matrix.api.room.MessageEventType
3534
import io.element.android.libraries.matrix.api.room.MatrixRoomNotificationSettingsState
35+
import io.element.android.libraries.matrix.api.room.MessageEventType
3636
import io.element.android.libraries.matrix.api.room.StateEventType
3737
import io.element.android.libraries.matrix.api.room.location.AssetType
3838
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
@@ -208,6 +208,14 @@ class FakeMatrixRoom(
208208
var replyMessageParameter: Pair<String, String?>? = null
209209
private set
210210

211+
override suspend fun enterReplyMode(eventId: EventId): Result<Unit> {
212+
return Result.success(Unit)
213+
}
214+
215+
override suspend fun exitReplyMode(): Result<Unit> {
216+
return Result.success(Unit)
217+
}
218+
211219
override suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?): Result<Unit> {
212220
replyMessageParameter = body to htmlBody
213221
return Result.success(Unit)

0 commit comments

Comments
 (0)