diff --git a/ApplicationLibrary/Views/Connections/Connection.swift b/ApplicationLibrary/Views/Connections/Connection.swift index 1238adf..a12b438 100644 --- a/ApplicationLibrary/Views/Connections/Connection.swift +++ b/ApplicationLibrary/Views/Connections/Connection.swift @@ -1,6 +1,6 @@ import Foundation -public struct Connection: Codable { +public struct Connection: Codable, Hashable, Equatable { public let id: String public let inbound: String public let inboundType: String @@ -24,12 +24,22 @@ public struct Connection: Codable { public let outboundType: String public let chain: [String] - func hash(into hasher: inout Hasher) { + public func hash(into hasher: inout Hasher) { hasher.combine(id) hasher.combine(upload) hasher.combine(download) hasher.combine(uploadTotal) hasher.combine(downloadTotal) + hasher.combine(closedAt) + } + + public static func == (lhs: Connection, rhs: Connection) -> Bool { + lhs.id == rhs.id && + lhs.upload == rhs.upload && + lhs.download == rhs.download && + lhs.uploadTotal == rhs.uploadTotal && + lhs.downloadTotal == rhs.downloadTotal && + lhs.closedAt == rhs.closedAt } func performSearch(_ content: String) -> Bool { diff --git a/ApplicationLibrary/Views/Connections/ConnectionListView.swift b/ApplicationLibrary/Views/Connections/ConnectionListView.swift index 51b2be0..1ec8d74 100644 --- a/ApplicationLibrary/Views/Connections/ConnectionListView.swift +++ b/ApplicationLibrary/Views/Connections/ConnectionListView.swift @@ -16,8 +16,8 @@ public struct ConnectionListView: View { Text("Empty connections") } else { ScrollView { - VStack { - ForEach(viewModel.filteredConnections(), id: \.id) { it in + LazyVStack { + ForEach(viewModel.filteredConnections, id: \.id) { it in ConnectionView(it) } } diff --git a/ApplicationLibrary/Views/Connections/ConnectionListViewModel.swift b/ApplicationLibrary/Views/Connections/ConnectionListViewModel.swift index 9b96e26..b3d25ab 100644 --- a/ApplicationLibrary/Views/Connections/ConnectionListViewModel.swift +++ b/ApplicationLibrary/Views/Connections/ConnectionListViewModel.swift @@ -4,8 +4,19 @@ import SwiftUI @MainActor public class ConnectionListViewModel: BaseViewModel { - @Published public var connections: [Connection] = [] - @Published public var searchText = "" + @Published public var connections: [Connection] = [] { + didSet { + updateFilteredConnections() + } + } + + @Published public var searchText = "" { + didSet { + updateFilteredConnections() + } + } + + @Published public var filteredConnections: [Connection] = [] @Published public var connectionStateFilter: ConnectionStateFilter { didSet { saveStateFilterTask?.cancel() @@ -74,9 +85,11 @@ public class ConnectionListViewModel: BaseViewModel { } } - public func filteredConnections() -> [Connection] { - connections.filter { connection in - searchText == "" || connection.performSearch(searchText) + private func updateFilteredConnections() { + if searchText.isEmpty { + filteredConnections = connections + } else { + filteredConnections = connections.filter { $0.performSearch(searchText) } } } diff --git a/ApplicationLibrary/Views/Connections/ConnectionView.swift b/ApplicationLibrary/Views/Connections/ConnectionView.swift index 4dfcae9..58e1da4 100644 --- a/ApplicationLibrary/Views/Connections/ConnectionView.swift +++ b/ApplicationLibrary/Views/Connections/ConnectionView.swift @@ -8,10 +8,14 @@ public struct ConnectionView: View { self.connection = connection } - private func format(_ date: Date) -> String { + private static let timeFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "HH:mm:ss" - return formatter.string(from: date) + return formatter + }() + + private func format(_ date: Date) -> String { + Self.timeFormatter.string(from: date) } public func formatInterval(_ createdAt: Date, _ closedAt: Date) -> String {