import SwiftUI import PushAPI import Push extension String { var nonEmpty: String? { isEmpty ? nil : self } } struct DeviceList: View { let pushToken: PushToken let authToken: AuthenticationToken let api: PushClient @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 ?? -1)") 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")!, application: "some"), 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 } }