Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Mactrix/Models/WindowState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ final class WindowState {

var inspectorContent: InspectorContent = .roomInfo

var requestedVerification = false

var searchQuery: String = ""
var searchTokens: [SearchToken] = []
var searchDirectResult: SearchDirectResult?
Expand Down
23 changes: 23 additions & 0 deletions Mactrix/Views/MultilineBannerLabelStyle.swift
Original file line number Diff line number Diff line change
@@ -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() }
}
39 changes: 31 additions & 8 deletions Mactrix/Views/Sidebar/SidebarSessionVerification.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import SwiftUI

struct SessionVerificationStatusView: View {
@Environment(AppState.self) var appState
@Environment(WindowState.self) var windowState
@Environment(\.colorScheme) var colorScheme

@ViewBuilder
Expand All @@ -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()
}
}
}
Expand Down Expand Up @@ -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)")
}
}
}