Device Manager: Verify session (#6832)

* Initial implementation
* Add verificationState to UserSessionInfo
* Listen for changes device changes in the service.
This commit is contained in:
Doug
2022-10-11 16:11:52 +01:00
committed by GitHub
parent efaf98fe6a
commit 3279f58ec4
33 changed files with 534 additions and 114 deletions
@@ -14,7 +14,8 @@
// limitations under the License.
//
import Foundation
import DesignKit
import SwiftUI
/// View data for UserSessionCardView
struct UserSessionCardViewData {
@@ -26,7 +27,8 @@ struct UserSessionCardViewData {
let sessionName: String
let isVerified: Bool
/// The verification state used to render the card with.
let verificationState: UserSessionInfo.VerificationState
let lastActivityDateString: String?
@@ -37,16 +39,64 @@ struct UserSessionCardViewData {
/// Indicate if the current user session is shown and to adpat the layout
let isCurrentSessionDisplayMode: Bool
/// The name of the shield image to show the verification status.
var verificationStatusImageName: String {
switch verificationState {
case .verified:
return Asset.Images.userSessionVerified.name
case .unverified:
return Asset.Images.userSessionUnverified.name
case .unknown:
return Asset.Images.userSessionVerificationUnknown.name
}
}
/// The text to show alongside the verification shield image.
var verificationStatusText: String {
switch verificationState {
case .verified:
return VectorL10n.userSessionVerified
case .unverified:
return VectorL10n.userSessionUnverified
case .unknown:
return VectorL10n.userSessionVerificationUnknown
}
}
/// A key path to the theme colour to use for the verification status text.
var verificationStatusColor: KeyPath<ColorSwiftUI, Color> {
switch verificationState {
case .verified:
return \.accent
case .unverified:
return \.alert
case .unknown:
return \.secondaryContent
}
}
/// Further information to be shown to explain the verification state to the user.
var verificationStatusAdditionalInfoText: String {
switch verificationState {
case .verified:
return VectorL10n.userSessionVerifiedAdditionalInfo
case .unverified:
return VectorL10n.userSessionUnverifiedAdditionalInfo
case .unknown:
return VectorL10n.userSessionUnverifiedAdditionalInfo
}
}
init(sessionId: String,
sessionDisplayName: String?,
deviceType: DeviceType,
isVerified: Bool,
verificationState: UserSessionInfo.VerificationState,
lastActivityTimestamp: TimeInterval?,
lastSeenIP: String?,
isCurrentSessionDisplayMode: Bool = false) {
self.sessionId = sessionId
sessionName = UserSessionNameFormatter.sessionName(deviceType: deviceType, sessionDisplayName: sessionDisplayName)
self.isVerified = isVerified
self.verificationState = verificationState
var lastActivityDateString: String?
@@ -56,7 +106,7 @@ struct UserSessionCardViewData {
self.lastActivityDateString = lastActivityDateString
lastSeenIPInfo = lastSeenIP
deviceAvatarViewData = DeviceAvatarViewData(deviceType: deviceType, isVerified: nil)
deviceAvatarViewData = DeviceAvatarViewData(deviceType: deviceType, verificationState: verificationState)
self.isCurrentSessionDisplayMode = isCurrentSessionDisplayMode
}
@@ -67,7 +117,7 @@ extension UserSessionCardViewData {
self.init(sessionId: sessionInfo.id,
sessionDisplayName: sessionInfo.name,
deviceType: sessionInfo.deviceType,
isVerified: sessionInfo.isVerified,
verificationState: sessionInfo.verificationState,
lastActivityTimestamp: sessionInfo.lastSeenTimestamp,
lastSeenIP: sessionInfo.lastSeenIP,
isCurrentSessionDisplayMode: sessionInfo.isCurrent)