Support thread root in drafts

This commit is contained in:
bxdxnn
2026-06-06 18:26:46 +00:00
parent 53bbef0554
commit a10aa6cbe3
5 changed files with 13 additions and 8 deletions
@@ -107,7 +107,7 @@ class MessagesNode(
private val timelineController = TimelineController(room, room.liveTimeline) private val timelineController = TimelineController(room, room.liveTimeline)
private val presenter = presenterFactory.create( private val presenter = presenterFactory.create(
navigator = this, navigator = this,
composerPresenter = messageComposerPresenterFactory.create(timelineController, this, isInThread = false), composerPresenter = messageComposerPresenterFactory.create(timelineController, this, isInThread = false, threadRoot = null),
timelinePresenter = timelinePresenterFactory.create(timelineController = timelineController, this), timelinePresenter = timelinePresenterFactory.create(timelineController = timelineController, this),
actionListPresenter = actionListPresenterFactory.create( actionListPresenter = actionListPresenterFactory.create(
postProcessor = TimelineItemActionPostProcessor.Default, postProcessor = TimelineItemActionPostProcessor.Default,
@@ -49,6 +49,7 @@ import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatch
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.di.annotations.SessionCoroutineScope
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.PermalinkBuilder import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder
import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkParser
@@ -110,6 +111,7 @@ class MessageComposerPresenter(
@Assisted private val navigator: MessagesNavigator, @Assisted private val navigator: MessagesNavigator,
@Assisted private val timelineController: TimelineController, @Assisted private val timelineController: TimelineController,
@Assisted private val isInThread: Boolean, @Assisted private val isInThread: Boolean,
@Assisted private val threadRoot: ThreadId?,
@SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope,
private val room: JoinedRoom, private val room: JoinedRoom,
private val mediaPickerProvider: PickerProvider, private val mediaPickerProvider: PickerProvider,
@@ -139,6 +141,7 @@ class MessageComposerPresenter(
timelineController: TimelineController, timelineController: TimelineController,
navigator: MessagesNavigator, navigator: MessagesNavigator,
isInThread: Boolean, isInThread: Boolean,
threadRoot: ThreadId?,
): MessageComposerPresenter ): MessageComposerPresenter
} }
@@ -234,8 +237,7 @@ class MessageComposerPresenter(
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
val draft = draftService.loadDraft( val draft = draftService.loadDraft(
roomId = room.roomId, roomId = room.roomId,
// TODO support threads in composer threadRoot = threadRoot,
threadRoot = null,
isVolatile = false isVolatile = false
) )
if (draft != null) { if (draft != null) {
@@ -652,8 +654,7 @@ class MessageComposerPresenter(
roomId = room.roomId, roomId = room.roomId,
draft = draft, draft = draft,
isVolatile = isVolatile, isVolatile = isVolatile,
// TODO support threads in composer threadRoot = threadRoot,
threadRoot = null,
) )
} }
@@ -816,8 +817,7 @@ class MessageComposerPresenter(
// Use the volatile draft only when coming from edit mode otherwise. // Use the volatile draft only when coming from edit mode otherwise.
val draft = draftService.loadDraft( val draft = draftService.loadDraft(
roomId = room.roomId, roomId = room.roomId,
// TODO support threads in composer threadRoot = threadRoot,
threadRoot = null,
isVolatile = true isVolatile = true
).takeIf { fromEdit } ).takeIf { fromEdit }
if (draft != null) { if (draft != null) {
@@ -112,7 +112,7 @@ class ThreadedMessagesNode(
this.timelineController = timelineController this.timelineController = timelineController
return presenterFactory.create( return presenterFactory.create(
navigator = this, navigator = this,
composerPresenter = messageComposerPresenterFactory.create(timelineController, this, isInThread = true), composerPresenter = messageComposerPresenterFactory.create(timelineController, this, isInThread = true, threadRoot = inputs.threadRootEventId),
timelinePresenter = timelinePresenterFactory.create(timelineController = timelineController, this), timelinePresenter = timelinePresenterFactory.create(timelineController = timelineController, this),
// TODO add special processor for threaded timeline // TODO add special processor for threaded timeline
actionListPresenter = actionListPresenterFactory.create( actionListPresenter = actionListPresenterFactory.create(
@@ -24,6 +24,7 @@ import io.element.android.features.messages.impl.utils.FakeMentionSpanFormatter
import io.element.android.features.messages.impl.utils.FakeTextPillificationHelper import io.element.android.features.messages.impl.utils.FakeTextPillificationHelper
import io.element.android.features.messages.impl.utils.TextPillificationHelper import io.element.android.features.messages.impl.utils.TextPillificationHelper
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
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.PermalinkBuilder import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder
import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.permalink.PermalinkParser
@@ -272,11 +273,13 @@ class MessageComposerPresenterSlashCommandTest {
draftService: ComposerDraftService = FakeComposerDraftService(), draftService: ComposerDraftService = FakeComposerDraftService(),
mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(),
isInThread: Boolean = false, isInThread: Boolean = false,
threadRoot: ThreadId? = null,
slashCommandService: SlashCommandService = FakeSlashCommandService(), slashCommandService: SlashCommandService = FakeSlashCommandService(),
) = MessageComposerPresenter( ) = MessageComposerPresenter(
navigator = navigator, navigator = navigator,
sessionCoroutineScope = this, sessionCoroutineScope = this,
isInThread = isInThread, isInThread = isInThread,
threadRoot = threadRoot,
room = room, room = room,
mediaPickerProvider = pickerProvider, mediaPickerProvider = pickerProvider,
sessionPreferencesStore = sessionPreferencesStore, sessionPreferencesStore = sessionPreferencesStore,
@@ -1535,11 +1535,13 @@ class MessageComposerPresenterTest {
draftService: ComposerDraftService = FakeComposerDraftService(), draftService: ComposerDraftService = FakeComposerDraftService(),
mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(), mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(),
isInThread: Boolean = false, isInThread: Boolean = false,
threadRoot: ThreadId? = null,
slashCommandService: SlashCommandService = FakeSlashCommandService(), slashCommandService: SlashCommandService = FakeSlashCommandService(),
) = MessageComposerPresenter( ) = MessageComposerPresenter(
navigator = navigator, navigator = navigator,
sessionCoroutineScope = this, sessionCoroutineScope = this,
isInThread = isInThread, isInThread = isInThread,
threadRoot = threadRoot,
room = room, room = room,
mediaPickerProvider = pickerProvider, mediaPickerProvider = pickerProvider,
sessionPreferencesStore = sessionPreferencesStore, sessionPreferencesStore = sessionPreferencesStore,