Extract composer toolbar to a dedicated component (#1427)

* Extract composer toolbar to a dedicated component

* Use publisher for composer mode

* Introduce `RoomScreenComposerProvider`

* Add `ComposerToolbarViewModelTests`

* Rename protocols and add passthrough subjects for focused and composer mode

* Remove `ComposerToolbarViewActionHandler` and `ComposerToolbarCoordinatorParameters`

* Remove `RoomScreenComposerActionHandlerProtocol` and `RoomScreenComposerProviderProtocol`

* Re-arrange code a bit

* Remove composer mode being stored on `RoomScreen`

* Rename `process(viewAction: ComposerToolbarViewAction)` to `process(composerAction: ComposerToolbarViewAction)`

* Replace PassthroughSubject with direct function call

* Remove `ComposerToolbarCoordinator`

* Remove `cancelEdit` and `cancelReply` from external composer view model actions

* Use `RoomScreenComposerAction` as a sub-`RoomScreenViewModelAction`

* Move `ComposerToolbarViewModel` callback to actionsSubject

* Move `RoomScreenViewModel` callback to actionsSubject

* Fix `RoomScreenViewModelTests`

* Rename `composerAction` parameter to `roomAction`

* Fix unit tests
This commit is contained in:
aringenbach
2023-08-08 14:25:23 +02:00
committed by GitHub
parent 9a7a9c8d98
commit 59865a4b16
19 changed files with 513 additions and 204 deletions
@@ -32,6 +32,7 @@ enum RoomScreenViewModelAction {
case displayRoomMemberDetails(member: RoomMemberProxyProtocol)
case displayMessageForwarding(itemID: TimelineItemIdentifier)
case displayLocation(body: String, geoURI: GeoURI, description: String?)
case composer(action: RoomScreenComposerAction)
}
enum RoomScreenComposerMode: Equatable {
@@ -55,10 +56,7 @@ enum RoomScreenViewAction {
case itemDisappeared(itemID: TimelineItemIdentifier)
case itemTapped(itemID: TimelineItemIdentifier)
case linkClicked(url: URL)
case sendMessage
case toggleReaction(key: String, itemID: TimelineItemIdentifier)
case cancelReply
case cancelEdit
case sendReadReceiptIfNeeded(TimelineItemIdentifier)
case paginateBackwards
@@ -67,11 +65,6 @@ enum RoomScreenViewAction {
case displayEmojiPicker(itemID: TimelineItemIdentifier)
case displayCameraPicker
case displayMediaPicker
case displayDocumentPicker
case displayLocationPicker
case handlePasteOrDrop(provider: NSItemProvider)
case tappedOnUser(userID: String)
@@ -83,6 +76,13 @@ enum RoomScreenViewAction {
case scrolledToBottom
}
enum RoomScreenComposerAction {
case setMode(mode: RoomScreenComposerMode)
case setText(text: String)
case removeFocus
case clear
}
struct RoomScreenViewState: BindableState {
var roomID: String
var roomTitle = ""
@@ -93,29 +93,16 @@ struct RoomScreenViewState: BindableState {
var readReceiptsEnabled: Bool
var isEncryptedOneToOneRoom = false
var timelineViewState = TimelineViewState() // check the doc before changing this
var composerMode: RoomScreenComposerMode = .default
var swiftUITimelineEnabled = false
var bindings: RoomScreenViewStateBindings
/// A closure providing the actions to show when long pressing on an item in the timeline.
var timelineItemMenuActionProvider: (@MainActor (_ itemId: TimelineItemIdentifier) -> TimelineItemMenuActions?)?
var sendButtonDisabled: Bool {
bindings.composerText.count == 0
}
}
struct RoomScreenViewStateBindings {
var composerText: String
var composerFocused: Bool
var isScrolledToBottom = true
var showAttachmentPopover = false {
didSet {
composerFocused = false
}
}
/// The state of wether reactions listed on the timeline are expanded/collapsed.
/// Key is itemID, value is the collapsed state.