mirror of
https://github.com/kean/Pulse.git
synced 2026-05-30 21:07:33 +00:00
84 lines
2.3 KiB
Swift
84 lines
2.3 KiB
Swift
// The MIT License (MIT)
|
|
//
|
|
// Copyright (c) 2020-2024 Alexander Grebenyuk (github.com/kean).
|
|
|
|
import SwiftUI
|
|
import Network
|
|
import Pulse
|
|
|
|
@available(iOS 15, visionOS 1.0, *)
|
|
struct RemoteLoggerSelectedDeviceView: View {
|
|
@ObservedObject var logger: RemoteLogger = .shared
|
|
|
|
let name: String
|
|
let server: RemoteLoggerServerViewModel?
|
|
|
|
var body: some View {
|
|
HStack {
|
|
VStack(alignment: .leading, spacing: 2) {
|
|
Text(name)
|
|
makeStatusView(for: logger.connectionState)
|
|
}
|
|
Spacer()
|
|
if server?.server.isProtected ?? false {
|
|
Image(systemName: "lock.fill")
|
|
.foregroundColor(.separator)
|
|
}
|
|
#if !os(watchOS) && !os(tvOS)
|
|
Menu(content: {
|
|
Button("Forget this Device", role: .destructive) {
|
|
logger.forgetServer(named: name)
|
|
}
|
|
}, label: {
|
|
Image(systemName: "ellipsis.circle")
|
|
})
|
|
#if os(macOS)
|
|
.menuStyle(.borderlessButton)
|
|
.fixedSize()
|
|
#endif
|
|
#else
|
|
Button(role: .destructive, action: {
|
|
logger.forgetServer(named: name)
|
|
}, label: {
|
|
Image(systemName: "trash")
|
|
.foregroundStyle(.red)
|
|
}).buttonStyle(.plain)
|
|
#endif
|
|
}
|
|
}
|
|
|
|
private func makeStatusView(for state: RemoteLogger.ConnectionState) -> some View {
|
|
HStack(spacing: 8) {
|
|
Circle()
|
|
.frame(width: circleSize, height: circleSize)
|
|
.foregroundColor(statusColor)
|
|
Text(statusTitle)
|
|
.lineLimit(1)
|
|
.font(.subheadline)
|
|
.foregroundColor(.secondary)
|
|
}
|
|
}
|
|
|
|
private var statusColor: Color {
|
|
switch logger.connectionState {
|
|
case .connected: return Color.green
|
|
case .connecting: return Color.yellow
|
|
case .disconnected: return Color.gray
|
|
}
|
|
}
|
|
|
|
private var statusTitle: String {
|
|
switch logger.connectionState {
|
|
case .connected: return "Connected"
|
|
case .connecting: return "Connecting..."
|
|
case .disconnected: return "Disconnected"
|
|
}
|
|
}
|
|
}
|
|
|
|
#if os(tvOS)
|
|
private let circleSize: CGFloat = 16
|
|
#else
|
|
private let circleSize: CGFloat = 8
|
|
#endif
|