element-ios/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/UserSessionsOverviewViewModel.swift

106 lines
4 KiB
Swift
Raw Normal View History

//
// 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 SwiftUI
typealias UserSessionsOverviewViewModelType = StateStoreViewModel<UserSessionsOverviewViewState, UserSessionsOverviewViewAction>
class UserSessionsOverviewViewModel: UserSessionsOverviewViewModelType, UserSessionsOverviewViewModelProtocol {
private let userSessionsOverviewService: UserSessionsOverviewServiceProtocol
var completion: ((UserSessionsOverviewViewModelResult) -> Void)?
init(userSessionsOverviewService: UserSessionsOverviewServiceProtocol) {
self.userSessionsOverviewService = userSessionsOverviewService
super.init(initialViewState: .init())
updateViewState(with: userSessionsOverviewService.overviewData)
}
// MARK: - Public
override func process(viewAction: UserSessionsOverviewViewAction) {
switch viewAction {
2022-09-05 09:15:37 +00:00
case .viewAppeared:
loadData()
case .verifyCurrentSession:
completion?(.verifyCurrentSession)
case .viewCurrentSessionDetails:
guard let currentSessionInfo = userSessionsOverviewService.overviewData.currentSession else {
assertionFailure("Missing current session")
return
2022-09-23 14:16:18 +00:00
}
completion?(.showCurrentSessionOverview(session: currentSessionInfo))
case .viewAllUnverifiedSessions:
2022-09-30 13:34:41 +00:00
showSessions(filteredBy: .unverified)
case .viewAllInactiveSessions:
2022-09-30 13:34:41 +00:00
showSessions(filteredBy: .inactive)
case .viewAllOtherSessions:
2022-09-30 13:34:41 +00:00
showSessions(filteredBy: .all)
2022-09-05 09:15:37 +00:00
case .tapUserSession(let sessionId):
guard let session = userSessionsOverviewService.sessionForIdentifier(sessionId) else {
assertionFailure("Missing session info")
2022-09-23 14:16:18 +00:00
return
}
completion?(.showUserSessionOverview(session: session))
2022-09-05 09:15:37 +00:00
}
}
// MARK: - Private
private func updateViewState(with userSessionsViewData: UserSessionsOverviewData) {
state.unverifiedSessionsViewData = userSessionsViewData.unverifiedSessions.asViewData()
state.inactiveSessionsViewData = userSessionsViewData.inactiveSessions.asViewData()
state.otherSessionsViewData = userSessionsViewData.otherSessions.asViewData()
2022-09-05 09:15:37 +00:00
if let currentSessionInfo = userSessionsViewData.currentSession {
state.currentSessionViewData = UserSessionCardViewData(session: currentSessionInfo)
2022-09-05 09:15:37 +00:00
}
}
private func loadData() {
state.showLoadingIndicator = true
2022-09-05 09:15:37 +00:00
userSessionsOverviewService.updateOverviewData { [weak self] result in
2022-09-05 09:15:37 +00:00
guard let self = self else {
return
}
self.state.showLoadingIndicator = false
switch result {
case .success(let overViewData):
self.updateViewState(with: overViewData)
case .failure(let error):
2022-09-27 07:17:22 +00:00
// TODO:
2022-09-05 09:15:37 +00:00
break
}
}
}
2022-09-30 13:34:41 +00:00
private func showSessions(filteredBy filter: OtherUserSessionsFilter) {
completion?(.showOtherSessions(sessions: userSessionsOverviewService.overviewData.otherSessions,
filter: filter))
}
}
2022-09-30 13:34:41 +00:00
extension Collection where Element == UserSessionInfo {
func asViewData() -> [UserSessionListItemViewData] {
map { UserSessionListItemViewDataFactory().create(from: $0)}
}
}