import SwiftUI private let df: DateFormatter = { let df = DateFormatter() df.dateStyle = .short df.timeStyle = .short return df }() struct HistoryListItem: View { let entry: HistoryItem var entryTime: String { df.string(from: entry.outgoingDate) } var roundTripText: String { guard let time = entry.roundTripTime else { return "" } return "⇆ \(Int(time * 1000)) ms" } var counterText: String { let sentCounter = entry.outgoingMessage.content.id let startText = "🔗 \(sentCounter)" guard let rCounter = entry.incomingMessage?.content.id else { return startText } let diff = Int(rCounter) - Int(sentCounter) guard diff != 1 && diff != 0 else { return startText } return startText + " (\(diff))" } var timeOffsetText: String { guard let offset = entry.clockOffset, offset != 0 else { return "" } return "🕓 \(offset) s" } var body: some View { VStack { HStack { Text(entry.response?.description ?? "") .font(.headline) Spacer() Text(entryTime) }.padding(.bottom, 1) HStack { Text(roundTripText) .font(.subheadline) .foregroundColor(.secondary) Text(counterText) .font(.subheadline) .foregroundColor(.secondary) Text(timeOffsetText) .font(.subheadline) .foregroundColor(.secondary) Spacer() } }.padding() } } struct HistoryListItem_Previews: PreviewProvider { static var previews: some View { HistoryListItem(entry: .mock) } } private extension HistoryItem { static var mock: HistoryItem { let mac = Data(repeating: 42, count: 32) let content = Message.Content(time: Date.now.timestamp, id: 123) let content2 = Message.Content(time: (Date.now + 1).timestamp, id: 124) return .init( sent: Message(mac: mac, content: content), date: .now) .didReceive( response: .openSesame, date: .now + 2, message: Message(mac: mac, content: content2)) } }