Device Manager: Rename Session (#6826)

* Publish the user sessions overview data.
* Add UserSessionName screen.
* Update logout action to match Figma more closely.
This commit is contained in:
Doug
2022-10-11 13:11:15 +01:00
committed by GitHub
parent 969c51db1e
commit efaf98fe6a
29 changed files with 765 additions and 123 deletions
@@ -14,7 +14,7 @@
// limitations under the License.
//
import Foundation
import Combine
import MatrixSDK
class UserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
@@ -23,17 +23,17 @@ class UserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
private let dataProvider: UserSessionsDataProviderProtocol
private(set) var overviewData: UserSessionsOverviewData
private(set) var overviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never>
private(set) var sessionInfos: [UserSessionInfo]
init(dataProvider: UserSessionsDataProviderProtocol) {
self.dataProvider = dataProvider
overviewData = UserSessionsOverviewData(currentSession: nil,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false)
overviewDataPublisher = .init(UserSessionsOverviewData(currentSession: nil,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false))
sessionInfos = []
setupInitialOverviewData()
}
@@ -47,9 +47,10 @@ class UserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
self.sessionInfos = self.sortedSessionInfos(from: devices)
Task { @MainActor in
let linkDeviceEnabled = try? await self.dataProvider.qrLoginAvailable()
self.overviewData = self.sessionsOverviewData(from: self.sessionInfos,
linkDeviceEnabled: linkDeviceEnabled ?? false)
completion(.success(self.overviewData))
let overviewData = self.sessionsOverviewData(from: self.sessionInfos,
linkDeviceEnabled: linkDeviceEnabled ?? false)
self.overviewDataPublisher.send(overviewData)
completion(.success(overviewData))
}
case .failure(let error):
completion(.failure(error))
@@ -58,11 +59,11 @@ class UserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
}
func sessionForIdentifier(_ sessionId: String) -> UserSessionInfo? {
if overviewData.currentSession?.id == sessionId {
return overviewData.currentSession
if currentSession?.id == sessionId {
return currentSession
}
return overviewData.otherSessions.first(where: { $0.id == sessionId })
return otherSessions.first(where: { $0.id == sessionId })
}
// MARK: - Private
@@ -72,11 +73,11 @@ class UserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
return
}
overviewData = UserSessionsOverviewData(currentSession: currentSessionInfo,
unverifiedSessions: currentSessionInfo.isVerified ? [] : [currentSessionInfo],
inactiveSessions: currentSessionInfo.isActive ? [] : [currentSessionInfo],
otherSessions: [],
linkDeviceEnabled: false)
overviewDataPublisher = .init(UserSessionsOverviewData(currentSession: currentSessionInfo,
unverifiedSessions: currentSessionInfo.isVerified ? [] : [currentSessionInfo],
inactiveSessions: currentSessionInfo.isActive ? [] : [currentSessionInfo],
otherSessions: [],
linkDeviceEnabled: false))
}
private func getCurrentSessionInfo() -> UserSessionInfo? {
@@ -14,7 +14,7 @@
// limitations under the License.
//
import Foundation
import Combine
class MockUserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
enum Mode {
@@ -27,17 +27,17 @@ class MockUserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
private let mode: Mode
var overviewData: UserSessionsOverviewData
var overviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never>
var sessionInfos = [UserSessionInfo]()
init(mode: Mode = .currentSessionUnverified) {
self.mode = mode
overviewData = UserSessionsOverviewData(currentSession: nil,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false)
overviewDataPublisher = .init(UserSessionsOverviewData(currentSession: nil,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false))
}
func updateOverviewData(completion: @escaping (Result<UserSessionsOverviewData, Error>) -> Void) {
@@ -46,43 +46,43 @@ class MockUserSessionsOverviewService: UserSessionsOverviewServiceProtocol {
switch mode {
case .noOtherSessions:
overviewData = UserSessionsOverviewData(currentSession: currentSession,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false)
overviewDataPublisher.send(UserSessionsOverviewData(currentSession: mockCurrentSession,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false))
case .onlyUnverifiedSessions:
overviewData = UserSessionsOverviewData(currentSession: currentSession,
unverifiedSessions: unverifiedSessions + [currentSession],
inactiveSessions: [],
otherSessions: unverifiedSessions,
linkDeviceEnabled: false)
overviewDataPublisher.send(UserSessionsOverviewData(currentSession: mockCurrentSession,
unverifiedSessions: unverifiedSessions + [mockCurrentSession],
inactiveSessions: [],
otherSessions: unverifiedSessions,
linkDeviceEnabled: false))
case .onlyInactiveSessions:
overviewData = UserSessionsOverviewData(currentSession: currentSession,
unverifiedSessions: [],
inactiveSessions: inactiveSessions,
otherSessions: inactiveSessions,
linkDeviceEnabled: false)
overviewDataPublisher.send(UserSessionsOverviewData(currentSession: mockCurrentSession,
unverifiedSessions: [],
inactiveSessions: inactiveSessions,
otherSessions: inactiveSessions,
linkDeviceEnabled: false))
default:
let otherSessions = unverifiedSessions + inactiveSessions + buildSessions(verified: true, active: true)
overviewData = UserSessionsOverviewData(currentSession: currentSession,
unverifiedSessions: unverifiedSessions,
inactiveSessions: inactiveSessions,
otherSessions: otherSessions,
linkDeviceEnabled: true)
overviewDataPublisher.send(UserSessionsOverviewData(currentSession: mockCurrentSession,
unverifiedSessions: unverifiedSessions,
inactiveSessions: inactiveSessions,
otherSessions: otherSessions,
linkDeviceEnabled: true))
}
completion(.success(overviewData))
completion(.success(overviewDataPublisher.value))
}
func sessionForIdentifier(_ sessionId: String) -> UserSessionInfo? {
overviewData.otherSessions.first { $0.id == sessionId }
otherSessions.first { $0.id == sessionId }
}
// MARK: - Private
// MARK: - Private
private var currentSession: UserSessionInfo {
private var mockCurrentSession: UserSessionInfo {
UserSessionInfo(id: "alice",
name: "iOS",
deviceType: .mobile,
@@ -14,7 +14,7 @@
// limitations under the License.
//
import Foundation
import Combine
struct UserSessionsOverviewData {
let currentSession: UserSessionInfo?
@@ -25,10 +25,23 @@ struct UserSessionsOverviewData {
}
protocol UserSessionsOverviewServiceProtocol {
var overviewData: UserSessionsOverviewData { get }
var overviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never> { get }
var sessionInfos: [UserSessionInfo] { get }
func updateOverviewData(completion: @escaping (Result<UserSessionsOverviewData, Error>) -> Void) -> Void
func sessionForIdentifier(_ sessionId: String) -> UserSessionInfo?
}
extension UserSessionsOverviewServiceProtocol {
/// The user's current session.
var currentSession: UserSessionInfo? { overviewDataPublisher.value.currentSession }
/// Any unverified sessions on the user's account.
var unverifiedSessions: [UserSessionInfo] { overviewDataPublisher.value.unverifiedSessions }
/// Any inactive sessions on the user's account (not seen for a while).
var inactiveSessions: [UserSessionInfo] { overviewDataPublisher.value.inactiveSessions }
/// Any sessions that are verified and have been seen recently.
var otherSessions: [UserSessionInfo] { overviewDataPublisher.value.otherSessions }
/// Whether it is possible to link a new device via a QR code.
var linkDeviceEnabled: Bool { overviewDataPublisher.value.linkDeviceEnabled }
}