mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Limit conversations a message can be forwarded to (#5793)
* Limit conversations a message can be forwarded to * Review fixups * fix: remove the unused constant argument --------- Co-authored-by: Mauro Romito <mauro.romito@element.io>
This commit is contained in:
+6
-1
@@ -16,8 +16,13 @@ enum MessageForwardingScreenViewModelAction {
|
|||||||
|
|
||||||
struct MessageForwardingScreenViewState: BindableState {
|
struct MessageForwardingScreenViewState: BindableState {
|
||||||
var rooms: [MessageForwardingRoom] = []
|
var rooms: [MessageForwardingRoom] = []
|
||||||
var selectedRoomIDs = [String]()
|
var selectedRoomIDs: Set<String> = []
|
||||||
|
let maxRoomSelectionCount = 10
|
||||||
var bindings = MessageForwardingScreenViewStateBindings()
|
var bindings = MessageForwardingScreenViewStateBindings()
|
||||||
|
|
||||||
|
var isAtRoomSelectionLimit: Bool {
|
||||||
|
selectedRoomIDs.count >= maxRoomSelectionCount
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MessageForwardingScreenViewStateBindings {
|
struct MessageForwardingScreenViewStateBindings {
|
||||||
|
|||||||
+3
-3
@@ -63,10 +63,10 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
|||||||
case .send:
|
case .send:
|
||||||
Task { await forward() }
|
Task { await forward() }
|
||||||
case .selectRoom(let roomID):
|
case .selectRoom(let roomID):
|
||||||
if let index = state.selectedRoomIDs.firstIndex(of: roomID) {
|
if state.selectedRoomIDs.contains(roomID) == false, state.selectedRoomIDs.count < state.maxRoomSelectionCount {
|
||||||
state.selectedRoomIDs.remove(at: index)
|
state.selectedRoomIDs.insert(roomID)
|
||||||
} else {
|
} else {
|
||||||
state.selectedRoomIDs.append(roomID)
|
state.selectedRoomIDs.remove(roomID)
|
||||||
}
|
}
|
||||||
case .reachedTop:
|
case .reachedTop:
|
||||||
updateVisibleRange(edge: .top)
|
updateVisibleRange(edge: .top)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ struct MessageForwardingScreen: View {
|
|||||||
ForEach(context.viewState.rooms) { room in
|
ForEach(context.viewState.rooms) { room in
|
||||||
MessageForwardingListRow(room: room,
|
MessageForwardingListRow(room: room,
|
||||||
isSelected: context.viewState.selectedRoomIDs.contains(room.id),
|
isSelected: context.viewState.selectedRoomIDs.contains(room.id),
|
||||||
|
isDisabled: context.viewState.isAtRoomSelectionLimit && !context.viewState.selectedRoomIDs.contains(room.id),
|
||||||
context: context)
|
context: context)
|
||||||
}
|
}
|
||||||
// Replace these with ScrollView's `scrollPosition` when dropping iOS 16.
|
// Replace these with ScrollView's `scrollPosition` when dropping iOS 16.
|
||||||
@@ -68,6 +69,7 @@ private struct MessageForwardingListRow: View {
|
|||||||
|
|
||||||
let room: MessageForwardingRoom
|
let room: MessageForwardingRoom
|
||||||
let isSelected: Bool
|
let isSelected: Bool
|
||||||
|
let isDisabled: Bool
|
||||||
let context: MessageForwardingScreenViewModel.Context
|
let context: MessageForwardingScreenViewModel.Context
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -77,6 +79,7 @@ private struct MessageForwardingListRow: View {
|
|||||||
kind: .selection(isSelected: isSelected) {
|
kind: .selection(isSelected: isSelected) {
|
||||||
context.send(viewAction: .selectRoom(roomID: room.id))
|
context.send(viewAction: .selectRoom(roomID: room.id))
|
||||||
})
|
})
|
||||||
|
.disabled(isDisabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
|
|||||||
Reference in New Issue
Block a user