mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-05 20:09:04 +00:00
Add a link to the global settings in the room notifications settings (#1433)
This commit is contained in:
@@ -29,19 +29,24 @@ struct RoomDetailsScreenCoordinatorParameters {
|
||||
|
||||
enum RoomDetailsScreenCoordinatorAction {
|
||||
case leftRoom
|
||||
case presentNotificationSettingsScreen
|
||||
}
|
||||
|
||||
final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
|
||||
private let parameters: RoomDetailsScreenCoordinatorParameters
|
||||
private var viewModel: RoomDetailsScreenViewModelProtocol
|
||||
private var cancellables: Set<AnyCancellable> = .init()
|
||||
private let selectedUsers: CurrentValueSubject<[UserProfileProxy], Never> = .init([])
|
||||
private var navigationStackCoordinator: NavigationStackCoordinator? {
|
||||
parameters.navigationStackCoordinator
|
||||
}
|
||||
|
||||
var callback: ((RoomDetailsScreenCoordinatorAction) -> Void)?
|
||||
|
||||
private let actionsSubject: PassthroughSubject<RoomDetailsScreenCoordinatorAction, Never> = .init()
|
||||
private var cancellables: Set<AnyCancellable> = .init()
|
||||
|
||||
var actions: AnyPublisher<RoomDetailsScreenCoordinatorAction, Never> {
|
||||
actionsSubject.eraseToAnyPublisher()
|
||||
}
|
||||
|
||||
init(parameters: RoomDetailsScreenCoordinatorParameters) {
|
||||
self.parameters = parameters
|
||||
|
||||
@@ -65,7 +70,7 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
|
||||
case .requestInvitePeoplePresentation:
|
||||
self.presentInviteUsersScreen()
|
||||
case .leftRoom:
|
||||
self.callback?(.leftRoom)
|
||||
self.actionsSubject.send(.leftRoom)
|
||||
case .requestEditDetailsPresentation(let accountOwner):
|
||||
self.presentRoomDetailsEditScreen(accountOwner: accountOwner)
|
||||
case .requestNotificationSettingsPresentation:
|
||||
@@ -189,9 +194,17 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
|
||||
}
|
||||
|
||||
private func presentNotificationSettings() {
|
||||
let roomNotificationSettingsParameters = RoomNotificationSettingsScreenCoordinatorParameters(notificationSettingsProxy: parameters.notificationSettings,
|
||||
let roomNotificationSettingsParameters = RoomNotificationSettingsScreenCoordinatorParameters(navigationStackCoordinator: parameters.navigationStackCoordinator,
|
||||
notificationSettingsProxy: parameters.notificationSettings,
|
||||
roomProxy: parameters.roomProxy)
|
||||
let roomNotificationSettingsCoordinator = RoomNotificationSettingsScreenCoordinator(parameters: roomNotificationSettingsParameters)
|
||||
roomNotificationSettingsCoordinator.actions.sink { [weak self] actions in
|
||||
switch actions {
|
||||
case .presentNotificationSettingsScreen:
|
||||
self?.actionsSubject.send(.presentNotificationSettingsScreen)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
navigationStackCoordinator?.push(roomNotificationSettingsCoordinator)
|
||||
}
|
||||
}
|
||||
|
||||
+24
-1
@@ -18,13 +18,29 @@ import Combine
|
||||
import SwiftUI
|
||||
|
||||
struct RoomNotificationSettingsScreenCoordinatorParameters {
|
||||
weak var navigationStackCoordinator: NavigationStackCoordinator?
|
||||
let notificationSettingsProxy: NotificationSettingsProxyProtocol
|
||||
let roomProxy: RoomProxyProtocol
|
||||
}
|
||||
|
||||
enum RoomNotificationSettingsScreenCoordinatorAction {
|
||||
case presentNotificationSettingsScreen
|
||||
}
|
||||
|
||||
final class RoomNotificationSettingsScreenCoordinator: CoordinatorProtocol {
|
||||
private let parameters: RoomNotificationSettingsScreenCoordinatorParameters
|
||||
private var viewModel: RoomNotificationSettingsScreenViewModelProtocol
|
||||
|
||||
private let actionsSubject: PassthroughSubject<RoomNotificationSettingsScreenCoordinatorAction, Never> = .init()
|
||||
private var cancellables: Set<AnyCancellable> = .init()
|
||||
|
||||
var actions: AnyPublisher<RoomNotificationSettingsScreenCoordinatorAction, Never> {
|
||||
actionsSubject.eraseToAnyPublisher()
|
||||
}
|
||||
|
||||
private var navigationStackCoordinator: NavigationStackCoordinator? {
|
||||
parameters.navigationStackCoordinator
|
||||
}
|
||||
|
||||
init(parameters: RoomNotificationSettingsScreenCoordinatorParameters) {
|
||||
self.parameters = parameters
|
||||
@@ -32,7 +48,14 @@ final class RoomNotificationSettingsScreenCoordinator: CoordinatorProtocol {
|
||||
roomProxy: parameters.roomProxy)
|
||||
}
|
||||
|
||||
func start() { }
|
||||
func start() {
|
||||
viewModel.actions.sink { [weak self] action in
|
||||
switch action {
|
||||
case .openGlobalSettings:
|
||||
self?.actionsSubject.send(.presentNotificationSettingsScreen)
|
||||
}
|
||||
}.store(in: &cancellables)
|
||||
}
|
||||
|
||||
func toPresentable() -> AnyView {
|
||||
AnyView(RoomNotificationSettingsScreen(context: viewModel.context))
|
||||
|
||||
+8
-1
@@ -16,7 +16,9 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
enum RoomNotificationSettingsScreenViewModelAction { }
|
||||
enum RoomNotificationSettingsScreenViewModelAction {
|
||||
case openGlobalSettings
|
||||
}
|
||||
|
||||
enum RoomNotificationSettingsState {
|
||||
case loading
|
||||
@@ -66,15 +68,20 @@ struct RoomNotificationSettingsScreenViewStateBindings {
|
||||
enum RoomNotificationSettingsScreenViewAction {
|
||||
case changedAllowCustomSettings
|
||||
case setCustomMode(RoomNotificationModeProxy)
|
||||
case customSettingFootnoteLinkTapped
|
||||
}
|
||||
|
||||
struct RoomNotificationSettingsScreenStrings {
|
||||
let customSettingFootnote: AttributedString
|
||||
let customSettingFootnoteLink: URL?
|
||||
|
||||
init() {
|
||||
customSettingFootnoteLink = URL(string: "element://openGlobalSettings")
|
||||
|
||||
let linkPlaceholder = "{link}"
|
||||
var customSettingFootnote = AttributedString(L10n.screenRoomNotificationSettingsDefaultSettingFootnote(linkPlaceholder))
|
||||
var linkString = AttributedString(L10n.screenRoomNotificationSettingsDefaultSettingFootnoteContentLink)
|
||||
linkString.link = customSettingFootnoteLink
|
||||
linkString.bold()
|
||||
customSettingFootnote.replace(linkPlaceholder, with: linkString)
|
||||
|
||||
|
||||
+2
@@ -48,6 +48,8 @@ class RoomNotificationSettingsScreenViewModel: RoomNotificationSettingsScreenVie
|
||||
toogleCustomSetting()
|
||||
case .setCustomMode(let mode):
|
||||
setCustomMode(mode)
|
||||
case .customSettingFootnoteLinkTapped:
|
||||
actionsSubject.send(.openGlobalSettings)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
@@ -71,6 +71,11 @@ struct RoomNotificationSettingsScreen: View {
|
||||
.compoundFormSectionHeader()
|
||||
} footer: {
|
||||
Text(context.viewState.strings.customSettingFootnote)
|
||||
.environment(\.openURL, OpenURLAction { url in
|
||||
guard url == context.viewState.strings.customSettingFootnoteLink else { return .discarded }
|
||||
context.send(viewAction: .customSettingFootnoteLinkTapped)
|
||||
return .handled
|
||||
})
|
||||
.compoundFormSectionFooter()
|
||||
}
|
||||
.compoundFormSection()
|
||||
|
||||
+15
-3
@@ -20,16 +20,19 @@ import SwiftUI
|
||||
struct NotificationSettingsScreenCoordinatorParameters {
|
||||
let userNotificationCenter: UserNotificationCenterProtocol
|
||||
let notificationSettings: NotificationSettingsProxyProtocol
|
||||
let isModallyPresented: Bool
|
||||
}
|
||||
|
||||
enum NotificationSettingsScreenCoordinatorAction { }
|
||||
enum NotificationSettingsScreenCoordinatorAction {
|
||||
case close
|
||||
}
|
||||
|
||||
final class NotificationSettingsScreenCoordinator: CoordinatorProtocol {
|
||||
private let parameters: NotificationSettingsScreenCoordinatorParameters
|
||||
private var viewModel: NotificationSettingsScreenViewModelProtocol
|
||||
private let actionsSubject: PassthroughSubject<NotificationSettingsScreenCoordinatorAction, Never> = .init()
|
||||
private var cancellables: Set<AnyCancellable> = .init()
|
||||
|
||||
|
||||
var actions: AnyPublisher<NotificationSettingsScreenCoordinatorAction, Never> {
|
||||
actionsSubject.eraseToAnyPublisher()
|
||||
}
|
||||
@@ -39,11 +42,20 @@ final class NotificationSettingsScreenCoordinator: CoordinatorProtocol {
|
||||
|
||||
viewModel = NotificationSettingsScreenViewModel(appSettings: ServiceLocator.shared.settings,
|
||||
userNotificationCenter: parameters.userNotificationCenter,
|
||||
notificationSettingsProxy: parameters.notificationSettings)
|
||||
notificationSettingsProxy: parameters.notificationSettings,
|
||||
isModallyPresented: parameters.isModallyPresented)
|
||||
}
|
||||
|
||||
func start() {
|
||||
viewModel.fetchInitialContent()
|
||||
|
||||
viewModel.actions.sink { [weak self] action in
|
||||
switch action {
|
||||
case .close:
|
||||
self?.actionsSubject.send(.close)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
|
||||
func toPresentable() -> AnyView {
|
||||
|
||||
+5
-1
@@ -17,11 +17,14 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
enum NotificationSettingsScreenViewModelAction { }
|
||||
enum NotificationSettingsScreenViewModelAction {
|
||||
case close
|
||||
}
|
||||
|
||||
struct NotificationSettingsScreenViewState: BindableState {
|
||||
var bindings: NotificationSettingsScreenViewStateBindings
|
||||
var strings = NotificationSettingsScreenStrings()
|
||||
let isModallyPresented: Bool
|
||||
var isUserPermissionGranted: Bool?
|
||||
var allowedNotificationModes: [RoomNotificationModeProxy] = [.allMessages, .mentionsAndKeywordsOnly]
|
||||
|
||||
@@ -82,6 +85,7 @@ enum NotificationSettingsScreenViewAction {
|
||||
case directChatsTapped
|
||||
case roomMentionChanged
|
||||
case callsChanged
|
||||
case close
|
||||
}
|
||||
|
||||
enum NotificationSettingsScreenErrorType: Hashable {
|
||||
|
||||
+4
-2
@@ -30,13 +30,13 @@ class NotificationSettingsScreenViewModel: NotificationSettingsScreenViewModelTy
|
||||
actionsSubject.eraseToAnyPublisher()
|
||||
}
|
||||
|
||||
init(appSettings: AppSettings, userNotificationCenter: UserNotificationCenterProtocol, notificationSettingsProxy: NotificationSettingsProxyProtocol) {
|
||||
init(appSettings: AppSettings, userNotificationCenter: UserNotificationCenterProtocol, notificationSettingsProxy: NotificationSettingsProxyProtocol, isModallyPresented: Bool) {
|
||||
self.appSettings = appSettings
|
||||
self.userNotificationCenter = userNotificationCenter
|
||||
self.notificationSettingsProxy = notificationSettingsProxy
|
||||
|
||||
let bindings = NotificationSettingsScreenViewStateBindings(enableNotifications: appSettings.enableNotifications)
|
||||
super.init(initialViewState: NotificationSettingsScreenViewState(bindings: bindings))
|
||||
super.init(initialViewState: NotificationSettingsScreenViewState(bindings: bindings, isModallyPresented: isModallyPresented))
|
||||
|
||||
// Listen for changes to AppSettings.enableNotifications
|
||||
appSettings.$enableNotifications
|
||||
@@ -73,6 +73,8 @@ class NotificationSettingsScreenViewModel: NotificationSettingsScreenViewModelTy
|
||||
return
|
||||
}
|
||||
Task { await enableCalls(state.bindings.callsEnabled) }
|
||||
case .close:
|
||||
actionsSubject.send(.close)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+16
-2
@@ -37,12 +37,25 @@ struct NotificationSettingsScreen: View {
|
||||
}
|
||||
.compoundForm()
|
||||
.navigationTitle(L10n.screenNotificationSettingsTitle)
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.toolbar { toolbar }
|
||||
.alert(item: $context.alertInfo)
|
||||
.track(screen: .settingsNotifications)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
|
||||
@ToolbarContentBuilder
|
||||
private var toolbar: some ToolbarContent {
|
||||
if context.viewState.isModallyPresented {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button(L10n.actionClose) {
|
||||
context.send(viewAction: .close)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var userPermissionSection: some View {
|
||||
Section {
|
||||
HStack(alignment: .firstTextBaseline, spacing: 13) {
|
||||
@@ -183,7 +196,8 @@ struct NotificationSettingsScreen_Previews: PreviewProvider {
|
||||
|
||||
var viewModel = NotificationSettingsScreenViewModel(appSettings: appSettings,
|
||||
userNotificationCenter: notificationCenter,
|
||||
notificationSettingsProxy: notificationSettingsProxy)
|
||||
notificationSettingsProxy: notificationSettingsProxy,
|
||||
isModallyPresented: true)
|
||||
viewModel.fetchInitialContent()
|
||||
return viewModel
|
||||
}()
|
||||
|
||||
@@ -142,7 +142,8 @@ final class SettingsScreenCoordinator: CoordinatorProtocol {
|
||||
|
||||
private func presentNotificationSettings() {
|
||||
let notificationParameters = NotificationSettingsScreenCoordinatorParameters(userNotificationCenter: UNUserNotificationCenter.current(),
|
||||
notificationSettings: parameters.notificationSettings)
|
||||
notificationSettings: parameters.notificationSettings,
|
||||
isModallyPresented: false)
|
||||
let coordinator = NotificationSettingsScreenCoordinator(parameters: notificationParameters)
|
||||
parameters.navigationStackCoordinator?.push(coordinator)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user