mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user