diff --git a/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenModels.swift b/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenModels.swift index 42d20c8ff..b27590ac7 100644 --- a/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenModels.swift +++ b/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenModels.swift @@ -16,8 +16,13 @@ enum MessageForwardingScreenViewModelAction { struct MessageForwardingScreenViewState: BindableState { var rooms: [MessageForwardingRoom] = [] - var selectedRoomIDs = [String]() + var selectedRoomIDs: Set = [] + let maxRoomSelectionCount = 10 var bindings = MessageForwardingScreenViewStateBindings() + + var isAtRoomSelectionLimit: Bool { + selectedRoomIDs.count >= maxRoomSelectionCount + } } struct MessageForwardingScreenViewStateBindings { diff --git a/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenViewModel.swift b/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenViewModel.swift index f59f5eee4..b2e98119f 100644 --- a/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenViewModel.swift +++ b/ElementX/Sources/Screens/MessageForwardingScreen/MessageForwardingScreenViewModel.swift @@ -63,10 +63,10 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me case .send: Task { await forward() } case .selectRoom(let roomID): - if let index = state.selectedRoomIDs.firstIndex(of: roomID) { - state.selectedRoomIDs.remove(at: index) + if state.selectedRoomIDs.contains(roomID) == false, state.selectedRoomIDs.count < state.maxRoomSelectionCount { + state.selectedRoomIDs.insert(roomID) } else { - state.selectedRoomIDs.append(roomID) + state.selectedRoomIDs.remove(roomID) } case .reachedTop: updateVisibleRange(edge: .top) diff --git a/ElementX/Sources/Screens/MessageForwardingScreen/View/MessageForwardingScreen.swift b/ElementX/Sources/Screens/MessageForwardingScreen/View/MessageForwardingScreen.swift index 6fe6150ba..fbefd8e5d 100644 --- a/ElementX/Sources/Screens/MessageForwardingScreen/View/MessageForwardingScreen.swift +++ b/ElementX/Sources/Screens/MessageForwardingScreen/View/MessageForwardingScreen.swift @@ -19,6 +19,7 @@ struct MessageForwardingScreen: View { ForEach(context.viewState.rooms) { room in MessageForwardingListRow(room: room, isSelected: context.viewState.selectedRoomIDs.contains(room.id), + isDisabled: context.viewState.isAtRoomSelectionLimit && !context.viewState.selectedRoomIDs.contains(room.id), context: context) } // Replace these with ScrollView's `scrollPosition` when dropping iOS 16. @@ -68,6 +69,7 @@ private struct MessageForwardingListRow: View { let room: MessageForwardingRoom let isSelected: Bool + let isDisabled: Bool let context: MessageForwardingScreenViewModel.Context var body: some View { @@ -77,6 +79,7 @@ private struct MessageForwardingListRow: View { kind: .selection(isSelected: isSelected) { context.send(viewAction: .selectRoom(roomID: room.id)) }) + .disabled(isDisabled) } @ViewBuilder