diff --git a/Mactrix/Models/WindowState.swift b/Mactrix/Models/WindowState.swift index c6760d4..0212767 100644 --- a/Mactrix/Models/WindowState.swift +++ b/Mactrix/Models/WindowState.swift @@ -32,6 +32,8 @@ final class WindowState { var inspectorContent: InspectorContent = .roomInfo + var requestedVerification = false + var searchQuery: String = "" var searchTokens: [SearchToken] = [] var searchDirectResult: SearchDirectResult? diff --git a/Mactrix/Views/MultilineBannerLabelStyle.swift b/Mactrix/Views/MultilineBannerLabelStyle.swift new file mode 100644 index 0000000..9ee6cb2 --- /dev/null +++ b/Mactrix/Views/MultilineBannerLabelStyle.swift @@ -0,0 +1,23 @@ +// +// MultilineBanner.swift +// Mactrix +// +// Created by Marquis Kurt on 15-02-2026. +// + +import SwiftUI + +struct MultilineBannerLabelStyle: LabelStyle { + func makeBody(configuration: Configuration) -> some View { + HStack(alignment: .firstTextBaseline) { + configuration.icon + VStack(alignment: .leading) { + configuration.title + } + } + } +} + +extension LabelStyle where Self == MultilineBannerLabelStyle { + static var multiline: MultilineBannerLabelStyle { MultilineBannerLabelStyle() } +} diff --git a/Mactrix/Views/Sidebar/SidebarSessionVerification.swift b/Mactrix/Views/Sidebar/SidebarSessionVerification.swift index 8308307..f0f59a3 100644 --- a/Mactrix/Views/Sidebar/SidebarSessionVerification.swift +++ b/Mactrix/Views/Sidebar/SidebarSessionVerification.swift @@ -4,6 +4,7 @@ import SwiftUI struct SessionVerificationStatusView: View { @Environment(AppState.self) var appState + @Environment(WindowState.self) var windowState @Environment(\.colorScheme) var colorScheme @ViewBuilder @@ -21,14 +22,27 @@ struct SessionVerificationStatusView: View { EmptyView() case .unverified: VStack { - Label("Unverified session", systemImage: "exclamationmark.shield") - .frame(maxWidth: .infinity) - Button("Verify session") { - Task { - do { - try await appState.matrixClient?.requestDeviceVerification() - } catch { - Logger.viewCycle.error("request device verification failed: \(error)") + Label { + Text("This session is unverified.") + .bold() + + // NOTE(alicerunsonfedora): Setting a hard line limit because SwiftUI will otherwise truncate the + // text, even when there's enough room to do so. + Text("Verify the session for better security and to decrypt all messages.") + .lineLimit(9) + } icon: { + Image(systemName: "exclamationmark.shield") + .bold() + } + .labelStyle(.multiline) + .frame(maxWidth: .infinity) + HStack { + if windowState.requestedVerification { + ProgressView("Requesting verification from your trusted devices...") + } + Button(windowState.requestedVerification ? "Try again" : "Verify session...") { + Task { + await startVerificationRequest() } } } @@ -78,4 +92,13 @@ struct SessionVerificationStatusView: View { selfVerificationView } } + + private func startVerificationRequest() async { + do { + try await appState.matrixClient?.requestDeviceVerification() + windowState.requestedVerification = true + } catch { + Logger.viewCycle.error("request device verification failed: \(error)") + } + } }