#1899, #1900, #1901 - Implement chat backup setting screens

This commit is contained in:
Stefan Ceriu
2023-10-19 15:34:10 +03:00
committed by GitHub
parent 15b5b44422
commit c8b9d95122
70 changed files with 2293 additions and 48 deletions
@@ -71,6 +71,8 @@ struct HomeScreenViewState: BindableState {
var userDisplayName: String?
var userAvatarURL: URL?
var showSessionVerificationBanner = false
var showUserMenuBadge = false
var showSettingsMenuOptionBadge = false
var rooms: [HomeScreenRoom] = []
var roomListMode: HomeScreenRoomListMode = .skeletons
@@ -53,7 +53,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
roomSummaryProvider = userSession.clientProxy.roomSummaryProvider
inviteSummaryProvider = userSession.clientProxy.inviteSummaryProvider
super.init(initialViewState: HomeScreenViewState(userID: userSession.userID),
super.init(initialViewState: .init(userID: userSession.userID),
imageProvider: userSession.mediaProvider)
userSession.callbacks
@@ -80,6 +80,19 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
.weakAssign(to: \.state.userDisplayName, on: self)
.store(in: &cancellables)
userSession.clientProxy.secureBackupController.recoveryKeyState
.receive(on: DispatchQueue.main)
.map { state in
state == .unknown || state == .disabled
}
.sink { [weak self] requiresSecureBackupSetup in
guard let self else { return }
state.showUserMenuBadge = requiresSecureBackupSetup && appSettings.chatBackupEnabled
state.showSettingsMenuOptionBadge = requiresSecureBackupSetup && appSettings.chatBackupEnabled
}
.store(in: &cancellables)
selectedRoomPublisher
.weakAssign(to: \.state.selectedRoomID, on: self)
.store(in: &cancellables)
@@ -18,6 +18,7 @@ import SwiftUI
struct HomeScreenUserMenuButton: View {
@State private var showingLogoutConfirmation = false
@Environment(\.colorScheme) var colorScheme
@ObservedObject var context: HomeScreenViewModel.Context
@@ -27,7 +28,11 @@ struct HomeScreenUserMenuButton: View {
Button {
context.send(viewAction: .userMenu(action: .settings))
} label: {
Label(L10n.commonSettings, systemImage: "gearshape")
Label {
Text(L10n.commonSettings)
} icon: {
settingsIconImage
}
}
.accessibilityIdentifier(A11yIdentifiers.homeScreen.settings)
}
@@ -55,6 +60,8 @@ struct HomeScreenUserMenuButton: View {
avatarSize: .user(on: .home),
imageProvider: context.imageProvider)
.accessibilityIdentifier(A11yIdentifiers.homeScreen.userAvatar)
.overlayBadge(10, isBadged: context.viewState.showUserMenuBadge)
.compositingGroup()
}
.alert(L10n.screenSignoutConfirmationDialogTitle,
isPresented: $showingLogoutConfirmation) {
@@ -67,4 +74,24 @@ struct HomeScreenUserMenuButton: View {
}
.accessibilityLabel(L10n.a11yUserMenu)
}
// MARK: - Private
/// Menu doesn't render composed views. Trick it into showing a badge.
private var settingsIconImage: Image? {
let settingsIcon = Image(systemSymbol: .gearshape)
.resizable()
.frame(width: 100, height: 100)
.overlayBadge(40, isBadged: context.viewState.showSettingsMenuOptionBadge)
.colorScheme(colorScheme)
.padding()
let renderer = ImageRenderer(content: settingsIcon)
guard let image = renderer.uiImage else {
return nil
}
return Image(uiImage: image)
}
}