83 lines
2.7 KiB
Swift
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
|
|
}
|
|
}
|
|
}
|