diff --git a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewController.swift b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewController.swift index 54e24b3aa..ab365c476 100644 --- a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewController.swift +++ b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewController.swift @@ -135,8 +135,8 @@ final class ServiceTermsModalScreenViewController: UIViewController { switch viewState { case .loading: self.renderLoading() - case .loaded(let policies): - self.renderLoaded(policies: policies) + case .loaded(let policies, let alreadyAcceptedPoliciesUrls): + self.renderLoaded(policies: policies, alreadyAcceptedPoliciesUrls: alreadyAcceptedPoliciesUrls) case .accepted: self.renderAccepted() case .error(let error): @@ -148,10 +148,12 @@ final class ServiceTermsModalScreenViewController: UIViewController { self.activityPresenter.presentActivityIndicator(on: self.view, animated: true) } - private func renderLoaded(policies: [MXLoginPolicyData]) { + private func renderLoaded(policies: [MXLoginPolicyData], alreadyAcceptedPoliciesUrls: [String]) { self.activityPresenter.removeCurrentActivityIndicator(animated: true) self.policies = policies + self.updateCheckedPolicies(with: alreadyAcceptedPoliciesUrls) + self.refreshViews() } @@ -178,6 +180,15 @@ final class ServiceTermsModalScreenViewController: UIViewController { self.acceptButton.isEnabled = (self.policies.count == self.checkedPolicies.count) } + // Pre-check policies already accepted by the user + private func updateCheckedPolicies(with acceptedPoliciesUrls: [String]) { + for url in acceptedPoliciesUrls { + if let policyIndex = self.policies.firstIndex(where: { $0.url == url }) { + checkedPolicies.insert(policyIndex) + } + } + } + // MARK: - Actions diff --git a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModel.swift b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModel.swift index d2cfde3db..7d0545c96 100644 --- a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModel.swift +++ b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModel.swift @@ -27,11 +27,12 @@ final class ServiceTermsModalScreenViewModel: ServiceTermsModalScreenViewModelTy private let serviceTerms: MXServiceTerms // MARK: Public - - var policies: [MXLoginPolicyData]? + var serviceType: MXServiceType { return serviceTerms.serviceType } + var policies: [MXLoginPolicyData]? + var alreadyAcceptedPoliciesUrls: [String] = [] weak var viewDelegate: ServiceTermsModalScreenViewModelViewDelegate? weak var coordinatorDelegate: ServiceTermsModalScreenViewModelCoordinatorDelegate? @@ -66,14 +67,15 @@ final class ServiceTermsModalScreenViewModel: ServiceTermsModalScreenViewModelTy self.update(viewState: .loading) - self.serviceTerms.terms({ [weak self] terms in + self.serviceTerms.terms({ [weak self] (terms, alreadyAcceptedTermsUrls) in guard let self = self else { return } let policies = self.processTerms(terms: terms) self.policies = policies - self.update(viewState: .loaded(policies)) + self.alreadyAcceptedPoliciesUrls = alreadyAcceptedTermsUrls ?? [] + self.update(viewState: .loaded(policies: policies, alreadyAcceptedPoliciesUrls: self.alreadyAcceptedPoliciesUrls)) }, failure: { [weak self] error in guard let self = self else { diff --git a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModelType.swift b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModelType.swift index bf33c9090..aaa4d2dd4 100644 --- a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModelType.swift +++ b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewModelType.swift @@ -30,9 +30,10 @@ protocol ServiceTermsModalScreenViewModelCoordinatorDelegate: class { /// Protocol describing the view model used by `ServiceTermsModalScreenViewController` protocol ServiceTermsModalScreenViewModelType { - - var policies: [MXLoginPolicyData]? { get set } + var serviceType: MXServiceType { get } + var policies: [MXLoginPolicyData]? { get set } + var alreadyAcceptedPoliciesUrls: [String] { get set } var viewDelegate: ServiceTermsModalScreenViewModelViewDelegate? { get set } var coordinatorDelegate: ServiceTermsModalScreenViewModelCoordinatorDelegate? { get set } diff --git a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewState.swift b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewState.swift index ef3d7a3f6..93f9c942d 100644 --- a/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewState.swift +++ b/Riot/Modules/ServiceTerms/Modal/Modal/ServiceTermsModalScreenViewState.swift @@ -21,7 +21,7 @@ import Foundation /// ServiceTermsModalScreenViewController view state enum ServiceTermsModalScreenViewState { case loading - case loaded([MXLoginPolicyData]) + case loaded(policies: [MXLoginPolicyData], alreadyAcceptedPoliciesUrls: [String]) case accepted case error(Error) }