mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-17 23:18:27 +02:00
* commit '56d9e1f6a55a93dc71149ae429eaa615a98de0d5': (79 commits) finish version++ version++ Translated using Weblate (Hungarian) Translated using Weblate (Italian) Translated using Weblate (Ukrainian) Translated using Weblate (Hungarian) Translated using Weblate (Slovak) Translated using Weblate (Swedish) Translated using Weblate (Indonesian) Translated using Weblate (Albanian) Translated using Weblate (Estonian) Translated using Weblate (Estonian) updated the submodule updated SDK Update the SDK. (#7819) Prepare for new sprint finish version++ version++ fix Changelog. ... # Conflicts: # Config/AppVersion.xcconfig # Podfile # Podfile.lock # Riot.xcworkspace/xcshareddata/swiftpm/Package.resolved # Riot/Managers/Settings/RiotSettings.swift # Riot/Modules/Analytics/Analytics.swift # Riot/Modules/Analytics/DecryptionFailure.swift # Riot/Modules/Analytics/PHGPostHogConfiguration.swift # Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewAction.swift # Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewModel.swift # Riot/Modules/Room/Views/Title/Preview/PreviewRoomTitleView.m # Riot/Modules/Settings/SettingsViewController.m # Riot/Utils/EventFormatter.m # Riot/Utils/Tools.m # RiotNSE/target.yml # fastlane/Fastfile # project.yml
197 lines
6.8 KiB
Swift
197 lines
6.8 KiB
Swift
// File created from ScreenTemplate
|
|
// $ createScreen.sh Room2/RoomInfo RoomInfoList
|
|
/*
|
|
Copyright 2020 New Vector Ltd
|
|
Copyright (c) 2021 BWI GmbH
|
|
|
|
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 Foundation
|
|
|
|
final class RoomInfoListViewModel: NSObject, RoomInfoListViewModelType {
|
|
|
|
// MARK: - Properties
|
|
|
|
// MARK: Private
|
|
|
|
private let session: MXSession
|
|
private let room: MXRoom
|
|
|
|
// MARK: Public
|
|
|
|
weak var viewDelegate: RoomInfoListViewModelViewDelegate?
|
|
weak var coordinatorDelegate: RoomInfoListViewModelCoordinatorDelegate?
|
|
|
|
private var viewData: RoomInfoListViewData {
|
|
var encryptionImage: UIImage?
|
|
// bwi: #5236 remove encryption status shield
|
|
if BWIBuildSettings.shared.showEncryptionStatusBadgeOnAvatar {
|
|
encryptionImage = EncryptionTrustLevelBadgeImageHelper.roomBadgeImage(for: room.summary.roomEncryptionTrustLevel())
|
|
} else {
|
|
encryptionImage = nil
|
|
}
|
|
let directUserPresence = session.user(withUserId: room.directUserId)?.presence ?? .unknown
|
|
|
|
// bwi: 5216 - federation
|
|
var isFederated = true
|
|
|
|
let group = DispatchGroup()
|
|
group.enter()
|
|
self.isFederationEnabled(room: self.room) { federationStatus in
|
|
isFederated = federationStatus
|
|
group.leave()
|
|
}
|
|
group.wait()
|
|
|
|
let basicInfoViewData = RoomInfoBasicViewData(avatarUrl: room.summary.avatar,
|
|
mediaManager: session.mediaManager,
|
|
roomId: room.roomId,
|
|
roomDisplayName: room.summary.displayName,
|
|
mainRoomAlias: room.summary.aliases?.first,
|
|
roomTopic: room.summary.topic,
|
|
encryptionImage: encryptionImage,
|
|
isEncrypted: room.summary.isEncrypted,
|
|
isDirect: room.isDirect,
|
|
directUserId: room.directUserId,
|
|
directUserPresence: directUserPresence,
|
|
isFederated: isFederated)
|
|
|
|
return RoomInfoListViewData(numberOfMembers: Int(room.summary.membersCount.joined),
|
|
isEncrypted: room.summary.isEncrypted,
|
|
isDirect: room.isDirect,
|
|
basicInfoViewData: basicInfoViewData)
|
|
}
|
|
|
|
// bwi: 5216 - federation
|
|
private func isFederationEnabled(room: MXRoom, completion: ((_ isFederated: Bool) -> Void)?) {
|
|
guard BWIBuildSettings.shared.isFederationEnabled else {
|
|
completion?(false)
|
|
return
|
|
}
|
|
|
|
if room.isPersonalNotesRoom() {
|
|
completion?(false)
|
|
} else {
|
|
if room.isDirect {
|
|
completion?(room.isDMFederated())
|
|
} else {
|
|
room.getFederationStatus(completion: completion)
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Setup
|
|
|
|
init(session: MXSession, room: MXRoom) {
|
|
self.session = session
|
|
self.room = room
|
|
super.init()
|
|
startObservingSummaryChanges()
|
|
}
|
|
|
|
deinit {
|
|
stopObservingSummaryChanges()
|
|
}
|
|
|
|
// MARK: - Public
|
|
|
|
func process(viewAction: RoomInfoListViewAction) {
|
|
switch viewAction {
|
|
case .loadData:
|
|
self.loadData()
|
|
case .navigate(let target):
|
|
self.navigate(to: target)
|
|
case .leave:
|
|
self.leave()
|
|
case .cancel:
|
|
self.coordinatorDelegate?.roomInfoListViewModelDidCancel(self)
|
|
case .permalink:
|
|
self.createPermalink()
|
|
case .report:
|
|
self.coordinatorDelegate?.roomInfoListViewModelDidRequestReportRoom(self)
|
|
}
|
|
}
|
|
|
|
func canLeaveRoom() -> Bool {
|
|
return LeaveRoomHelper.canLeaveRoom(self.session, self.room)
|
|
}
|
|
|
|
func isDirectRoom() -> Bool {
|
|
return room.isDirect
|
|
}
|
|
|
|
func isPersonalNotesRoom() -> Bool {
|
|
return room.isPersonalNotesRoom()
|
|
}
|
|
|
|
func isInviteOnlyRoom() -> Bool {
|
|
return room.summary.joinRule == MXRoomJoinRule.invite.identifier
|
|
}
|
|
|
|
func isPermalinkableRoom() -> Bool {
|
|
return !(isDirectRoom() || isPersonalNotesRoom() || isInviteOnlyRoom())
|
|
}
|
|
|
|
|
|
// MARK: - Private
|
|
|
|
|
|
private func startObservingSummaryChanges() {
|
|
NotificationCenter.default.addObserver(self, selector: #selector(roomSummaryUpdated(_:)), name: .mxRoomSummaryDidChange, object: room.summary)
|
|
}
|
|
|
|
private func stopObservingSummaryChanges() {
|
|
NotificationCenter.default.removeObserver(self, name: .mxRoomSummaryDidChange, object: nil)
|
|
}
|
|
|
|
@objc private func roomSummaryUpdated(_ notification: Notification) {
|
|
// force update view
|
|
self.update(viewState: .loaded(viewData: viewData))
|
|
}
|
|
|
|
private func loadData() {
|
|
self.update(viewState: .loaded(viewData: viewData))
|
|
}
|
|
|
|
private func navigate(to target: RoomInfoListTarget) {
|
|
self.coordinatorDelegate?.roomInfoListViewModel(self, wantsToNavigateTo: target)
|
|
}
|
|
|
|
private func leave() {
|
|
self.stopObservingSummaryChanges()
|
|
self.update(viewState: .loading)
|
|
self.room.leave { (response) in
|
|
switch response {
|
|
case .success:
|
|
self.coordinatorDelegate?.roomInfoListViewModelDidLeaveRoom(self)
|
|
case .failure(let error):
|
|
self.startObservingSummaryChanges()
|
|
self.update(viewState: .error(error))
|
|
}
|
|
}
|
|
}
|
|
|
|
private func update(viewState: RoomInfoListViewState) {
|
|
self.viewDelegate?.roomInfoListViewModel(self, didUpdateViewState: viewState)
|
|
}
|
|
|
|
private func createPermalink() {
|
|
if let permalink = MXTools.permalink(toRoom: self.room.roomId), let url = URL(string: permalink) {
|
|
MXKPasteboardManager.shared.pasteboard.url = url
|
|
self.viewDelegate?.roomInfoListViewModel(self, didUpdateViewState: .permalinkCreated)
|
|
}
|
|
|
|
}
|
|
}
|