// // NavigationViewModel.swift // Ferrite // // Created by Brian Dashore on 7/24/22. // import SwiftUI enum ViewTab { case search case sources case settings } @MainActor class NavigationViewModel: ObservableObject { var toastModel: ToastViewModel? // Used between SearchResultsView and MagnetChoiceView enum ChoiceSheetType: Identifiable { var id: Int { hashValue } case magnet case batch case activity } @Published var isEditingSearch: Bool = false @Published var isSearching: Bool = false @Published var hideNavigationBar = false @Published var currentChoiceSheet: ChoiceSheetType? @Published var activityItems: [Any] = [] // Used to show the activity sheet in the share menu @Published var showLocalActivitySheet = false @Published var selectedTab: ViewTab = .search @Published var showSearchProgress: Bool = false // Used between SourceListView and SourceSettingsView @Published var showSourceSettings: Bool = false @Published var selectedSource: Source? @Published var showSourceListEditor: Bool = false @Published var selectedSourceList: SourceList? @AppStorage("Actions.DefaultDebrid") var defaultDebridAction: DefaultDebridActionType = .none @AppStorage("Actions.DefaultMagnet") var defaultMagnetAction: DefaultMagnetActionType = .none public func runDebridAction(action: DefaultDebridActionType?, urlString: String) { let selectedAction = action ?? defaultDebridAction switch selectedAction { case .none: currentChoiceSheet = .magnet case .outplayer: if let downloadUrl = URL(string: "outplayer://\(urlString)") { UIApplication.shared.open(downloadUrl) } else { toastModel?.updateToastDescription("Could not create an Outplayer URL") } case .vlc: if let downloadUrl = URL(string: "vlc://\(urlString)") { UIApplication.shared.open(downloadUrl) } else { toastModel?.updateToastDescription("Could not create a VLC URL") } case .infuse: if let downloadUrl = URL(string: "infuse://x-callback-url/play?url=\(urlString)") { UIApplication.shared.open(downloadUrl) } else { toastModel?.updateToastDescription("Could not create a Infuse URL") } case .shareDownload: if let downloadUrl = URL(string: urlString), currentChoiceSheet == nil { activityItems = [downloadUrl] currentChoiceSheet = .activity } else { toastModel?.updateToastDescription("Could not create object for sharing") } } } public func runMagnetAction(action: DefaultMagnetActionType?, searchResult: SearchResult) { let selectedAction = action ?? defaultMagnetAction guard let magnetLink = searchResult.magnetLink else { toastModel?.toastDescription = "Could not run your action because the magnet link is invalid." print("Magnet action error: The magnet link is invalid.") return } switch selectedAction { case .none: currentChoiceSheet = .magnet case .webtor: if let url = URL(string: "https://webtor.io/#/show?magnet=\(magnetLink)") { UIApplication.shared.open(url) } else { toastModel?.updateToastDescription("Could not create a WebTor URL") } case .shareMagnet: if let magnetUrl = URL(string: magnetLink), currentChoiceSheet == nil { activityItems = [magnetUrl] currentChoiceSheet = .activity } else { toastModel?.updateToastDescription("Could not create object for sharing") } } } }