68 lines
2.3 KiB
Swift
68 lines
2.3 KiB
Swift
import SwiftUI
|
|
|
|
/// The list of revealed, mutually-consented connections.
|
|
///
|
|
/// This list is the *proof* of the product's thesis: every connection here
|
|
/// began as a real-world encounter. There is no way to add someone you've
|
|
/// never been near.
|
|
struct ConnectionsView: View {
|
|
@EnvironmentObject private var chatViewModel: ChatViewModel
|
|
// In production, sourced from GraphStore via a ConnectionsViewModel.
|
|
private let connections: [Connection] = []
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Group {
|
|
if connections.isEmpty {
|
|
emptyState
|
|
} else {
|
|
List(connections) { connection in
|
|
NavigationLink(value: connection) {
|
|
ConnectionRow(connection: connection)
|
|
}
|
|
}
|
|
.navigationDestination(for: Connection.self) { connection in
|
|
ChatView(connection: connection)
|
|
.environmentObject(chatViewModel)
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("Connections")
|
|
}
|
|
}
|
|
|
|
private var emptyState: some View {
|
|
VStack(spacing: 12) {
|
|
Image(systemName: "person.2")
|
|
.font(.system(size: 48))
|
|
.foregroundColor(.secondary)
|
|
Text("No connections yet")
|
|
.font(.headline)
|
|
Text("Connections only form when you're physically near someone —\nand you both choose to reveal. Go be present.")
|
|
.multilineTextAlignment(.center)
|
|
.foregroundColor(.secondary)
|
|
.padding(.horizontal)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct ConnectionRow: View {
|
|
let connection: Connection
|
|
|
|
var body: some View {
|
|
HStack {
|
|
Circle()
|
|
.fill(Color.green.opacity(0.2))
|
|
.frame(width: 40, height: 40)
|
|
.overlay(Text(String(connection.displayName.prefix(1))))
|
|
VStack(alignment: .leading) {
|
|
Text(connection.displayName)
|
|
.font(.headline)
|
|
Text("Met \(connection.createdAt, format: .dateTime.month().day())")
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
}
|
|
}
|
|
}
|
|
}
|