Hook up the emoji picker to the custom status row. (#5902)

* Refactor EmojiPickerScreen to take a continuation instead of a timeline/itemID.

* Hook up the emoji picker to the custom status row.
This commit is contained in:
Doug
2026-07-22 13:35:37 +01:00
committed by GitHub
parent a6466e80e0
commit 32a54c5b71
19 changed files with 223 additions and 92 deletions
@@ -12,7 +12,7 @@ import UIKit
enum TimelineInteractionHandlerAction {
case composer(action: TimelineComposerAction)
case displayEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
case displayEmojiPicker(selectedEmojis: Set<String>, continuation: EmojiPickerScreenContinuation)
case displayReportContent(itemID: TimelineItemIdentifier, senderID: String)
case displayMessageForwarding(itemID: TimelineItemIdentifier)
case displayMediaUploadPreviewScreen(mediaURLs: [URL])
@@ -59,6 +59,8 @@ class TimelineInteractionHandler {
private var resumeVoiceMessagePlaybackAfterScrubbing = false
private var emojiPickerCancellable: AnyCancellable?
init(roomProxy: JoinedRoomProxyProtocol,
timelineController: TimelineControllerProtocol,
userSession: UserSessionProtocol,
@@ -518,11 +520,21 @@ class TimelineInteractionHandler {
func displayEmojiPicker(for itemID: TimelineItemIdentifier) {
guard let timelineItem = timelineController.timelineItems.firstUsingStableID(itemID),
timelineItem.isReactable,
let eventTimelineItem = timelineItem as? EventBasedTimelineItemProtocol else {
let eventTimelineItem = timelineItem as? EventBasedTimelineItemProtocol,
case let .event(_, eventOrTransactionID) = itemID else {
return
}
let selectedEmojis = Set(eventTimelineItem.properties.reactions.compactMap { $0.isHighlighted ? $0.key : nil })
actionsSubject.send(.displayEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis))
let (stream, continuation) = AsyncStream<String>.makeStream()
actionsSubject.send(.displayEmojiPicker(selectedEmojis: selectedEmojis, continuation: continuation))
emojiPickerCancellable = Task { [weak self] in
for await emoji in stream {
await self?.timelineController.toggleReaction(emoji, to: eventOrTransactionID)
}
}
.asCancellable()
}
func processItemTap(_ itemID: TimelineItemIdentifier) async -> TimelineControllerAction {
@@ -12,7 +12,7 @@ import OrderedCollections
import SwiftUI
enum TimelineViewModelAction {
case displayEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
case displayEmojiPicker(selectedEmojis: Set<String>, continuation: EmojiPickerScreenContinuation)
case displayReportContent(itemID: TimelineItemIdentifier, senderID: String)
case displayCameraPicker
case displayMediaPicker
@@ -511,8 +511,8 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
displayAlert(.audioRecodingPermissionError)
case .displayErrorToast(let title):
displayErrorToast(title)
case .displayEmojiPicker(let itemID, let selectedEmojis):
actionsSubject.send(.displayEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis))
case .displayEmojiPicker(let selectedEmojis, let continuation):
actionsSubject.send(.displayEmojiPicker(selectedEmojis: selectedEmojis, continuation: continuation))
case .displayMessageForwarding(let itemID):
Task { await self.forwardMessage(itemID: itemID) }
case .displayEditPollForm(let eventID, let poll):