Add a menu of Route function to ItemView

This commit is contained in:
PangMo5 2021-10-05 01:11:48 +09:00
parent c3b2fadf91
commit e58e67211f
4 changed files with 89 additions and 26 deletions

View File

@ -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
}
}
}
}

View File

@ -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 ""
}
}
}

View File

@ -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)
}
}

View File

@ -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)
}
}