Add a menu of Route function to ItemView
This commit is contained in:
parent
c3b2fadf91
commit
e58e67211f
|
@ -55,6 +55,39 @@ private struct ItemView: View {
|
|||
}
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
var toolbarItemContent: some View {
|
||||
switch viewModel.item.itemType {
|
||||
case .season:
|
||||
Menu {
|
||||
Button {
|
||||
(viewModel as? SeasonItemViewModel)?.routeToSeriesItem()
|
||||
} label: {
|
||||
Label("Show Series", systemImage: "text.below.photo")
|
||||
}
|
||||
} label: {
|
||||
Image(systemName: "ellipsis.circle")
|
||||
}
|
||||
case .episode:
|
||||
Menu {
|
||||
Button {
|
||||
(viewModel as? EpisodeItemViewModel)?.routeToSeriesItem()
|
||||
} label: {
|
||||
Label("Show Series", systemImage: "text.below.photo")
|
||||
}
|
||||
Button {
|
||||
(viewModel as? EpisodeItemViewModel)?.routeToSeasonItem()
|
||||
} label: {
|
||||
Label("Show Season", systemImage: "square.fill.text.grid.1x2")
|
||||
}
|
||||
} label: {
|
||||
Image(systemName: "ellipsis.circle")
|
||||
}
|
||||
default:
|
||||
EmptyView()
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if hSizeClass == .compact && vSizeClass == .regular {
|
||||
|
@ -71,5 +104,10 @@ private struct ItemView: View {
|
|||
guard flag else { return }
|
||||
self.itemRouter.route(to: \.videoPlayer, viewModel.item)
|
||||
}
|
||||
.toolbar {
|
||||
ToolbarItemGroup(placement: .navigationBarTrailing) {
|
||||
toolbarItemContent
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,18 +110,3 @@ struct LibrarySearchView: View {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension ItemType {
|
||||
var localized: String {
|
||||
switch self {
|
||||
case .episode:
|
||||
return "Episodes"
|
||||
case .movie:
|
||||
return "Movies"
|
||||
case .series:
|
||||
return "Shows"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,8 +10,10 @@
|
|||
import Combine
|
||||
import Foundation
|
||||
import JellyfinAPI
|
||||
import Stinsen
|
||||
|
||||
final class EpisodeItemViewModel: ItemViewModel {
|
||||
@RouterObject var itemRouter: ItemCoordinator.Router?
|
||||
|
||||
override func getItemDisplayName() -> String {
|
||||
guard let episodeLocator = item.getEpisodeLocator() else { return item.name ?? "" }
|
||||
|
@ -21,4 +23,28 @@ final class EpisodeItemViewModel: ItemViewModel {
|
|||
override func shouldDisplayRuntime() -> Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func routeToSeasonItem() {
|
||||
guard let id = item.seasonId else { return }
|
||||
UserLibraryAPI.getItem(userId: SessionManager.current.user.user_id!, itemId: id)
|
||||
.trackActivity(loading)
|
||||
.sink(receiveCompletion: { [weak self] completion in
|
||||
self?.handleAPIRequestError(completion: completion)
|
||||
}, receiveValue: { [weak self] item in
|
||||
self?.itemRouter?.route(to: \.item, item)
|
||||
})
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
|
||||
func routeToSeriesItem() {
|
||||
guard let id = item.seriesId else { return }
|
||||
UserLibraryAPI.getItem(userId: SessionManager.current.user.user_id!, itemId: id)
|
||||
.trackActivity(loading)
|
||||
.sink(receiveCompletion: { [weak self] completion in
|
||||
self?.handleAPIRequestError(completion: completion)
|
||||
}, receiveValue: { [weak self] item in
|
||||
self?.itemRouter?.route(to: \.item, item)
|
||||
})
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,9 +10,10 @@
|
|||
import Combine
|
||||
import Foundation
|
||||
import JellyfinAPI
|
||||
import Stinsen
|
||||
|
||||
final class SeasonItemViewModel: ItemViewModel {
|
||||
|
||||
@RouterObject var itemRouter: ItemCoordinator.Router?
|
||||
@Published private(set) var episodes: [BaseItemDto] = []
|
||||
|
||||
override init(item: BaseItemDto) {
|
||||
|
@ -29,7 +30,8 @@ final class SeasonItemViewModel: ItemViewModel {
|
|||
}
|
||||
|
||||
private func requestEpisodes() {
|
||||
LogManager.shared.log.debug("Getting episodes in season \(self.item.id!) (\(self.item.name!)) of show \(self.item.seriesId!) (\(self.item.seriesName!))")
|
||||
LogManager.shared.log
|
||||
.debug("Getting episodes in season \(item.id!) (\(item.name!)) of show \(item.seriesId!) (\(item.seriesName!))")
|
||||
TvShowsAPI.getEpisodes(seriesId: item.seriesId ?? "", userId: SessionManager.current.user.user_id!,
|
||||
fields: [.primaryImageAspectRatio, .seriesPrimaryImage, .seasonUserData, .overview, .genres, .people],
|
||||
seasonId: item.id ?? "")
|
||||
|
@ -49,7 +51,7 @@ final class SeasonItemViewModel: ItemViewModel {
|
|||
// the watched status of episodes in the season.
|
||||
// Default to the first episode of the season if all have been watched.
|
||||
private func setNextUpInSeason() {
|
||||
guard episodes.count > 0 else { return }
|
||||
guard !episodes.isEmpty else { return }
|
||||
|
||||
var firstUnwatchedSearch: BaseItemDto?
|
||||
|
||||
|
@ -68,4 +70,16 @@ final class SeasonItemViewModel: ItemViewModel {
|
|||
playButtonItem = firstEpisode
|
||||
}
|
||||
}
|
||||
|
||||
func routeToSeriesItem() {
|
||||
guard let id = item.seriesId else { return }
|
||||
UserLibraryAPI.getItem(userId: SessionManager.current.user.user_id!, itemId: id)
|
||||
.trackActivity(loading)
|
||||
.sink(receiveCompletion: { [weak self] completion in
|
||||
self?.handleAPIRequestError(completion: completion)
|
||||
}, receiveValue: { [weak self] item in
|
||||
self?.itemRouter?.route(to: \.item, item)
|
||||
})
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue