Fix Threads not tappable in pinned messages list (#6535)

This commit is contained in:
bxdxnn 2026-04-08 12:25:59 +03:00 committed by GitHub
parent c5b19292e7
commit 060592b39c
7 changed files with 28 additions and 1 deletions

View file

@ -432,6 +432,10 @@ class MessagesFlowNode(
override fun handleForwardEventClick(eventId: EventId) { override fun handleForwardEventClick(eventId: EventId) {
backstack.push(NavTarget.ForwardEvent(eventId = eventId, fromPinnedEvents = true)) backstack.push(NavTarget.ForwardEvent(eventId = eventId, fromPinnedEvents = true))
} }
override fun navigateToThread(threadRootId: ThreadId) {
backstack.push(NavTarget.Thread(threadRootId, null))
}
} }
createNode<PinnedMessagesListNode>(buildContext, plugins = listOf(callback)) createNode<PinnedMessagesListNode>(buildContext, plugins = listOf(callback))
} }

View file

@ -10,7 +10,9 @@ package io.element.android.features.messages.impl.pinned.list
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.TimelineItem
import io.element.android.libraries.matrix.api.core.ThreadId
sealed interface PinnedMessagesListEvent { sealed interface PinnedMessagesListEvent {
data class HandleAction(val action: TimelineItemAction, val event: TimelineItem.Event) : PinnedMessagesListEvent data class HandleAction(val action: TimelineItemAction, val event: TimelineItem.Event) : PinnedMessagesListEvent
data class OpenThread(val threadRootId: ThreadId) : PinnedMessagesListEvent
} }

View file

@ -9,10 +9,12 @@
package io.element.android.features.messages.impl.pinned.list package io.element.android.features.messages.impl.pinned.list
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
interface PinnedMessagesListNavigator { interface PinnedMessagesListNavigator {
fun viewInTimeline(eventId: EventId) fun viewInTimeline(eventId: EventId)
fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo)
fun forwardEvent(eventId: EventId) fun forwardEvent(eventId: EventId)
fun navigateToThread(threadRootId: ThreadId)
} }

View file

@ -31,6 +31,7 @@ import io.element.android.libraries.androidutils.system.openUrlInExternalApp
import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.callback
import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkParser
@ -55,6 +56,7 @@ class PinnedMessagesListNode(
fun handlePermalinkClick(data: PermalinkData.RoomLink) fun handlePermalinkClick(data: PermalinkData.RoomLink)
fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo) fun navigateToEventDebugInfo(eventId: EventId?, debugInfo: TimelineItemDebugInfo)
fun handleForwardEventClick(eventId: EventId) fun handleForwardEventClick(eventId: EventId)
fun navigateToThread(threadRootId: ThreadId)
} }
private val callback: Callback = callback() private val callback: Callback = callback()
@ -95,6 +97,10 @@ class PinnedMessagesListNode(
callback.handleForwardEventClick(eventId) callback.handleForwardEventClick(eventId)
} }
override fun navigateToThread(threadRootId: ThreadId) {
callback.navigateToThread(threadRootId)
}
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
CompositionLocalProvider( CompositionLocalProvider(

View file

@ -137,6 +137,7 @@ class PinnedMessagesListPresenter(
fun handleEvent(event: PinnedMessagesListEvent) { fun handleEvent(event: PinnedMessagesListEvent) {
when (event) { when (event) {
is PinnedMessagesListEvent.HandleAction -> sessionCoroutineScope.handleTimelineAction(event.action, event.event) is PinnedMessagesListEvent.HandleAction -> sessionCoroutineScope.handleTimelineAction(event.action, event.event)
is PinnedMessagesListEvent.OpenThread -> navigator.navigateToThread(event.threadRootId)
} }
} }

View file

@ -30,6 +30,7 @@ import io.element.android.features.messages.impl.actionlist.ActionListView
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
import io.element.android.features.messages.impl.link.LinkEvent import io.element.android.features.messages.impl.link.LinkEvent
import io.element.android.features.messages.impl.link.LinkView import io.element.android.features.messages.impl.link.LinkView
import io.element.android.features.messages.impl.timeline.TimelineEvent
import io.element.android.features.messages.impl.timeline.components.TimelineItemRow import io.element.android.features.messages.impl.timeline.components.TimelineItemRow
import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView
import io.element.android.features.messages.impl.timeline.components.layout.ContentAvoidingLayoutData import io.element.android.features.messages.impl.timeline.components.layout.ContentAvoidingLayoutData
@ -235,7 +236,12 @@ private fun PinnedMessagesListLoaded(
onReadReceiptClick = {}, onReadReceiptClick = {},
onSwipeToReply = {}, onSwipeToReply = {},
onJoinCallClick = {}, onJoinCallClick = {},
eventSink = {}, eventSink = { timelineItemEvent ->
when (timelineItemEvent) {
is TimelineEvent.OpenThread -> state.eventSink(PinnedMessagesListEvent.OpenThread(timelineItemEvent.threadRootEventId))
else -> Unit
}
},
eventContentView = { event, contentModifier, onContentLayoutChange -> eventContentView = { event, contentModifier, onContentLayoutChange ->
TimelineItemEventContentViewWrapper( TimelineItemEventContentViewWrapper(
event = event, event = event,

View file

@ -9,6 +9,7 @@
package io.element.android.features.messages.impl.pinned.list package io.element.android.features.messages.impl.pinned.list
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
class FakePinnedMessagesListNavigator : PinnedMessagesListNavigator { class FakePinnedMessagesListNavigator : PinnedMessagesListNavigator {
@ -26,4 +27,9 @@ class FakePinnedMessagesListNavigator : PinnedMessagesListNavigator {
override fun forwardEvent(eventId: EventId) { override fun forwardEvent(eventId: EventId) {
onForwardEventClickLambda?.invoke(eventId) onForwardEventClickLambda?.invoke(eventId)
} }
var onOpenThreadLambda: ((ThreadId) -> Unit)? = null
override fun navigateToThread(threadRootId: ThreadId) {
onOpenThreadLambda?.invoke(threadRootId)
}
} }