From 8f0af64846b19a14a6233621c03d534cdbd86cd7 Mon Sep 17 00:00:00 2001 From: PangMo5 Date: Fri, 16 Jul 2021 01:26:19 +0900 Subject: [PATCH] UX Improvement --- JellyfinPlayer.xcodeproj/project.pbxproj | 17 ++++++++++ .../xcshareddata/swiftpm/Package.resolved | 33 +++++++++++++++++-- .../ViewModels/LibrarySearchViewModel.swift | 23 ++++++++++--- 3 files changed, 65 insertions(+), 8 deletions(-) diff --git a/JellyfinPlayer.xcodeproj/project.pbxproj b/JellyfinPlayer.xcodeproj/project.pbxproj index e93e0da5..940e17e4 100644 --- a/JellyfinPlayer.xcodeproj/project.pbxproj +++ b/JellyfinPlayer.xcodeproj/project.pbxproj @@ -134,6 +134,7 @@ 625CB5752678C33500530A6E /* LibraryListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5742678C33500530A6E /* LibraryListViewModel.swift */; }; 625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5762678C34300530A6E /* ConnectToServerViewModel.swift */; }; 625CB57A2678C4A400530A6E /* ActivityIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = 625CB5792678C4A400530A6E /* ActivityIndicator */; }; + 6260FFF926A09754003FA968 /* CombineExt in Frameworks */ = {isa = PBXBuildFile; productRef = 6260FFF826A09754003FA968 /* CombineExt */; }; 6267B3D42671024A00A7371D /* APIExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5364F454266CA0DC0026ECBA /* APIExtensions.swift */; }; 6267B3D626710B8900A7371D /* CollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6267B3D526710B8900A7371D /* CollectionExtensions.swift */; }; 6267B3D726710B9700A7371D /* CollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6267B3D526710B8900A7371D /* CollectionExtensions.swift */; }; @@ -389,6 +390,7 @@ 53352571265EA0A0006CCA86 /* Introspect in Frameworks */, 621C638026672A30004216EA /* NukeUI in Frameworks */, 625CB57A2678C4A400530A6E /* ActivityIndicator in Frameworks */, + 6260FFF926A09754003FA968 /* CombineExt in Frameworks */, 53A431BD266B0FF20016769F /* JellyfinAPI in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -760,6 +762,7 @@ 53EC6E24267EB10F006DD26A /* SwiftyJSON */, 62CB3F452685BAF7003D0A6F /* Defaults */, 53649AAC269CFAEA00A2D8B7 /* Puppy */, + 6260FFF826A09754003FA968 /* CombineExt */, ); productName = JellyfinPlayer; productReference = 5377CBF1263B596A003A4E83 /* JellyfinPlayer iOS.app */; @@ -832,6 +835,7 @@ 62CB3F442685BAF7003D0A6F /* XCRemoteSwiftPackageReference "Defaults" */, 53272533268BF9710035FBF1 /* XCRemoteSwiftPackageReference "SwiftUIFocusGuide" */, 53649AAB269CFAEA00A2D8B7 /* XCRemoteSwiftPackageReference "Puppy" */, + 6260FFF726A09754003FA968 /* XCRemoteSwiftPackageReference "CombineExt" */, ); productRefGroup = 5377CBF2263B596A003A4E83 /* Products */; projectDirPath = ""; @@ -1558,6 +1562,14 @@ minimumVersion = 1.1.0; }; }; + 6260FFF726A09754003FA968 /* XCRemoteSwiftPackageReference "CombineExt" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/CombineCommunity/CombineExt"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.3.0; + }; + }; 62CB3F442685BAF7003D0A6F /* XCRemoteSwiftPackageReference "Defaults" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/sindresorhus/Defaults"; @@ -1654,6 +1666,11 @@ package = 625CB5782678C4A400530A6E /* XCRemoteSwiftPackageReference "ActivityIndicator" */; productName = ActivityIndicator; }; + 6260FFF826A09754003FA968 /* CombineExt */ = { + isa = XCSwiftPackageProductDependency; + package = 6260FFF726A09754003FA968 /* XCRemoteSwiftPackageReference "CombineExt" */; + productName = CombineExt; + }; 628B95322670CAEA0091AF3B /* NukeUI */ = { isa = XCSwiftPackageProductDependency; package = 621C637E26672A30004216EA /* XCRemoteSwiftPackageReference "NukeUI" */; diff --git a/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved b/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved index a423daff..a89ff05d 100644 --- a/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -19,6 +19,24 @@ "version": "0.6.0" } }, + { + "package": "combine-schedulers", + "repositoryURL": "https://github.com/pointfreeco/combine-schedulers", + "state": { + "branch": null, + "revision": "c37e5ae8012fb654af776cc556ff8ae64398c841", + "version": "0.5.0" + } + }, + { + "package": "CombineExt", + "repositoryURL": "https://github.com/CombineCommunity/CombineExt", + "state": { + "branch": null, + "revision": "5b8a0c0f178527f9204200505c5fefa6847e528f", + "version": "1.3.0" + } + }, { "package": "Defaults", "repositoryURL": "https://github.com/sindresorhus/Defaults", @@ -38,7 +56,7 @@ } }, { - "package": "jellyfin-sdk-swift", + "package": "JellyfinAPI", "repositoryURL": "https://github.com/jellyfin/jellyfin-sdk-swift", "state": { "branch": "main", @@ -47,7 +65,7 @@ } }, { - "package": "keychain-swift", + "package": "KeychainSwift", "repositoryURL": "https://github.com/evgenyneu/keychain-swift", "state": { "branch": null, @@ -101,7 +119,7 @@ } }, { - "package": "SwiftUI-Introspect", + "package": "Introspect", "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect", "state": { "branch": null, @@ -126,6 +144,15 @@ "revision": "b3dcd7dbd0d488e1a7077cb33b00f2083e382f07", "version": null } + }, + { + "package": "xctest-dynamic-overlay", + "repositoryURL": "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state": { + "branch": null, + "revision": "603974e3909ad4b48ba04aad7e0ceee4f077a518", + "version": "0.1.0" + } } ] }, diff --git a/Shared/ViewModels/LibrarySearchViewModel.swift b/Shared/ViewModels/LibrarySearchViewModel.swift index 3ee5f7de..6fc8e0fd 100644 --- a/Shared/ViewModels/LibrarySearchViewModel.swift +++ b/Shared/ViewModels/LibrarySearchViewModel.swift @@ -8,6 +8,7 @@ */ import Combine +import CombineExt import Foundation import JellyfinAPI @@ -15,7 +16,7 @@ final class LibrarySearchViewModel: ViewModel { @Published var supportedItemTypeList = [ItemType]() - @Published var selectedItemType = ItemType.movie + @Published var selectedItemType: ItemType = .movie @Published var movieItems = [BaseItemDto]() @Published var showItems = [BaseItemDto]() @@ -35,8 +36,15 @@ final class LibrarySearchViewModel: ViewModel { .debounce(for: 0.25, scheduler: DispatchQueue.main) .sink(receiveValue: search) .store(in: &cancellables) + setupPublishersForSupportedItemType() + + requestSuggestions() + } + + func setupPublishersForSupportedItemType() { let supportedItemTypeListPublishers = Publishers.CombineLatest3($movieItems, $showItems, $episodeItems) + .debounce(for: 0.25, scheduler: DispatchQueue.main) .map { arg -> [ItemType] in var typeList = [ItemType]() if !arg.0.isEmpty { @@ -54,13 +62,18 @@ final class LibrarySearchViewModel: ViewModel { supportedItemTypeListPublishers .assign(to: \.supportedItemTypeList, on: self) .store(in: &cancellables) + supportedItemTypeListPublishers - .compactMap(\.first) + .withLatestFrom(supportedItemTypeListPublishers, $selectedItemType) + .compactMap { typeList, selectedItemType in + if typeList.contains(selectedItemType) { + return selectedItemType + } else { + return typeList.first + } + } .assign(to: \.selectedItemType, on: self) .store(in: &cancellables) - - - requestSuggestions() } func requestSuggestions() {