Forward current composer text to the new poll form to serve as the question/topic

This commit is contained in:
Stefan Ceriu
2026-05-22 13:01:22 +03:00
parent ac20ff0fc3
commit 77c5aba326
11 changed files with 26 additions and 21 deletions
@@ -22,8 +22,8 @@ struct PollFormScreenViewState: BindableState {
self.maxNumberOfOptions = maxNumberOfOptions
switch mode {
case .new:
bindings = .init()
case .new(let topic):
bindings = .init(question: topic ?? "")
case .edit(_, let poll):
bindings = .init(poll: poll)
}
@@ -71,7 +71,7 @@ struct PollFormScreenViewState: BindableState {
}
enum PollFormMode: Hashable {
case new
case new(topic: String?)
case edit(eventID: String, poll: Poll)
}
@@ -198,7 +198,7 @@ private struct PollFormOptionRow: View {
// MARK: - Previews
struct PollFormScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = makeViewModel(mode: .new)
static let viewModel = makeViewModel(mode: .new(topic: nil))
static let editViewModel = makeViewModel(mode: .edit(eventID: "1234", poll: poll))
static let poll = Poll(question: "Cats or Dogs?",
kind: .disclosed,
@@ -72,7 +72,7 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
case .displayMediaDetails(item: let item):
displayMediaPreviewSheet(for: item)
case .displayEmojiPicker, .displayReportContent, .displayCameraPicker, .displayMediaPicker,
.displayDocumentPicker, .displayLocationPicker, .displayLiveLocation, .displayPollForm, .displayMediaUploadPreviewScreen,
.displayDocumentPicker, .displayLocationPicker, .displayLiveLocation, .displayNewPollForm, .displayEditPollForm, .displayMediaUploadPreviewScreen,
.displaySenderDetails, .displayMessageForwarding, .displayLocation, .displayResolveSendFailure,
.displayThread, .composer, .hasScrolled, .viewInRoomTimeline, .displayRoom:
break
@@ -97,7 +97,7 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
case .displayMediaDetails(item: let item):
displayMediaPreviewSheet(for: item)
case .displayEmojiPicker, .displayReportContent, .displayCameraPicker, .displayMediaPicker,
.displayDocumentPicker, .displayLocationPicker, .displayLiveLocation, .displayPollForm, .displayMediaUploadPreviewScreen,
.displayDocumentPicker, .displayLocationPicker, .displayLiveLocation, .displayNewPollForm, .displayEditPollForm, .displayMediaUploadPreviewScreen,
.displaySenderDetails, .displayMessageForwarding, .displayLocation, .displayResolveSendFailure,
.displayThread, .composer, .hasScrolled, .viewInRoomTimeline, .displayRoom:
break
@@ -96,7 +96,7 @@ final class PinnedEventsTimelineScreenCoordinator: CoordinatorProtocol {
actionsSubject.send(.displayRoomScreenWithFocussedPin(eventID: eventID, threadRootEventID: threadRootEventID))
// These other actions will not be handled in this view
case .displayEmojiPicker, .displayReportContent, .displayCameraPicker, .displayMediaPicker,
.displayDocumentPicker, .displayLocationPicker, .displayPollForm, .displayMediaUploadPreviewScreen,
.displayDocumentPicker, .displayLocationPicker, .displayNewPollForm, .displayEditPollForm, .displayMediaUploadPreviewScreen,
.displayResolveSendFailure, .displayThread, .composer, .hasScrolled, .displayRoom, .displayMediaDetails:
// These actions are not handled in this coordinator
break
@@ -134,8 +134,10 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
roomViewModel.displayMediaPreview(mediaPreviewViewModel)
case .displayLocationPicker:
actionsSubject.send(.presentLocationPicker)
case .displayPollForm(let mode):
actionsSubject.send(.presentPollForm(mode: mode))
case .displayNewPollForm:
actionsSubject.send(.presentPollForm(mode: .new(topic: composerViewModel.context.plainComposerText.string)))
case .displayEditPollForm(let eventID, let poll):
actionsSubject.send(.presentPollForm(mode: .edit(eventID: eventID, poll: poll)))
case .displayMediaUploadPreviewScreen(let mediaURLs):
actionsSubject.send(.presentMediaUploadPreviewScreen(mediaURLs: mediaURLs,
caption: composerViewModel.context.plainComposerText))
@@ -126,8 +126,10 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol {
actionsSubject.send(.presentLocationViewer(location))
case .displayLiveLocation(let sender, let initialLiveLocationShare):
actionsSubject.send(.presentLiveLocationViewer(sender: sender, initialLiveLocationShare: initialLiveLocationShare))
case .displayPollForm(let mode):
actionsSubject.send(.presentPollForm(mode: mode))
case .displayNewPollForm:
actionsSubject.send(.presentPollForm(mode: .new(topic: composerViewModel.context.plainComposerText.string)))
case .displayEditPollForm(let eventID, let poll):
actionsSubject.send(.presentPollForm(mode: .edit(eventID: eventID, poll: poll)))
case .displayMediaUploadPreviewScreen(let mediaURLs):
actionsSubject.send(.presentMediaUploadPreviewScreen(mediaURLs: mediaURLs,
caption: composerViewModel.context.plainComposerText))
@@ -16,7 +16,7 @@ enum TimelineInteractionHandlerAction {
case displayReportContent(itemID: TimelineItemIdentifier, senderID: String)
case displayMessageForwarding(itemID: TimelineItemIdentifier)
case displayMediaUploadPreviewScreen(mediaURLs: [URL])
case displayPollForm(mode: PollFormMode)
case displayEditPollForm(eventID: String, poll: Poll)
case showActionMenu(TimelineItemActionMenuInfo)
case showDebugInfo(TimelineItemDebugInfo)
@@ -130,7 +130,7 @@ class TimelineInteractionHandler {
MXLog.error("Cannot edit poll with id: \(timelineItem.id)")
return
}
actionsSubject.send(.displayPollForm(mode: .edit(eventID: eventID, poll: pollTimelineItem.poll)))
actionsSubject.send(.displayEditPollForm(eventID: eventID, poll: pollTimelineItem.poll))
default:
MXLog.error("Cannot edit item with id: \(timelineItem.id)")
}
@@ -18,7 +18,8 @@ enum TimelineViewModelAction {
case displayMediaPicker
case displayDocumentPicker
case displayLocationPicker
case displayPollForm(mode: PollFormMode)
case displayNewPollForm
case displayEditPollForm(eventID: String, poll: Poll)
case displayMediaUploadPreviewScreen(mediaURLs: [URL])
case displaySenderDetails(userID: String)
case displayMessageForwarding(forwardingItem: MessageForwardingItem)
@@ -370,7 +370,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
case .location:
actionsSubject.send(.displayLocationPicker)
case .poll:
actionsSubject.send(.displayPollForm(mode: .new))
actionsSubject.send(.displayNewPollForm)
}
}
@@ -380,8 +380,8 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
timelineInteractionHandler.sendPollResponse(pollStartID: pollStartID, optionID: optionID)
case let .end(pollStartID):
displayAlert(.pollEndConfirmation(pollStartID))
case .edit(let pollStartID, let poll):
actionsSubject.send(.displayPollForm(mode: .edit(eventID: pollStartID, poll: poll)))
case .edit(let eventID, let poll):
actionsSubject.send(.displayEditPollForm(eventID: eventID, poll: poll))
}
}
@@ -514,8 +514,8 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
actionsSubject.send(.displayEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis))
case .displayMessageForwarding(let itemID):
Task { await self.forwardMessage(itemID: itemID) }
case .displayPollForm(let mode):
actionsSubject.send(.displayPollForm(mode: mode))
case .displayEditPollForm(let eventID, let poll):
actionsSubject.send(.displayEditPollForm(eventID: eventID, poll: poll))
case .displayReportContent(let itemID, let senderID):
actionsSubject.send(.displayReportContent(itemID: itemID, senderID: senderID))
case .displayMediaUploadPreviewScreen(let mediaURLs):
@@ -722,7 +722,7 @@ class MockScreen: Identifiable {
return PlaceholderScreenCoordinator(hideBrandChrome: false)
case .createPoll:
let navigationStackCoordinator = NavigationStackCoordinator()
let coordinator = PollFormScreenCoordinator(parameters: .init(mode: .new,
let coordinator = PollFormScreenCoordinator(parameters: .init(mode: .new(topic: nil),
maxNumberOfOptions: 10,
timelineController: MockTimelineController(),
analytics: analytics,
@@ -176,7 +176,7 @@ struct PollFormScreenViewModelTests {
// MARK: - Helpers
private mutating func setupViewModel(mode: PollFormMode = .new) {
private mutating func setupViewModel(mode: PollFormMode = .new(topic: nil)) {
viewModel = PollFormScreenViewModel(mode: mode,
timelineController: MockTimelineController(timelineProxy: timelineProxy),
analytics: AnalyticsServiceMock.default,