Proper Library Handling (#543)
This commit is contained in:
parent
3b755adf87
commit
ce38efb3ec
|
@ -36,10 +36,10 @@ final class MovieLibrariesCoordinator: NavigationCoordinatable {
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
func makeLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
||||||
LibraryCoordinator(viewModel: LibraryViewModel(parentID: library.id), title: library.title)
|
LibraryCoordinator(viewModel: LibraryViewModel(library: library), title: library.title)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeRootLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
func makeRootLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
||||||
LibraryCoordinator(viewModel: LibraryViewModel(parentID: library.id), title: library.title)
|
LibraryCoordinator(viewModel: LibraryViewModel(library: library), title: library.title)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,10 +36,10 @@ final class TVLibrariesCoordinator: NavigationCoordinatable {
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
func makeLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
||||||
LibraryCoordinator(viewModel: LibraryViewModel(parentID: library.id), title: library.title)
|
LibraryCoordinator(viewModel: LibraryViewModel(library: library), title: library.title)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeRootLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
func makeRootLibrary(library: BaseItemDto) -> LibraryCoordinator {
|
||||||
LibraryCoordinator(viewModel: LibraryViewModel(parentID: library.id), title: library.title)
|
LibraryCoordinator(viewModel: LibraryViewModel(library: library), title: library.title)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ extension BaseItemDto: Poster {
|
||||||
|
|
||||||
var showTitle: Bool {
|
var showTitle: Bool {
|
||||||
switch type {
|
switch type {
|
||||||
case .episode, .series, .movie, .boxSet:
|
case .episode, .series, .movie, .boxSet, .collectionFolder:
|
||||||
return Defaults[.Customization.showPosterLabels]
|
return Defaults[.Customization.showPosterLabels]
|
||||||
default:
|
default:
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
// TODO: Look at something better that possibly doesn't depend on the viewmodel
|
||||||
|
// and accomodates favorites and liveTV better
|
||||||
struct LibraryItem: Equatable, Poster {
|
struct LibraryItem: Equatable, Poster {
|
||||||
|
|
||||||
var library: BaseItemDto
|
var library: BaseItemDto
|
||||||
|
@ -29,4 +31,12 @@ struct LibraryItem: Equatable, Poster {
|
||||||
lhs.library == rhs.library &&
|
lhs.library == rhs.library &&
|
||||||
lhs.viewModel.libraryImages[lhs.library.id ?? ""] == rhs.viewModel.libraryImages[rhs.library.id ?? ""]
|
lhs.viewModel.libraryImages[lhs.library.id ?? ""] == rhs.viewModel.libraryImages[rhs.library.id ?? ""]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func favorites(viewModel: MediaViewModel) -> LibraryItem {
|
||||||
|
.init(library: .init(name: L10n.favorites, collectionType: "favorites"), viewModel: viewModel)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func liveTV(viewModel: MediaViewModel) -> LibraryItem {
|
||||||
|
.init(library: .init(name: "LiveTV", collectionType: "liveTV"), viewModel: viewModel)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,6 @@ extension Defaults.Keys {
|
||||||
static let outOfNetworkBandwidth = Key<Int>("OutOfNetworkBandwidth", default: 40_000_000, suite: .generalSuite)
|
static let outOfNetworkBandwidth = Key<Int>("OutOfNetworkBandwidth", default: 40_000_000, suite: .generalSuite)
|
||||||
|
|
||||||
enum Customization {
|
enum Customization {
|
||||||
static let showFlattenView = Key<Bool>("showFlattenView", default: true, suite: .generalSuite)
|
|
||||||
static let itemViewType = Key<ItemViewType>("itemViewType", default: .compactLogo, suite: .generalSuite)
|
static let itemViewType = Key<ItemViewType>("itemViewType", default: .compactLogo, suite: .generalSuite)
|
||||||
|
|
||||||
static let showPosterLabels = Key<Bool>("showPosterLabels", default: true, suite: .generalSuite)
|
static let showPosterLabels = Key<Bool>("showPosterLabels", default: true, suite: .generalSuite)
|
||||||
|
|
|
@ -11,28 +11,24 @@ import Defaults
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
|
// TODO: Look at refactoring
|
||||||
final class LibraryViewModel: ViewModel {
|
final class LibraryViewModel: ViewModel {
|
||||||
|
|
||||||
@Default(.Customization.Library.gridPosterType)
|
|
||||||
var libraryGridPosterType
|
|
||||||
|
|
||||||
@Published
|
@Published
|
||||||
var items: [BaseItemDto] = []
|
var items: [BaseItemDto] = []
|
||||||
@Published
|
@Published
|
||||||
var totalPages = 0
|
private var currentPage = 0
|
||||||
@Published
|
private var hasNextPage = true
|
||||||
var currentPage = 0
|
|
||||||
@Published
|
|
||||||
var hasNextPage = false
|
|
||||||
|
|
||||||
// temp
|
|
||||||
@Published
|
@Published
|
||||||
var filters: LibraryFilters
|
var filters: LibraryFilters
|
||||||
|
|
||||||
var parentID: String?
|
@Default(.Customization.Library.gridPosterType)
|
||||||
var person: BaseItemPerson?
|
private var libraryGridPosterType
|
||||||
var genre: NameGuidPair?
|
|
||||||
var studio: NameGuidPair?
|
let library: BaseItemDto?
|
||||||
|
let person: BaseItemPerson?
|
||||||
|
let genre: NameGuidPair?
|
||||||
|
let studio: NameGuidPair?
|
||||||
|
|
||||||
private var pageItemSize: Int {
|
private var pageItemSize: Int {
|
||||||
let height = libraryGridPosterType == .portrait ? libraryGridPosterType.width * 1.5 : libraryGridPosterType.width / 1.77
|
let height = libraryGridPosterType == .portrait ? libraryGridPosterType.width * 1.5 : libraryGridPosterType.width / 1.77
|
||||||
|
@ -48,13 +44,13 @@ final class LibraryViewModel: ViewModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
init(
|
init(
|
||||||
parentID: String? = nil,
|
library: BaseItemDto? = nil,
|
||||||
person: BaseItemPerson? = nil,
|
person: BaseItemPerson? = nil,
|
||||||
genre: NameGuidPair? = nil,
|
genre: NameGuidPair? = nil,
|
||||||
studio: NameGuidPair? = nil,
|
studio: NameGuidPair? = nil,
|
||||||
filters: LibraryFilters = LibraryFilters(filters: [], sortOrder: [.ascending], withGenres: [], sortBy: [.name])
|
filters: LibraryFilters = LibraryFilters(filters: [], sortOrder: [.ascending], withGenres: [], sortBy: [.name])
|
||||||
) {
|
) {
|
||||||
self.parentID = parentID
|
self.library = library
|
||||||
self.person = person
|
self.person = person
|
||||||
self.genre = genre
|
self.genre = genre
|
||||||
self.studio = studio
|
self.studio = studio
|
||||||
|
@ -78,31 +74,33 @@ final class LibraryViewModel: ViewModel {
|
||||||
let personIDs: [String] = [person].compactMap(\.?.id)
|
let personIDs: [String] = [person].compactMap(\.?.id)
|
||||||
let studioIDs: [String] = [studio].compactMap(\.?.id)
|
let studioIDs: [String] = [studio].compactMap(\.?.id)
|
||||||
let genreIDs: [String]
|
let genreIDs: [String]
|
||||||
|
|
||||||
if filters.withGenres.isEmpty {
|
if filters.withGenres.isEmpty {
|
||||||
genreIDs = [genre].compactMap(\.?.id)
|
genreIDs = [genre].compactMap(\.?.id)
|
||||||
} else {
|
} else {
|
||||||
genreIDs = filters.withGenres.compactMap(\.id)
|
genreIDs = filters.withGenres.compactMap(\.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
let sortBy = filters.sortBy.map(\.rawValue)
|
let sortBy = filters.sortBy.map(\.rawValue)
|
||||||
let queryRecursive = Defaults[.Customization.showFlattenView] || filters.filters.contains(.isFavorite) ||
|
|
||||||
self.person != nil ||
|
|
||||||
self.genre != nil ||
|
|
||||||
self.studio != nil
|
|
||||||
let includeItemTypes: [BaseItemKind]
|
let includeItemTypes: [BaseItemKind]
|
||||||
|
|
||||||
if filters.filters.contains(.isFavorite) {
|
if filters.filters.contains(.isFavorite) {
|
||||||
includeItemTypes = [.movie, .series, .season, .episode, .boxSet]
|
includeItemTypes = [.movie, .boxSet, .series, .season, .episode]
|
||||||
|
} else if library?.collectionType == "folders" {
|
||||||
|
includeItemTypes = [.collectionFolder]
|
||||||
} else {
|
} else {
|
||||||
includeItemTypes = [.movie, .series, .boxSet] + (Defaults[.Customization.showFlattenView] ? [] : [.folder])
|
includeItemTypes = [.movie, .series, .boxSet]
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemsAPI.getItemsByUserId(
|
ItemsAPI.getItemsByUserId(
|
||||||
userId: SessionManager.main.currentLogin.user.id,
|
userId: SessionManager.main.currentLogin.user.id,
|
||||||
startIndex: currentPage * pageItemSize,
|
startIndex: currentPage * pageItemSize,
|
||||||
limit: pageItemSize,
|
limit: pageItemSize,
|
||||||
recursive: queryRecursive,
|
recursive: true,
|
||||||
searchTerm: nil,
|
searchTerm: nil,
|
||||||
sortOrder: filters.sortOrder.compactMap { SortOrder(rawValue: $0.rawValue) },
|
sortOrder: filters.sortOrder.compactMap { SortOrder(rawValue: $0.rawValue) },
|
||||||
parentId: parentID,
|
parentId: library?.id,
|
||||||
fields: ItemFields.allCases,
|
fields: ItemFields.allCases,
|
||||||
includeItemTypes: includeItemTypes,
|
includeItemTypes: includeItemTypes,
|
||||||
filters: filters.filters,
|
filters: filters.filters,
|
||||||
|
@ -118,18 +116,18 @@ final class LibraryViewModel: ViewModel {
|
||||||
.sink(receiveCompletion: { [weak self] completion in
|
.sink(receiveCompletion: { [weak self] completion in
|
||||||
self?.handleAPIRequestError(completion: completion)
|
self?.handleAPIRequestError(completion: completion)
|
||||||
}, receiveValue: { [weak self] response in
|
}, receiveValue: { [weak self] response in
|
||||||
|
guard !(response.items?.isEmpty ?? false) else {
|
||||||
|
self?.hasNextPage = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
guard let self = self else { return }
|
self?.items.append(contentsOf: response.items ?? [])
|
||||||
let totalPages = ceil(Double(response.totalRecordCount ?? 0) / Double(self.pageItemSize))
|
|
||||||
|
|
||||||
self.totalPages = Int(totalPages)
|
|
||||||
self.hasNextPage = self.currentPage < self.totalPages - 1
|
|
||||||
self.items.append(contentsOf: response.items ?? [])
|
|
||||||
})
|
})
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
func requestNextPageAsync() {
|
func requestNextPageAsync() {
|
||||||
|
guard hasNextPage else { return }
|
||||||
currentPage += 1
|
currentPage += 1
|
||||||
requestItemsAsync(with: filters)
|
requestItemsAsync(with: filters)
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,15 +13,21 @@ import JellyfinAPI
|
||||||
final class MediaViewModel: ViewModel {
|
final class MediaViewModel: ViewModel {
|
||||||
|
|
||||||
@Published
|
@Published
|
||||||
var libraries: [BaseItemDto] = []
|
private var libraries: [LibraryItem] = []
|
||||||
@Published
|
@Published
|
||||||
var libraryImages: [String: [ImageSource]] = [:]
|
var libraryImages: [String: [ImageSource]] = [:]
|
||||||
|
|
||||||
private var supportedLibraries: [String] {
|
@Default(.Experimental.liveTVAlphaEnabled)
|
||||||
["movies", "tvshows", "unknown"]
|
private var liveTVEnabled
|
||||||
.appending("livetv", if: Defaults[.Experimental.liveTVAlphaEnabled])
|
|
||||||
|
var libraryItems: [LibraryItem] {
|
||||||
|
[.init(library: .init(name: L10n.favorites, collectionType: "favorites"), viewModel: self)]
|
||||||
|
.appending(.init(library: .init(name: "LiveTV", collectionType: "liveTV"), viewModel: self), if: liveTVEnabled)
|
||||||
|
.appending(libraries)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static let supportedCollectionTypes: [String] = ["boxsets", "folders", "movies", "tvshows", "unknown"]
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
@ -31,15 +37,16 @@ final class MediaViewModel: ViewModel {
|
||||||
|
|
||||||
func requestLibraries() {
|
func requestLibraries() {
|
||||||
UserViewsAPI.getUserViews(userId: SessionManager.main.currentLogin.user.id)
|
UserViewsAPI.getUserViews(userId: SessionManager.main.currentLogin.user.id)
|
||||||
.trackActivity(loading)
|
|
||||||
.sink(receiveCompletion: { completion in
|
.sink(receiveCompletion: { completion in
|
||||||
self.handleAPIRequestError(completion: completion)
|
self.handleAPIRequestError(completion: completion)
|
||||||
}, receiveValue: { response in
|
}, receiveValue: { response in
|
||||||
guard let items = response.items else { return }
|
guard let items = response.items else { return }
|
||||||
self.libraries = items.filter { self.supportedLibraries.contains($0.collectionType ?? "unknown") }
|
let filteredLibraries = items.filter { Self.supportedCollectionTypes.contains($0.collectionType ?? "unknown") }
|
||||||
self.libraries.forEach {
|
filteredLibraries.forEach {
|
||||||
self.getRandomItemImageSource(with: nil, id: $0.id, key: $0.id ?? "")
|
self.getRandomItemImageSource(with: nil, id: $0.id, key: $0.id ?? "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.libraries = filteredLibraries.map { .init(library: $0, viewModel: self) }
|
||||||
})
|
})
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct LatestInLibraryView: View {
|
||||||
Button {
|
Button {
|
||||||
router.route(to: \.library, (
|
router.route(to: \.library, (
|
||||||
viewModel: .init(
|
viewModel: .init(
|
||||||
parentID: viewModel.library.id!,
|
library: viewModel.library,
|
||||||
filters: LibraryFilters(
|
filters: LibraryFilters(
|
||||||
filters: [],
|
filters: [],
|
||||||
sortOrder: [.descending],
|
sortOrder: [.descending],
|
||||||
|
|
|
@ -13,25 +13,25 @@ import SwiftUI
|
||||||
|
|
||||||
struct MediaView: View {
|
struct MediaView: View {
|
||||||
|
|
||||||
|
@EnvironmentObject
|
||||||
|
private var tabRouter: MainCoordinator.Router
|
||||||
@EnvironmentObject
|
@EnvironmentObject
|
||||||
private var router: MediaCoordinator.Router
|
private var router: MediaCoordinator.Router
|
||||||
@ObservedObject
|
@ObservedObject
|
||||||
var viewModel: MediaViewModel
|
var viewModel: MediaViewModel
|
||||||
|
|
||||||
private var libraryItems: [LibraryItem] {
|
|
||||||
[LibraryItem(library: .init(name: L10n.favorites, id: "favorites"), viewModel: viewModel)] +
|
|
||||||
viewModel.libraries.map { LibraryItem(library: $0, viewModel: viewModel) }
|
|
||||||
}
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
CollectionView(items: libraryItems) { _, item, _ in
|
CollectionView(items: viewModel.libraryItems) { _, item, _ in
|
||||||
PosterButton(item: item, type: .landscape)
|
PosterButton(item: item, type: .landscape)
|
||||||
.scaleItem(0.8)
|
.scaleItem(0.8)
|
||||||
.onSelect { _ in
|
.onSelect { _ in
|
||||||
if item.library.id == "favorites" {
|
switch item.library.collectionType {
|
||||||
|
case "favorites":
|
||||||
router.route(to: \.library, (viewModel: .init(filters: .favorites), title: ""))
|
router.route(to: \.library, (viewModel: .init(filters: .favorites), title: ""))
|
||||||
} else {
|
case "liveTV":
|
||||||
router.route(to: \.library, (viewModel: .init(parentID: item.library.id), title: ""))
|
tabRouter.root(\.liveTV)
|
||||||
|
default:
|
||||||
|
router.route(to: \.library, (viewModel: .init(library: item.library), title: ""))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.imageOverlay { _ in
|
.imageOverlay { _ in
|
||||||
|
|
|
@ -13,8 +13,6 @@ struct CustomizeViewsSettings: View {
|
||||||
|
|
||||||
@Default(.Customization.showPosterLabels)
|
@Default(.Customization.showPosterLabels)
|
||||||
var showPosterLabels
|
var showPosterLabels
|
||||||
@Default(.Customization.showFlattenView)
|
|
||||||
var showFlattenView
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Form {
|
Form {
|
||||||
|
@ -22,8 +20,6 @@ struct CustomizeViewsSettings: View {
|
||||||
|
|
||||||
Toggle(L10n.showPosterLabels, isOn: $showPosterLabels)
|
Toggle(L10n.showPosterLabels, isOn: $showPosterLabels)
|
||||||
|
|
||||||
Toggle(L10n.showFlattenView, isOn: $showFlattenView)
|
|
||||||
|
|
||||||
} header: {
|
} header: {
|
||||||
L10n.customize.text
|
L10n.customize.text
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ struct LatestInLibraryView: View {
|
||||||
PosterHStack(title: L10n.latestWithString(viewModel.library.displayName), type: latestInLibraryPosterType, items: viewModel.items)
|
PosterHStack(title: L10n.latestWithString(viewModel.library.displayName), type: latestInLibraryPosterType, items: viewModel.items)
|
||||||
.trailing {
|
.trailing {
|
||||||
Button {
|
Button {
|
||||||
let libraryViewModel = LibraryViewModel(parentID: viewModel.library.id, filters: HomeViewModel.recentFilterSet)
|
let libraryViewModel = LibraryViewModel(library: viewModel.library, filters: HomeViewModel.recentFilterSet)
|
||||||
homeRouter.route(to: \.library, (viewModel: libraryViewModel, title: viewModel.library.displayName))
|
homeRouter.route(to: \.library, (viewModel: libraryViewModel, title: viewModel.library.displayName))
|
||||||
} label: {
|
} label: {
|
||||||
HStack {
|
HStack {
|
||||||
|
|
|
@ -44,6 +44,8 @@ struct ItemView: View {
|
||||||
}
|
}
|
||||||
case .person:
|
case .person:
|
||||||
LibraryView(viewModel: .init(person: .init(id: item.id)))
|
LibraryView(viewModel: .init(person: .init(id: item.id)))
|
||||||
|
case .collectionFolder:
|
||||||
|
LibraryView(viewModel: .init(library: item))
|
||||||
default:
|
default:
|
||||||
Text(L10n.notImplementedYetWithType(item.type ?? "--"))
|
Text(L10n.notImplementedYetWithType(item.type ?? "--"))
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,7 +125,7 @@ struct LibraryView: View {
|
||||||
.route(to: \.filter, (
|
.route(to: \.filter, (
|
||||||
filters: $viewModel.filters,
|
filters: $viewModel.filters,
|
||||||
enabledFilterType: viewModel.enabledFilterType,
|
enabledFilterType: viewModel.enabledFilterType,
|
||||||
parentId: viewModel.parentID ?? ""
|
parentId: viewModel.library?.id ?? ""
|
||||||
))
|
))
|
||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "line.horizontal.3.decrease.circle")
|
Image(systemName: "line.horizontal.3.decrease.circle")
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
import CollectionView
|
import CollectionView
|
||||||
import Defaults
|
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
import Stinsen
|
import Stinsen
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
@ -18,14 +17,6 @@ struct MediaView: View {
|
||||||
private var router: MediaCoordinator.Router
|
private var router: MediaCoordinator.Router
|
||||||
@ObservedObject
|
@ObservedObject
|
||||||
var viewModel: MediaViewModel
|
var viewModel: MediaViewModel
|
||||||
@Default(.Experimental.liveTVAlphaEnabled)
|
|
||||||
var liveTVEnabled
|
|
||||||
|
|
||||||
private var libraryItems: [LibraryItem] {
|
|
||||||
[LibraryItem(library: .init(name: L10n.favorites, id: "favorites"), viewModel: viewModel)]
|
|
||||||
.appending(.init(library: .init(name: "LiveTV", id: "liveTV"), viewModel: viewModel), if: liveTVEnabled)
|
|
||||||
.appending(viewModel.libraries.map { LibraryItem(library: $0, viewModel: viewModel) })
|
|
||||||
}
|
|
||||||
|
|
||||||
private var gridLayout: NSCollectionLayoutSection.GridLayoutMode {
|
private var gridLayout: NSCollectionLayoutSection.GridLayoutMode {
|
||||||
if UIDevice.isPhone {
|
if UIDevice.isPhone {
|
||||||
|
@ -36,16 +27,17 @@ struct MediaView: View {
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
CollectionView(items: libraryItems) { _, item, _ in
|
CollectionView(items: viewModel.libraryItems) { _, item, _ in
|
||||||
PosterButton(item: item, type: .landscape)
|
PosterButton(item: item, type: .landscape)
|
||||||
.scaleItem(UIDevice.isPhone ? 0.9 : 1)
|
.scaleItem(UIDevice.isPhone ? 0.9 : 1)
|
||||||
.onSelect { _ in
|
.onSelect { _ in
|
||||||
if item.library.id == "favorites" {
|
switch item.library.collectionType {
|
||||||
|
case "favorites":
|
||||||
router.route(to: \.library, (viewModel: .init(filters: .favorites), title: ""))
|
router.route(to: \.library, (viewModel: .init(filters: .favorites), title: ""))
|
||||||
} else if item.library.id == "liveTV" {
|
case "liveTV":
|
||||||
router.route(to: \.liveTV)
|
router.route(to: \.liveTV)
|
||||||
} else {
|
default:
|
||||||
router.route(to: \.library, (viewModel: .init(parentID: item.library.id), title: ""))
|
router.route(to: \.library, (viewModel: .init(library: item.library), title: ""))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.imageOverlay { _ in
|
.imageOverlay { _ in
|
||||||
|
|
|
@ -11,8 +11,6 @@ import SwiftUI
|
||||||
|
|
||||||
struct CustomizeViewsSettings: View {
|
struct CustomizeViewsSettings: View {
|
||||||
|
|
||||||
@Default(.Customization.showFlattenView)
|
|
||||||
var showFlattenView
|
|
||||||
@Default(.Customization.itemViewType)
|
@Default(.Customization.itemViewType)
|
||||||
var itemViewType
|
var itemViewType
|
||||||
|
|
||||||
|
@ -45,9 +43,6 @@ struct CustomizeViewsSettings: View {
|
||||||
var body: some View {
|
var body: some View {
|
||||||
List {
|
List {
|
||||||
Section {
|
Section {
|
||||||
|
|
||||||
Toggle(L10n.showFlattenView, isOn: $showFlattenView)
|
|
||||||
|
|
||||||
Picker(L10n.items, selection: $itemViewType) {
|
Picker(L10n.items, selection: $itemViewType) {
|
||||||
ForEach(ItemViewType.allCases, id: \.self) { type in
|
ForEach(ItemViewType.allCases, id: \.self) { type in
|
||||||
Text(type.localizedName).tag(type.rawValue)
|
Text(type.localizedName).tag(type.rawValue)
|
||||||
|
|
Loading…
Reference in New Issue