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
@@ -430,13 +430,12 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
}
presentMediaUploadPickerWithMode(mode, caption: caption, timelineController: timelineController, animated: animated)
case (_, .presentEmojiPicker, .emojiPicker(let itemID, let selectedEmoji, _)):
guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else {
fatalError("Missing required TimelineController")
case (_, .presentEmojiPicker, .emojiPicker(let selectedEmojis, _)):
guard let continuation = (context.userInfo as? EventUserInfo)?.emojiPickerContinuation else {
fatalError("Missing required emoji continuation")
}
presentEmojiPicker(for: itemID,
selectedEmoji: selectedEmoji,
timelineController: timelineController,
presentEmojiPicker(selectedEmojis: selectedEmojis,
emojiPickerContinuation: continuation,
animated: animated)
case (_, .presentMessageForwarding(let forwardingItem), .messageForwarding):
@@ -706,9 +705,9 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
case .presentMediaUploadPreviewScreen(let url, let caption):
stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: url, caption: caption),
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
case .presentEmojiPicker(let itemID, let selectedEmojis):
stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis),
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
case .presentEmojiPicker(let selectedEmojis, let continuation):
stateMachine.tryEvent(.presentEmojiPicker(selectedEmojis: selectedEmojis),
userInfo: EventUserInfo(animated: animated, emojiPickerContinuation: continuation))
case .presentLocationPicker:
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .picker(shouldShowLiveLocationOption: true)),
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
@@ -831,9 +830,9 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .viewStatic(location)),
userInfo: EventUserInfo(animated: animated,
timelineController: timelineController))
case .presentEmojiPicker(let itemID, let selectedEmojis):
stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis),
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
case .presentEmojiPicker(let selectedEmojis, let continuation):
stateMachine.tryEvent(.presentEmojiPicker(selectedEmojis: selectedEmojis),
userInfo: EventUserInfo(animated: animated, emojiPickerContinuation: continuation))
case .presentRoomMemberDetails(let userID):
stateMachine.tryEvent(.startMembersFlow(entryPoint: .roomMember(userID: userID)))
case .presentMessageForwarding(let forwardingItem):
@@ -1146,14 +1145,12 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
}
}
private func presentEmojiPicker(for itemID: TimelineItemIdentifier,
selectedEmoji: Set<String>,
timelineController: TimelineControllerProtocol,
private func presentEmojiPicker(selectedEmojis: Set<String>,
emojiPickerContinuation: EmojiPickerScreenContinuation,
animated: Bool) {
let params = EmojiPickerScreenCoordinatorParameters(itemID: itemID,
selectedEmojis: selectedEmoji,
let params = EmojiPickerScreenCoordinatorParameters(selectedEmojis: selectedEmojis,
emojiProvider: flowParameters.emojiProvider,
timelineController: timelineController)
continuation: emojiPickerContinuation)
let coordinator = EmojiPickerScreenCoordinator(parameters: params)
coordinator.actions.sink { [weak self] action in
@@ -56,7 +56,7 @@ extension RoomFlowCoordinator {
case inviteUsersScreen(flow: InviteUsersFlow, previousState: State)
case mediaUploadPicker(mode: MediaPickerScreenMode, caption: NSAttributedString, previousState: State)
case mediaUploadPreview(mediaURLs: [URL], caption: NSAttributedString?, previousState: State)
case emojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>, previousState: State)
case emojiPicker(selectedEmojis: Set<String>, previousState: State)
case mapNavigator(previousState: State)
case messageForwarding(forwardingItem: MessageForwardingItem, previousState: State)
case reportContent(itemID: TimelineItemIdentifier, senderID: String, previousState: State)
@@ -90,6 +90,7 @@ extension RoomFlowCoordinator {
var timelineController: TimelineControllerProtocol?
var spaceRoomListProxy: SpaceRoomListProxyProtocol?
var authorizedSpacesSelection: AuthorizedSpacesSelection?
var emojiPickerContinuation: EmojiPickerScreenContinuation?
}
enum Event: EventType {
@@ -133,7 +134,7 @@ extension RoomFlowCoordinator {
case presentMediaUploadPreview(mediaURLs: [URL], caption: NSAttributedString?)
case dismissMediaUploadPreview
case presentEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
case presentEmojiPicker(selectedEmojis: Set<String>)
case dismissEmojiPicker
case presentMapNavigator(interactionMode: LocationSharingInteractionMode)
@@ -204,8 +205,8 @@ extension RoomFlowCoordinator {
case (.room, .presentMediaUploadPreview(let mediaURLs, let caption)):
return .mediaUploadPreview(mediaURLs: mediaURLs, caption: caption, previousState: fromState)
case (.room, .presentEmojiPicker(let itemID, let selectedEmoji)):
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
case (.room, .presentEmojiPicker(let selectedEmojis)):
return .emojiPicker(selectedEmojis: selectedEmojis, previousState: fromState)
case (.room, .presentMessageForwarding(let forwardingItem)):
return .messageForwarding(forwardingItem: forwardingItem, previousState: fromState)
@@ -253,8 +254,8 @@ extension RoomFlowCoordinator {
case (.thread, .presentMediaUploadPreview(let mediaURLs, let caption)):
return .mediaUploadPreview(mediaURLs: mediaURLs, caption: caption, previousState: fromState)
case (.thread, .presentEmojiPicker(let itemID, let selectedEmoji)):
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
case (.thread, .presentEmojiPicker(let selectedEmojis)):
return .emojiPicker(selectedEmojis: selectedEmojis, previousState: fromState)
case (.thread, .presentMessageForwarding(let forwardingItem)):
return .messageForwarding(forwardingItem: forwardingItem, previousState: fromState)
@@ -273,7 +274,7 @@ extension RoomFlowCoordinator {
case (.mediaUploadPicker(_, _, let previousState), .dismissMediaUploadPicker):
return previousState
case (.emojiPicker(_, _, let previouState), .dismissEmojiPicker):
case (.emojiPicker(_, let previouState), .dismissEmojiPicker):
return previouState
case (.reportContent(_, _, let previousState), .dismissReportContent):
@@ -91,6 +91,8 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
startEncryptionSettingsFlow()
case .userDetails:
presentUserDetailsEditScreen()
case let .userStatusEmojiPicker(continuation):
presentEmojiPicker(emojiPickerContinuation: continuation)
case .linkNewDevice:
startLinkNewDeviceFlow()
case let .manageAccount(url):
@@ -159,6 +161,22 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
coordinator.start()
}
private func presentEmojiPicker(emojiPickerContinuation: EmojiPickerScreenContinuation) {
let coordinator = EmojiPickerScreenCoordinator(parameters: .init(selectedEmojis: [],
emojiProvider: flowParameters.emojiProvider,
continuation: emojiPickerContinuation))
coordinator.actions
.sink { [weak self] action in
switch action {
case .dismiss:
self?.navigationStackCoordinator.setSheetCoordinator(nil)
}
}
.store(in: &cancellables)
navigationStackCoordinator.setSheetCoordinator(coordinator)
}
private func presentUserDetailsEditScreen() {
let coordinator = UserDetailsEditScreenCoordinator(parameters: .init(orientationManager: flowParameters.windowManager,
userSession: flowParameters.userSession,