91 lines
2.5 KiB
Swift
91 lines
2.5 KiB
Swift
|
import SwiftUI
|
||
|
import PushAPI
|
||
|
|
||
|
extension String {
|
||
|
|
||
|
var nonEmpty: String? {
|
||
|
isEmpty ? nil : self
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct DeviceList: View {
|
||
|
|
||
|
let pushToken: PushToken
|
||
|
|
||
|
let authToken: AuthenticationToken
|
||
|
|
||
|
let api: API
|
||
|
|
||
|
@Binding
|
||
|
var isPresented: Bool
|
||
|
|
||
|
@State
|
||
|
var devices: [DeviceRegistration]
|
||
|
|
||
|
var body: some View {
|
||
|
NavigationView {
|
||
|
VStack(spacing: 0) {
|
||
|
List(devices) { device in
|
||
|
HStack {
|
||
|
Text(device.name.nonEmpty ?? "Device")
|
||
|
.font(.headline)
|
||
|
Spacer()
|
||
|
VStack(alignment: .leading) {
|
||
|
Text(device.application)
|
||
|
.font(.footnote)
|
||
|
.fontWeight(.bold)
|
||
|
.padding(.bottom, 2)
|
||
|
Text(device.pushToken.prefix(5).hexEncoded + "...")
|
||
|
.font(.caption)
|
||
|
}
|
||
|
}
|
||
|
}.refreshable {
|
||
|
await updateList()
|
||
|
}
|
||
|
}.toolbar {
|
||
|
ToolbarItem(placement: .navigationBarTrailing) {
|
||
|
Button(action: dismiss) {
|
||
|
Text("Cancel")
|
||
|
}
|
||
|
}
|
||
|
}.navigationBarTitle("device-list-title")
|
||
|
}.onAppear() {
|
||
|
Task {
|
||
|
await updateList()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private func updateList() async {
|
||
|
let devices = await api.getDeviceList(pushToken: pushToken, authToken: authToken)
|
||
|
print("Updated device list: \(devices.count)")
|
||
|
DispatchQueue.main.async {
|
||
|
self.devices = devices
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private func dismiss() {
|
||
|
isPresented = false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct DeviceList_Previews: PreviewProvider {
|
||
|
static var previews: some View {
|
||
|
DeviceList(pushToken: Data(repeating: 42, count: 32),
|
||
|
authToken: Data(repeating: 42, count: 16),
|
||
|
api: .init(server: URL(string: "https://christophhagen.de/push")!),
|
||
|
isPresented: .constant(true),
|
||
|
devices: [DeviceRegistration(
|
||
|
pushToken: Data([1,2,3,4,5]),
|
||
|
application: "CC Messenger",
|
||
|
name: "Some")])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extension DeviceRegistration: Identifiable {
|
||
|
|
||
|
public var id: String {
|
||
|
pushToken.prefix(5).hexEncoded
|
||
|
}
|
||
|
}
|