mirror of
https://github.com/yattee/yattee.git
synced 2026-02-20 01:39:46 +00:00
127 lines
3.5 KiB
Swift
127 lines
3.5 KiB
Swift
//
|
|
// MigrationImportRow.swift
|
|
// Yattee
|
|
//
|
|
// Reusable row component for displaying a legacy import item.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct MigrationImportRow: View {
|
|
let item: LegacyImportItem
|
|
let onToggle: () -> Void
|
|
|
|
var body: some View {
|
|
Button(action: onToggle) {
|
|
HStack(spacing: 12) {
|
|
// Checkbox
|
|
Image(systemName: item.isSelected ? "checkmark.circle.fill" : "circle")
|
|
.font(.title2)
|
|
.foregroundStyle(item.isSelected ? Color.accentColor : .secondary)
|
|
|
|
// Instance type icon
|
|
instanceIcon
|
|
.font(.title2)
|
|
.foregroundStyle(.secondary)
|
|
.frame(width: 28)
|
|
|
|
// Instance details
|
|
VStack(alignment: .leading, spacing: 2) {
|
|
Text(item.displayName)
|
|
.font(.body)
|
|
.foregroundStyle(.primary)
|
|
|
|
Text(item.url.host ?? item.url.absoluteString)
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
.lineLimit(1)
|
|
}
|
|
|
|
Spacer()
|
|
|
|
// Reachability indicator
|
|
reachabilityIndicator
|
|
}
|
|
.padding(.vertical, 8)
|
|
.contentShape(Rectangle())
|
|
}
|
|
.buttonStyle(.plain)
|
|
}
|
|
|
|
// MARK: - Subviews
|
|
|
|
@ViewBuilder
|
|
private var instanceIcon: some View {
|
|
switch item.instanceType {
|
|
case .invidious:
|
|
Image(systemName: "server.rack")
|
|
case .piped:
|
|
Image(systemName: "cloud")
|
|
default:
|
|
Image(systemName: "globe")
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private var reachabilityIndicator: some View {
|
|
switch item.reachabilityStatus {
|
|
case .unknown:
|
|
EmptyView()
|
|
case .checking:
|
|
ProgressView()
|
|
.controlSize(.small)
|
|
case .reachable:
|
|
Image(systemName: "checkmark.circle.fill")
|
|
.foregroundStyle(.green)
|
|
case .unreachable:
|
|
Image(systemName: "exclamationmark.triangle.fill")
|
|
.foregroundStyle(.orange)
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Preview
|
|
|
|
#Preview {
|
|
List {
|
|
MigrationImportRow(
|
|
item: LegacyImportItem(
|
|
id: UUID(),
|
|
legacyInstanceID: "test",
|
|
instanceType: .invidious,
|
|
url: URL(string: "https://invidious.example.com")!,
|
|
name: "My Invidious",
|
|
isSelected: true,
|
|
reachabilityStatus: .reachable
|
|
),
|
|
onToggle: {}
|
|
)
|
|
|
|
MigrationImportRow(
|
|
item: LegacyImportItem(
|
|
id: UUID(),
|
|
legacyInstanceID: "test2",
|
|
instanceType: .piped,
|
|
url: URL(string: "https://piped.example.com")!,
|
|
name: nil,
|
|
isSelected: false,
|
|
reachabilityStatus: .unreachable
|
|
),
|
|
onToggle: {}
|
|
)
|
|
|
|
MigrationImportRow(
|
|
item: LegacyImportItem(
|
|
id: UUID(),
|
|
legacyInstanceID: "test3",
|
|
instanceType: .invidious,
|
|
url: URL(string: "https://another.invidious.com")!,
|
|
name: "Another Instance",
|
|
isSelected: true,
|
|
reachabilityStatus: .checking
|
|
),
|
|
onToggle: {}
|
|
)
|
|
}
|
|
}
|