omnivore/apple/OmnivoreKit/Sources/App/Views/LibraryTabView.swift

155 lines
4.4 KiB
Swift
Raw Normal View History

2023-06-29 21:37:13 +00:00
//
// File.swift
//
2023-06-29 21:37:13 +00:00
//
// Created by Jackson Harper on 6/29/23.
//
import Foundation
2023-07-01 21:42:57 +00:00
import Models
import PopupView
2023-07-12 01:55:47 +00:00
import Services
import SwiftUI
import Transmission
2023-11-30 09:58:13 +00:00
import Utils
import Views
2023-10-30 07:34:25 +00:00
@MainActor
struct LibraryTabView: View {
2023-07-12 01:55:47 +00:00
@EnvironmentObject var dataService: DataService
@EnvironmentObject var audioController: AudioController
2023-12-08 10:31:09 +00:00
@AppStorage("LibraryTabView::hideFollowingTab") var hideFollowingTab = false
2023-11-30 09:58:13 +00:00
@AppStorage(UserDefaultKey.lastSelectedTabItem.rawValue) var selectedTab = "inbox"
@State var showExpandedAudioPlayer = false
private let syncManager = LibrarySyncManager()
@MainActor
public init() {
UITabBar.appearance().isHidden = true
}
2023-12-18 09:35:08 +00:00
@StateObject private var inboxViewModel = HomeFeedViewModel(
filterKey: "lastSelectedFilter-inbox",
2023-11-30 09:58:13 +00:00
fetcher: LibraryItemFetcher(),
folderConfigs: [
"inbox": LibraryListConfig(
hasFeatureCards: true,
hasReadNowSection: true,
leadingSwipeActions: [.pin],
trailingSwipeActions: [.archive, .delete],
cardStyle: .library
)
]
2023-07-05 16:36:55 +00:00
)
2023-12-18 03:31:59 +00:00
@StateObject private var followingViewModel = HomeFeedViewModel(
filterKey: "lastSelectedFilter-following",
2023-11-30 09:58:13 +00:00
fetcher: LibraryItemFetcher(),
folderConfigs: [
"following": LibraryListConfig(
hasFeatureCards: false,
hasReadNowSection: false,
leadingSwipeActions: [.moveToInbox],
trailingSwipeActions: [.delete],
cardStyle: .library
)
]
2023-07-05 16:36:55 +00:00
)
var currentViewModel: HomeFeedViewModel? {
switch selectedTab {
case "inbox":
return inboxViewModel
case "following":
return followingViewModel
default:
return nil
}
}
2023-12-15 07:22:47 +00:00
var body: some View {
VStack(spacing: 0) {
TabView(selection: $selectedTab) {
2023-12-08 10:31:09 +00:00
if !hideFollowingTab {
NavigationView {
HomeFeedContainerView(viewModel: followingViewModel)
.navigationBarTitleDisplayMode(.inline)
.navigationViewStyle(.stack)
}.tag("following")
}
NavigationView {
2023-12-18 09:35:08 +00:00
HomeFeedContainerView(viewModel: inboxViewModel)
.navigationBarTitleDisplayMode(.inline)
2023-11-30 11:07:30 +00:00
.navigationViewStyle(.stack)
2023-11-30 09:58:13 +00:00
}.tag("inbox")
NavigationView {
ProfileView()
.navigationViewStyle(.stack)
2023-11-30 09:58:13 +00:00
}.tag("profile")
}
if let audioProperties = audioController.itemAudioProperties {
MiniPlayerViewer(itemAudioProperties: audioProperties)
.onTapGesture {
showExpandedAudioPlayer = true
}
.padding(0)
Color(hex: "#3D3D3D")
.frame(height: 1)
.frame(maxWidth: .infinity)
}
2023-12-08 10:31:09 +00:00
CustomTabBar(selectedTab: $selectedTab, hideFollowingTab: hideFollowingTab)
.padding(0)
}
.fullScreenCover(isPresented: $showExpandedAudioPlayer) {
ExpandedAudioPlayer(
delete: {
showExpandedAudioPlayer = false
audioController.stop()
currentViewModel?.removeLibraryItem(dataService: dataService, objectID: $0)
},
archive: {
showExpandedAudioPlayer = false
audioController.stop()
currentViewModel?.setLinkArchived(dataService: dataService, objectID: $0, archived: true)
},
viewArticle: { itemID in
if let article = try? dataService.viewContext.existingObject(with: itemID) as? Models.LibraryItem {
currentViewModel?.pushFeedItem(item: article)
}
}
)
}
.navigationBarHidden(true)
2023-12-15 07:22:47 +00:00
.onReceive(NSNotification.performSyncPublisher) { _ in
Task {
2023-12-26 06:23:39 +00:00
await syncManager.syncUpdates(dataService: dataService)
2023-12-15 07:22:47 +00:00
}
}
2023-12-18 03:31:59 +00:00
.onOpenURL { url in
2023-12-18 09:35:08 +00:00
inboxViewModel.linkRequest = nil
2023-12-18 03:31:59 +00:00
if let deepLink = DeepLink.make(from: url) {
switch deepLink {
case let .search(query):
2023-12-18 09:35:08 +00:00
inboxViewModel.searchTerm = query
2023-12-18 03:31:59 +00:00
case let .savedSearch(named):
2023-12-18 09:35:08 +00:00
if let filter = inboxViewModel.findFilter(dataService, named: named) {
inboxViewModel.appliedFilter = filter
2023-12-18 03:31:59 +00:00
}
case let .webAppLinkRequest(requestID):
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
withoutAnimation {
2023-12-18 09:35:08 +00:00
inboxViewModel.linkRequest = LinkRequest(id: UUID(), serverID: requestID)
inboxViewModel.presentWebContainer = true
2023-12-18 03:31:59 +00:00
}
}
}
}
selectedTab = "inbox"
}
}
}