Files
yattee/Yattee/Views/Components/SourceBadge.swift
Arkadiusz Fal 612dce6b9f Refactor views
2026-02-09 01:13:02 +01:00

106 lines
2.9 KiB
Swift

//
// SourceBadge.swift
// Yattee
//
// Adaptive source indicator shown only when disambiguation is needed.
//
import SwiftUI
/// Shows source badge only when user has multiple sources configured.
struct SourceBadge: View {
@Environment(\.appEnvironment) private var appEnvironment
let source: ContentSource
var body: some View {
if shouldShowBadge {
HStack(spacing: 2) {
Image(systemName: icon)
.font(.caption2)
if let label {
Text(label)
.font(.caption2)
.lineLimit(1)
}
}
.foregroundStyle(.secondary)
.padding(.horizontal, 4)
.padding(.vertical, 2)
.background(.quaternary)
.clipShape(Capsule())
}
}
// MARK: - Logic
private var shouldShowBadge: Bool {
guard let instances = appEnvironment?.instancesManager else {
return false
}
// Single network = no badges needed
let hasYouTube = instances.hasYouTubeInstances
let hasPeerTube = instances.hasPeerTubeInstances
let peerTubeCount = instances.peertubeInstances.count
// Only YouTube or only one PeerTube = no badge
if hasYouTube && !hasPeerTube { return false }
if !hasYouTube && peerTubeCount <= 1 { return false }
// Multiple PeerTube instances = show instance names
if peerTubeCount > 1, case .federated = source {
return true
}
// Mixed networks = show all
return hasYouTube && hasPeerTube
}
private var icon: String {
switch source {
case .global:
return "play.rectangle"
case .federated:
return "server.rack"
case .extracted:
return "link"
}
}
private var label: String? {
guard let instances = appEnvironment?.instancesManager else {
return nil
}
switch source {
case .global:
// Show "YouTube" only if mixing with PeerTube
return instances.hasPeerTubeInstances ? "YT" : nil
case .federated(_, let url):
// Show hostname if multiple PT instances
if instances.peertubeInstances.count > 1 {
return url.host
}
// If only one PT but mixing with YouTube, show "PT"
return instances.hasYouTubeInstances ? "PT" : nil
case .extracted:
// Show the extractor name (e.g., "Vimeo")
return source.shortName
}
}
}
// MARK: - Preview
#Preview {
VStack(spacing: 12) {
SourceBadge(source: .global(provider: ContentSource.youtubeProvider))
SourceBadge(source: .federated(provider: ContentSource.peertubeProvider, instance: URL(string: "https://peertube.social")!))
}
.padding()
.appEnvironment(.preview)
}