Files
yattee/Yattee/Views/Settings/AddSourceView.swift
Arkadiusz Fal 8464464199 Fix locales
2026-02-09 00:13:46 +01:00

188 lines
6.4 KiB
Swift

//
// AddSourceView.swift
// Yattee
//
// Selection screen for adding new sources. Presents a list of source types
// with NavigationLinks to dedicated forms for each type.
//
import SwiftUI
struct AddSourceView: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.appEnvironment) private var appEnvironment
// Network discovery sheet
@State private var showingNetworkDiscovery = false
@State private var selectedShareType: DiscoveredShare.ShareType?
// Navigation destinations from network discovery
@State private var navigateToWebDAV = false
@State private var navigateToSMB = false
@State private var discoveredWebDAVURL: URL?
@State private var discoveredSMBServer: String?
@State private var discoveredName: String?
@State private var discoveredAllowInvalidCerts = false
var body: some View {
NavigationStack {
#if os(tvOS)
VStack(spacing: 0) {
HStack {
Button(String(localized: "common.cancel")) {
dismiss()
}
.buttonStyle(TVToolbarButtonStyle())
Spacer()
Text(String(localized: "sources.newSource"))
.font(.title2)
.fontWeight(.semibold)
Spacer()
Text(String(localized: "common.cancel"))
.opacity(0)
}
.padding(.horizontal, 48)
.padding(.vertical, 24)
listContent
}
.navigationDestination(isPresented: $navigateToWebDAV) {
AddWebDAVView(
prefillURL: discoveredWebDAVURL,
prefillName: discoveredName,
prefillAllowInvalidCertificates: discoveredAllowInvalidCerts,
dismissSheet: dismiss
)
}
.navigationDestination(isPresented: $navigateToSMB) {
AddSMBView(
prefillServer: discoveredSMBServer,
prefillName: discoveredName,
dismissSheet: dismiss
)
}
#else
listContent
.navigationTitle(String(localized: "sources.newSource"))
#if os(iOS)
.navigationBarTitleDisplayMode(.inline)
#endif
.toolbar {
ToolbarItem(placement: .confirmationAction) {
Button(role: .cancel) {
dismiss()
} label: {
Label(String(localized: "common.close"), systemImage: "xmark")
.labelStyle(.iconOnly)
}
}
}
.navigationDestination(isPresented: $navigateToWebDAV) {
AddWebDAVView(
prefillURL: discoveredWebDAVURL,
prefillName: discoveredName,
prefillAllowInvalidCertificates: discoveredAllowInvalidCerts,
dismissSheet: dismiss
)
}
.navigationDestination(isPresented: $navigateToSMB) {
AddSMBView(
prefillServer: discoveredSMBServer,
prefillName: discoveredName,
dismissSheet: dismiss
)
}
#endif
}
.sheet(isPresented: $showingNetworkDiscovery) {
NetworkShareDiscoverySheet(filterType: selectedShareType) { share in
handleSelectedShare(share)
}
}
}
private var listContent: some View {
List {
Section {
#if !os(tvOS)
NavigationLink {
AddLocalFolderView(dismissSheet: dismiss)
} label: {
Label(String(localized: "sources.addLocalFolder"), systemImage: "folder")
}
#endif
NavigationLink {
AddWebDAVView(dismissSheet: dismiss)
} label: {
Label(String(localized: "sources.addWebDAV"), systemImage: "externaldrive.connected.to.line.below")
}
NavigationLink {
AddSMBView(dismissSheet: dismiss)
} label: {
Label(String(localized: "sources.addSMB"), systemImage: "server.rack")
}
NavigationLink {
AddRemoteServerView(dismissSheet: dismiss)
} label: {
Label(String(localized: "sources.addRemoteServer"), systemImage: "globe")
}
NavigationLink {
if let appEnvironment {
PeerTubeInstancesExploreView()
.appEnvironment(appEnvironment)
}
} label: {
Label {
Text(String(localized: "sources.browsePeerTube"))
} icon: {
Image("peertube")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 24, height: 24)
}
}
}
Section {
Button {
selectedShareType = nil
showingNetworkDiscovery = true
} label: {
Label(String(localized: "discovery.scanNetwork"), systemImage: "wifi")
}
#if os(tvOS)
.buttonStyle(TVSettingsButtonStyle())
#endif
} footer: {
Text(String(localized: "sources.footer.discovery"))
}
}
}
private func handleSelectedShare(_ share: DiscoveredShare) {
discoveredName = share.name
switch share.type {
case .webdav, .webdavs:
discoveredWebDAVURL = share.url
discoveredAllowInvalidCerts = share.type == .webdavs
navigateToWebDAV = true
case .smb:
discoveredSMBServer = share.host
navigateToSMB = true
}
}
}
// MARK: - Preview
#Preview {
AddSourceView()
.appEnvironment(.preview)
}