From 18e9783a64451286e413af312fd42396978a43dc Mon Sep 17 00:00:00 2001 From: Alfonso Grillo Date: Wed, 2 Nov 2022 20:08:43 +0100 Subject: [PATCH] Mock settings in UserSessionsOverviewViewModel --- ...ettings+ UserSessionSettingsProtocol.swift | 28 +++++++++++++++++++ .../Mock/MockUserSessionSettings.swift | 25 +++++++++++++++++ .../Service/UserSessionSettingsProtocol.swift | 23 +++++++++++++++ .../UserSessionsOverviewCoordinator.swift | 2 +- .../MockUserSessionsOverviewScreenState.swift | 2 +- .../UserSessionsOverviewModels.swift | 2 +- .../UserSessionsOverviewViewModel.swift | 17 ++++++----- 7 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 RiotSwiftUI/Modules/UserSessions/Common/Service/MatrixSDK/RiotSettings+ UserSessionSettingsProtocol.swift create mode 100644 RiotSwiftUI/Modules/UserSessions/Common/Service/Mock/MockUserSessionSettings.swift create mode 100644 RiotSwiftUI/Modules/UserSessions/Common/Service/UserSessionSettingsProtocol.swift diff --git a/RiotSwiftUI/Modules/UserSessions/Common/Service/MatrixSDK/RiotSettings+ UserSessionSettingsProtocol.swift b/RiotSwiftUI/Modules/UserSessions/Common/Service/MatrixSDK/RiotSettings+ UserSessionSettingsProtocol.swift new file mode 100644 index 000000000..2df782657 --- /dev/null +++ b/RiotSwiftUI/Modules/UserSessions/Common/Service/MatrixSDK/RiotSettings+ UserSessionSettingsProtocol.swift @@ -0,0 +1,28 @@ +// +// Copyright 2022 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 Combine + +extension RiotSettings: UserSessionSettingsProtocol { + var showIPAddressesInSessionsManagerPublisher: AnyPublisher { + NotificationCenter.default + .publisher(for: .userDefaultValueUpdated) + .compactMap { $0.object as? String } + .filter { $0 == RiotSettings.UserDefaultsKeys.showIPAddressesInSessionsManager } + .map { _ in RiotSettings.shared.showIPAddressesInSessionsManager } + .eraseToAnyPublisher() + } +} diff --git a/RiotSwiftUI/Modules/UserSessions/Common/Service/Mock/MockUserSessionSettings.swift b/RiotSwiftUI/Modules/UserSessions/Common/Service/Mock/MockUserSessionSettings.swift new file mode 100644 index 000000000..addec40a4 --- /dev/null +++ b/RiotSwiftUI/Modules/UserSessions/Common/Service/Mock/MockUserSessionSettings.swift @@ -0,0 +1,25 @@ +// +// Copyright 2022 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 Combine + +final class MockUserSessionSettings: UserSessionSettingsProtocol { + var showIPAddressesInSessionsManager: Bool = false + + var showIPAddressesInSessionsManagerPublisher: AnyPublisher { + Just(showIPAddressesInSessionsManager).eraseToAnyPublisher() + } +} diff --git a/RiotSwiftUI/Modules/UserSessions/Common/Service/UserSessionSettingsProtocol.swift b/RiotSwiftUI/Modules/UserSessions/Common/Service/UserSessionSettingsProtocol.swift new file mode 100644 index 000000000..9e9a4d9ea --- /dev/null +++ b/RiotSwiftUI/Modules/UserSessions/Common/Service/UserSessionSettingsProtocol.swift @@ -0,0 +1,23 @@ +// +// Copyright 2022 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 Combine + +protocol UserSessionSettingsProtocol: AnyObject { + var showIPAddressesInSessionsManager: Bool { get set } + var showIPAddressesInSessionsManagerPublisher: AnyPublisher { get } +} + diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Coordinator/UserSessionsOverviewCoordinator.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Coordinator/UserSessionsOverviewCoordinator.swift index 4fb3d1a63..7d3d0437c 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Coordinator/UserSessionsOverviewCoordinator.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Coordinator/UserSessionsOverviewCoordinator.swift @@ -39,7 +39,7 @@ final class UserSessionsOverviewCoordinator: Coordinator, Presentable { self.parameters = parameters service = parameters.service - viewModel = UserSessionsOverviewViewModel(userSessionsOverviewService: parameters.service) + viewModel = UserSessionsOverviewViewModel(userSessionsOverviewService: parameters.service, settingsService: RiotSettings.shared) hostingViewController = VectorHostingController(rootView: UserSessionsOverview(viewModel: viewModel.context)) hostingViewController.vc_setLargeTitleDisplayMode(.never) diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/MockUserSessionsOverviewScreenState.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/MockUserSessionsOverviewScreenState.swift index 626c8c07a..175a7d9a0 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/MockUserSessionsOverviewScreenState.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/MockUserSessionsOverviewScreenState.swift @@ -51,7 +51,7 @@ enum MockUserSessionsOverviewScreenState: MockScreenState, CaseIterable { fatalError() } - let viewModel = UserSessionsOverviewViewModel(userSessionsOverviewService: service) + let viewModel = UserSessionsOverviewViewModel(userSessionsOverviewService: service, settingsService: MockUserSessionSettings()) return ( [service, viewModel], diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewModels.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewModels.swift index 15046ae25..a7429f12f 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewModels.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewModels.swift @@ -50,7 +50,7 @@ struct UserSessionsOverviewViewState: BindableState { var otherSessionsViewData = [UserSessionListItemViewData]() var showLoadingIndicator = false var linkDeviceButtonVisible = false - var showLocationInfo = RiotSettings.shared.showIPAddressesInSessionsManager + var showLocationInfo: Bool } enum UserSessionsOverviewViewAction { diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewViewModel.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewViewModel.swift index deb228ad0..a2d92628a 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewViewModel.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewViewModel.swift @@ -20,24 +20,23 @@ typealias UserSessionsOverviewViewModelType = StateStoreViewModel Void)? - init(userSessionsOverviewService: UserSessionsOverviewServiceProtocol) { + init(userSessionsOverviewService: UserSessionsOverviewServiceProtocol, settingsService: UserSessionSettingsProtocol) { self.userSessionsOverviewService = userSessionsOverviewService + self.settingsService = settingsService - super.init(initialViewState: .init()) + super.init(initialViewState: .init(showLocationInfo: settingsService.showIPAddressesInSessionsManager)) userSessionsOverviewService.overviewDataPublisher.sink { [weak self] overviewData in self?.updateViewState(with: overviewData) } .store(in: &cancellables) - NotificationCenter.default - .publisher(for: .userDefaultValueUpdated) - .compactMap { $0.object as? String } - .filter { $0 == RiotSettings.UserDefaultsKeys.showIPAddressesInSessionsManager } - .map { _ in RiotSettings.shared.showIPAddressesInSessionsManager } + self.settingsService + .showIPAddressesInSessionsManagerPublisher .weakAssign(to: \.state.showLocationInfo, on: self) .store(in: &cancellables) @@ -87,8 +86,8 @@ class UserSessionsOverviewViewModel: UserSessionsOverviewViewModelType, UserSess case .logoutOtherSessions: completion?(.logoutFromUserSessions(sessionInfos: userSessionsOverviewService.otherSessions)) case .showLocationInfo: - RiotSettings.shared.showIPAddressesInSessionsManager.toggle() - state.showLocationInfo = RiotSettings.shared.showIPAddressesInSessionsManager + settingsService.showIPAddressesInSessionsManager.toggle() + state.showLocationInfo = settingsService.showIPAddressesInSessionsManager } }