Yattee v2 rewrite

This commit is contained in:
Arkadiusz Fal
2026-02-08 18:31:16 +01:00
parent 20d0cfc0c7
commit 05f921d605
1043 changed files with 163875 additions and 68430 deletions

View File

@@ -0,0 +1,126 @@
//
// 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: {}
)
}
}