Files
letro-ios/ElementX/Sources/Screens/Onboarding/SessionVerificationScreen/View/SessionVerificationRequestDetailsView.swift
Mauro 6160c44d67 Update copyright holding and dates (#4640)
* Update copyright holding and dates

* compound IDE Macros updated

* update copyright

* update copyrights done

* update templates and README
2025-10-21 14:34:56 +02:00

135 lines
5.8 KiB
Swift

//
// Copyright 2025 Element Creations Ltd.
// Copyright 2024-2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import Compound
import MatrixRustSDK
import SwiftUI
struct SessionVerificationRequestDetailsView: View {
@ScaledMetric private var iconSize = 30.0
private let outerShape = RoundedRectangle(cornerRadius: 8)
let details: SessionVerificationRequestDetails
let isUserVerification: Bool
let mediaProvider: MediaProviderProtocol?
var body: some View {
if isUserVerification {
userRequestDetails
} else {
deviceRequestDetails
}
}
private var userRequestDetails: some View {
HStack(spacing: 12) {
LoadableAvatarImage(url: details.senderProfile.avatarURL,
name: details.senderProfile.displayName,
contentID: details.senderProfile.userID,
avatarSize: .user(on: .sessionVerification),
mediaProvider: mediaProvider)
.accessibilityHidden(true)
VStack(alignment: .leading, spacing: 0) {
Text(details.senderProfile.displayName ?? details.senderProfile.userID)
.font(.compound.bodySM)
.foregroundColor(.compound.textSecondary)
if details.senderProfile.displayName != nil {
Text(details.senderProfile.userID)
.font(.compound.bodyMD)
.foregroundColor(.compound.textPrimary)
}
}
}
.accessibilityElement(children: .combine)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(12)
.background(.compound.bgSubtleSecondary)
.clipShape(outerShape)
}
private var deviceRequestDetails: some View {
VStack(spacing: 24) {
VStack(alignment: .leading, spacing: 12) {
HStack(spacing: 16) {
CompoundIcon(\.devices)
.frame(width: iconSize, height: iconSize)
.foregroundColor(.compound.iconSecondary)
.padding(6)
.background(.compound.bgSubtleSecondary)
.clipShape(RoundedRectangle(cornerRadius: 8))
let displayName = isUserVerification ? details.senderProfile.displayName : details.deviceDisplayName
Text(displayName ?? details.senderProfile.userID)
.font(.compound.bodyMDSemibold)
.foregroundColor(.compound.textPrimary)
.frame(maxWidth: .infinity, alignment: .leading)
}
HStack(spacing: 40) {
VStack(alignment: .leading, spacing: 0) {
Text(L10n.screenSessionVerificationRequestDetailsTimestamp)
.font(.compound.bodySM)
.foregroundColor(.compound.textSecondary)
Text(details.firstSeenDate.formattedMinimal())
.font(.compound.bodyMD)
.foregroundColor(.compound.textPrimary)
}
VStack(alignment: .leading, spacing: 0) {
Text(L10n.commonDeviceId)
.font(.compound.bodySM)
.foregroundColor(.compound.textSecondary)
Text(details.deviceID)
.font(.compound.bodyMD)
.foregroundColor(.compound.textPrimary)
}
}
}
.padding(24)
.clipShape(outerShape)
.overlay {
outerShape
.inset(by: 0.25)
.stroke(.compound.borderDisabled)
}
.font(.compound.bodyMDSemibold)
Text(L10n.screenSessionVerificationRequestFooter)
.font(.compound.bodyMDSemibold)
.foregroundColor(.compound.textPrimary)
}
}
}
struct SessionVerificationRequestDetailsView_Previews: PreviewProvider, TestablePreview {
static let details = SessionVerificationRequestDetails(senderProfile: UserProfileProxy(userID: "@bob:matrix.org",
displayName: "Billy bob",
avatarURL: .mockMXCUserAvatar),
flowID: "123",
deviceID: "CODEMISTAKE",
deviceDisplayName: "Bob's Element X iOS",
firstSeenDate: .init(timeIntervalSince1970: 0))
static var previews: some View {
SessionVerificationRequestDetailsView(details: details,
isUserVerification: true,
mediaProvider: MediaProviderMock(configuration: .init()))
.padding()
.previewDisplayName("User")
SessionVerificationRequestDetailsView(details: details,
isUserVerification: false,
mediaProvider: MediaProviderMock(configuration: .init()))
.padding()
.previewDisplayName("Device")
}
}