Files
Kecalek_python/ios_client 0.8.5/Kecalek/Views/Auth/AuthorizeDeviceView.swift
2026-03-14 12:43:56 +01:00

83 lines
2.7 KiB
Swift

import SwiftUI
struct AuthorizeDeviceView: View {
var appState: AppState
@State private var code = ""
@State private var isAuthorizing = false
@State private var statusMessage: String?
@State private var isError = false
@State private var isDone = false
@Environment(\.dismiss) private var dismiss
var body: some View {
NavigationStack {
ScrollView {
VStack(spacing: 24) {
Image(systemName: "iphone.badge.checkmark")
.font(.system(size: 48))
.foregroundStyle(.blue)
Text("Authorize New Device")
.font(.title2.bold())
Text("Enter the 8-digit pairing code shown on the new device.")
.font(.subheadline)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
TextField("Pairing Code", text: $code)
.font(.system(size: 24, weight: .bold, design: .monospaced))
.multilineTextAlignment(.center)
.keyboardType(.numberPad)
.textFieldStyle(.roundedBorder)
Button("Authorize") {
Task { await authorize() }
}
.buttonStyle(.borderedProminent)
.disabled(code.count < 8 || isAuthorizing || isDone)
if isAuthorizing {
ProgressView("Preparing history & sending keys...")
}
if let status = statusMessage {
Text(status)
.font(.caption)
.foregroundStyle(isError ? .red : .green)
.multilineTextAlignment(.center)
}
if isDone {
Button("Done") { dismiss() }
.buttonStyle(.bordered)
}
}
.padding(32)
}
.navigationTitle("Authorize Device")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button("Cancel") { dismiss() }
}
}
}
}
private func authorize() async {
isAuthorizing = true
isError = false
statusMessage = nil
let (success, msg) = await appState.chatClient.authorizeDevice(code: code)
isAuthorizing = false
statusMessage = msg
isError = !success
if success {
isDone = true
}
}
}