Enable room list invites by default and remove old code paths

This commit is contained in:
Stefan Ceriu
2024-05-09 12:05:28 +03:00
committed by Stefan Ceriu
parent 65310acc64
commit a401976b2b
60 changed files with 27 additions and 1155 deletions
@@ -33,7 +33,6 @@ enum HomeScreenCoordinatorAction {
case presentFeedbackScreen
case presentSecureBackupSettings
case presentStartChatScreen
case presentInvitesScreen
case presentGlobalSearch
case presentRoomDirectorySearch
case logout
@@ -80,8 +79,6 @@ final class HomeScreenCoordinator: CoordinatorProtocol {
actionsSubject.send(.logout)
case .presentStartChatScreen:
actionsSubject.send(.presentStartChatScreen)
case .presentInvitesScreen:
actionsSubject.send(.presentInvitesScreen)
case .presentGlobalSearch:
actionsSubject.send(.presentGlobalSearch)
case .presentRoomDirectorySearch:
@@ -26,7 +26,6 @@ enum HomeScreenViewModelAction {
case presentSettingsScreen
case presentFeedbackScreen
case presentStartChatScreen
case presentInvitesScreen
case presentGlobalSearch
case presentRoomDirectorySearch
case logout
@@ -42,7 +41,6 @@ enum HomeScreenViewAction {
case confirmRecoveryKey
case skipRecoveryKeyConfirmation
case updateVisibleItemRange(range: Range<Int>, isScrolling: Bool)
case selectInvites
case globalSearch
case markRoomAsUnread(roomIdentifier: String)
case markRoomAsRead(roomIdentifier: String)
@@ -91,7 +89,6 @@ struct HomeScreenViewState: BindableState {
var roomListMode: HomeScreenRoomListMode = .skeletons
var hasPendingInvitations = false
var hasUnreadPendingInvitations = false
var isRoomDirectorySearchEnabled = false
@@ -129,10 +126,6 @@ struct HomeScreenViewState: BindableState {
var shouldShowRecoveryKeyConfirmationBanner: Bool {
securityBannerMode == .recoveryKeyConfirmation
}
var shouldShowInvitesButton: Bool {
!ServiceLocator.shared.settings.roomListInvitesEnabled && hasPendingInvitations && !bindings.isSearchFieldFocused
}
}
struct HomeScreenViewStateBindings {
@@ -27,7 +27,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
private let userIndicatorController: UserIndicatorControllerProtocol
private let roomSummaryProvider: RoomSummaryProviderProtocol?
private let inviteSummaryProvider: RoomSummaryProviderProtocol?
private var migrationCancellable: AnyCancellable?
@@ -50,7 +49,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
self.userIndicatorController = userIndicatorController
roomSummaryProvider = userSession.clientProxy.roomSummaryProvider
inviteSummaryProvider = userSession.clientProxy.inviteSummaryProvider
super.init(initialViewState: .init(userID: userSession.userID),
imageProvider: userSession.mediaProvider)
@@ -157,8 +155,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
visibleItemRangePublisher.send((range, isScrolling))
case .startChat:
actionsSubject.send(.presentStartChatScreen)
case .selectInvites:
actionsSubject.send(.presentInvitesScreen)
case .globalSearch:
actionsSubject.send(.presentGlobalSearch)
case .markRoomAsUnread(let roomIdentifier):
@@ -233,7 +229,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
}
private func setupRoomListSubscriptions() {
guard let roomSummaryProvider, let inviteSummaryProvider else {
guard let roomSummaryProvider else {
MXLog.error("Room summary provider unavailable")
return
}
@@ -280,28 +276,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
self?.installListRangeModifiers()
}
.store(in: &cancellables)
inviteSummaryProvider.roomListPublisher
.combineLatest(appSettings.$seenInvites)
.receive(on: DispatchQueue.main)
.sink { [weak self] summaries, seenInvites in
self?.state.hasPendingInvitations = !summaries.isEmpty
let invites = summaries.compactMap(\.id)
let unreadInvites = summaries.filter { summary in
guard let roomID = summary.id else {
return false
}
return !seenInvites.contains(roomID)
}
MXLog.info("Received invite list update - invites: \(invites), seenInvites: \(seenInvites), unreadInvites: \(unreadInvites)")
self?.state.hasUnreadPendingInvitations = !unreadInvites.isEmpty
}
.store(in: &cancellables)
}
private func updateRoomListMode(with roomSummaryProviderState: RoomSummaryProviderState) {
@@ -32,11 +32,7 @@ enum RoomListFilter: Int, CaseIterable, Identifiable {
case invites
static var availableFilters: [RoomListFilter] {
if ServiceLocator.shared.settings.roomListInvitesEnabled {
return RoomListFilter.allCases
} else {
return RoomListFilter.allCases.filter { !($0 == .invites) }
}
RoomListFilter.allCases
}
var localizedName: String {
@@ -111,8 +111,7 @@ struct HomeScreenContent: View {
private var topSection: some View {
// An empty VStack causes glitches within the room list
if context.viewState.shouldShowFilters ||
context.viewState.shouldShowRecoveryKeyConfirmationBanner ||
context.viewState.shouldShowInvitesButton {
context.viewState.shouldShowRecoveryKeyConfirmationBanner {
VStack(spacing: 0) {
if context.viewState.shouldShowFilters {
RoomListFiltersView(state: $context.filtersState)
@@ -121,14 +120,6 @@ struct HomeScreenContent: View {
if context.viewState.shouldShowRecoveryKeyConfirmationBanner {
HomeScreenRecoveryKeyConfirmationBanner(context: context)
}
if context.viewState.shouldShowInvitesButton {
HomeScreenInvitesButton(title: L10n.actionInvitesList, hasBadge: context.viewState.hasUnreadPendingInvitations) {
context.send(viewAction: .selectInvites)
}
.accessibilityIdentifier(A11yIdentifiers.homeScreen.invites)
.frame(maxWidth: .infinity, alignment: .trailing)
}
}
.background(Color.compound.bgCanvasDefault)
}
@@ -112,13 +112,11 @@ struct HomeScreenInviteCell: View {
context.send(viewAction: .declineInvite(roomIdentifier: room.id))
}
.buttonStyle(.compound(.secondary, size: .medium))
.accessibilityIdentifier(A11yIdentifiers.invitesScreen.decline)
Button(L10n.actionAccept) {
context.send(viewAction: .acceptInvite(roomIdentifier: room.id))
}
.buttonStyle(.compound(.primary, size: .medium))
.accessibilityIdentifier(A11yIdentifiers.invitesScreen.accept)
}
}
@@ -1,62 +0,0 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import SwiftUI
struct HomeScreenInvitesButton: View {
let title: String
let hasBadge: Bool
let action: () -> Void
var body: some View {
Button(action: action) {
HStack(spacing: 8.0) {
Text(title)
.foregroundColor(.compound.textPrimary)
.font(.compound.bodyMDSemibold)
if hasBadge {
badge
}
}
.padding(.trailing, 16.0)
.padding(.leading, 64.0)
.padding(.vertical, 8.0)
}
}
// MARK: - Private
private var badge: some View {
Circle()
.scaledFrame(size: 12)
.foregroundColor(.compound.iconAccentTertiary)
}
}
struct HomeScreenInvitesButton_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
HomeScreenInvitesButton(title: "Invites", hasBadge: true, action: { })
.previewDisplayName("Badge on")
HomeScreenInvitesButton(title: "Invites", hasBadge: false, action: { })
.previewDisplayName("Badge off")
HomeScreenInvitesButton(title: "Invites", hasBadge: true, action: { })
.previewDisplayName("Badge on (AX1)")
.dynamicTypeSize(.accessibility1)
}
}