import SwiftUI struct DevicesView: View { @Environment(AppEnvironment.self) private var env @State private var sessions: [LoginDeviceSession] = [] var body: some View { VStack(spacing: 12) { VStack(spacing: 0) { ForEach(Array(sessions.enumerated()), id: \.element.id) { index, s in HStack { VStack(alignment: .leading, spacing: 2) { Text(s.label ?? s.userAgent ?? s.id) .font(.system(size: 14, weight: .bold)) .lineLimit(2) Text("\(s.isCurrent ? env.preferences.t("当前 · ", en: "Current · ", pl: "Bieżące · ") : "")\(s.lastSeenAt)") .font(.system(size: 11)) .foregroundStyle(AppTheme.secondary) } Spacer() } .padding(16) .overlay(alignment: .top) { if index > 0 { Rectangle().fill(AppTheme.cardBorder).frame(height: 1) } } .swipeActions { if !s.isCurrent { Button(role: .destructive) { Task { try? await env.session.client.revokeLoginDeviceSession(id: s.id) sessions = (try? await env.session.client.listLoginDeviceSessions()) ?? [] } } label: { Text(env.preferences.t("注销", en: "Revoke", pl: "Unieważnij")) } } } } } .background(AppTheme.card) .clipShape(RoundedRectangle(cornerRadius: 12)) .overlay(RoundedRectangle(cornerRadius: 12).stroke(AppTheme.border, lineWidth: 1)) Button { Task { try? await env.session.client.revokeOtherLoginDeviceSessions() sessions = (try? await env.session.client.listLoginDeviceSessions()) ?? [] } } label: { Text(env.preferences.t("注销其他设备", en: "Sign out other devices", pl: "Wyloguj inne urządzenia")) .font(.system(size: 14, weight: .bold)) .frame(maxWidth: .infinity) .frame(height: 44) .foregroundStyle(AppTheme.title) .background(AppTheme.card) .clipShape(RoundedRectangle(cornerRadius: 12)) .overlay(RoundedRectangle(cornerRadius: 12).stroke(AppTheme.border, lineWidth: 1)) } .buttonStyle(.plain) } .task { sessions = (try? await env.session.client.listLoginDeviceSessions()) ?? [] } } }