mirror of
https://github.com/yattee/yattee.git
synced 2026-02-20 09:49:46 +00:00
188 lines
6.4 KiB
Swift
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)
|
|
}
|