From b7fd00702f5850e39f51ac9840434ccd0162e04d Mon Sep 17 00:00:00 2001 From: jhays Date: Tue, 26 Oct 2021 09:20:37 -0500 Subject: [PATCH] add Channels tab --- .../Views/LiveTVChannelsView.swift | 22 ++++++++++++++ JellyfinPlayer.xcodeproj/project.pbxproj | 18 ++++++++++++ .../LiveTVChannelsCoordinator.swift | 29 +++++++++++++++++++ .../Coordinators/LiveTVTabCoordinator.swift | 17 +++++++++-- .../ViewModels/LiveTVChannelsViewModel.swift | 15 ++++++++++ 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift create mode 100644 Shared/Coordinators/LiveTVChannelsCoordinator.swift create mode 100644 Shared/ViewModels/LiveTVChannelsViewModel.swift diff --git a/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift b/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift new file mode 100644 index 00000000..71774eeb --- /dev/null +++ b/JellyfinPlayer tvOS/Views/LiveTVChannelsView.swift @@ -0,0 +1,22 @@ +// + /* + * SwiftFin is subject to the terms of the Mozilla Public + * License, v2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright 2021 Aiden Vigue & Jellyfin Contributors + */ + +import Foundation +import SwiftUI + +struct LiveTVChannelsView: View { + @EnvironmentObject var programsRouter: LiveTVChannelsCoordinator.Router + @StateObject var viewModel = LiveTVChannelsViewModel() + + var body: some View { + Button {} label: { + Text("Coming Soon") + } + } +} diff --git a/JellyfinPlayer.xcodeproj/project.pbxproj b/JellyfinPlayer.xcodeproj/project.pbxproj index 199f9b16..ccbca006 100644 --- a/JellyfinPlayer.xcodeproj/project.pbxproj +++ b/JellyfinPlayer.xcodeproj/project.pbxproj @@ -253,6 +253,12 @@ C4BE0780272837FB003F4AD1 /* LiveTVGuideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE077E272837FB003F4AD1 /* LiveTVGuideView.swift */; }; C4BE07822728383F003F4AD1 /* LiveTVGuideCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE07812728383F003F4AD1 /* LiveTVGuideCoordinator.swift */; }; C4BE07832728383F003F4AD1 /* LiveTVGuideCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE07812728383F003F4AD1 /* LiveTVGuideCoordinator.swift */; }; + C4BE07852728446F003F4AD1 /* LiveTVChannelsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE07842728446F003F4AD1 /* LiveTVChannelsViewModel.swift */; }; + C4BE07862728446F003F4AD1 /* LiveTVChannelsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE07842728446F003F4AD1 /* LiveTVChannelsViewModel.swift */; }; + C4BE07882728448B003F4AD1 /* LiveTVChannelsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE07872728448B003F4AD1 /* LiveTVChannelsCoordinator.swift */; }; + C4BE07892728448B003F4AD1 /* LiveTVChannelsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE07872728448B003F4AD1 /* LiveTVChannelsCoordinator.swift */; }; + C4BE078B272844AF003F4AD1 /* LiveTVChannelsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE078A272844AF003F4AD1 /* LiveTVChannelsView.swift */; }; + C4BE078C272844AF003F4AD1 /* LiveTVChannelsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BE078A272844AF003F4AD1 /* LiveTVChannelsView.swift */; }; C4E5081B2703F82A0045C9AB /* LibraryListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4E508172703E8190045C9AB /* LibraryListView.swift */; }; C4E5081D2703F8370045C9AB /* LibrarySearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4E5081C2703F8370045C9AB /* LibrarySearchView.swift */; }; E100720726BDABC100CE3E31 /* MediaPlayButtonRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E100720626BDABC100CE3E31 /* MediaPlayButtonRowView.swift */; }; @@ -580,6 +586,9 @@ C4BE077B272837C8003F4AD1 /* LiveTVGuideViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveTVGuideViewModel.swift; sourceTree = ""; }; C4BE077E272837FB003F4AD1 /* LiveTVGuideView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveTVGuideView.swift; sourceTree = ""; }; C4BE07812728383F003F4AD1 /* LiveTVGuideCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveTVGuideCoordinator.swift; sourceTree = ""; }; + C4BE07842728446F003F4AD1 /* LiveTVChannelsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveTVChannelsViewModel.swift; sourceTree = ""; }; + C4BE07872728448B003F4AD1 /* LiveTVChannelsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveTVChannelsCoordinator.swift; sourceTree = ""; }; + C4BE078A272844AF003F4AD1 /* LiveTVChannelsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveTVChannelsView.swift; sourceTree = ""; }; C4E508172703E8190045C9AB /* LibraryListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListView.swift; sourceTree = ""; }; C4E5081C2703F8370045C9AB /* LibrarySearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrarySearchView.swift; sourceTree = ""; }; E100720626BDABC100CE3E31 /* MediaPlayButtonRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPlayButtonRowView.swift; sourceTree = ""; }; @@ -738,6 +747,7 @@ C4BE07752725EBEA003F4AD1 /* LiveTVProgramsViewModel.swift */, 536D3D75267BA9BB0004248C /* MainTabViewModel.swift */, C4BE077B272837C8003F4AD1 /* LiveTVGuideViewModel.swift */, + C4BE07842728446F003F4AD1 /* LiveTVChannelsViewModel.swift */, C40CD924271F8D1E000FB198 /* MovieLibrariesViewModel.swift */, C4BE0765271FC109003F4AD1 /* TVLibrariesViewModel.swift */, 62E632E2267D3BA60063E547 /* MovieItemViewModel.swift */, @@ -1128,6 +1138,7 @@ C4BE07702725EB06003F4AD1 /* LiveTVProgramsCoordinator.swift */, C4BE07812728383F003F4AD1 /* LiveTVGuideCoordinator.swift */, C4BE07782726EE82003F4AD1 /* LiveTVTabCoordinator.swift */, + C4BE07872728448B003F4AD1 /* LiveTVChannelsCoordinator.swift */, 62C29EA726D103D500C1D2E7 /* LibraryListCoordinator.swift */, C40CD921271F8CD8000FB198 /* MoviesLibrariesCoordinator.swift */, C4BE0762271FC0BB003F4AD1 /* TVLibrariesCoordinator.swift */, @@ -1205,6 +1216,7 @@ 53A83C32268A309300DF3D92 /* LibraryView.swift */, C4BE07732725EB66003F4AD1 /* LiveTVProgramsView.swift */, C4BE077E272837FB003F4AD1 /* LiveTVGuideView.swift */, + C4BE078A272844AF003F4AD1 /* LiveTVChannelsView.swift */, C40CD927271F8DAB000FB198 /* MovieLibrariesView.swift */, C4BE0768271FC164003F4AD1 /* TVLibrariesView.swift */, 531690EE267ABF72005D8AB9 /* NextUpView.swift */, @@ -1839,9 +1851,11 @@ E193D53727193F8700900D82 /* LibraryListCoordinator.swift in Sources */, E100720726BDABC100CE3E31 /* MediaPlayButtonRowView.swift in Sources */, E193D54D2719426600900D82 /* LibraryFilterView.swift in Sources */, + C4BE07892728448B003F4AD1 /* LiveTVChannelsCoordinator.swift in Sources */, E193D53927193F8E00900D82 /* SearchCoordinator.swift in Sources */, E193D4D927193CAC00900D82 /* PortraitImageStackable.swift in Sources */, 535870A52669D8AE00D05A09 /* ParallaxHeader.swift in Sources */, + C4BE078C272844AF003F4AD1 /* LiveTVChannelsView.swift in Sources */, E1D4BF852719D25A00A11E64 /* TrackLanguage.swift in Sources */, 53272532268BF09D0035FBF1 /* MediaViewActionButton.swift in Sources */, 531690F0267ABF72005D8AB9 /* NextUpView.swift in Sources */, @@ -1850,6 +1864,7 @@ E11B1B6D2718CD68006DA3E8 /* JellyfinAPIError.swift in Sources */, E193D53D27193F9700900D82 /* UserSignInCoordinator.swift in Sources */, 535870A72669D8AE00D05A09 /* MultiSelectorView.swift in Sources */, + C4BE07862728446F003F4AD1 /* LiveTVChannelsViewModel.swift in Sources */, E1AD104E26D96CE3003E4A08 /* BaseItemDtoExtensions.swift in Sources */, 62E632DD267D2E130063E547 /* LibrarySearchViewModel.swift in Sources */, 536D3D81267BDFC60004248C /* PortraitItemElement.swift in Sources */, @@ -1940,7 +1955,9 @@ 6220D0AD26D5EABB00B8E046 /* ViewExtensions.swift in Sources */, E13DD3EC27178A54009D4DAF /* UserSignInViewModel.swift in Sources */, 625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */, + C4BE07852728446F003F4AD1 /* LiveTVChannelsViewModel.swift in Sources */, 536D3D78267BD5C30004248C /* ViewModel.swift in Sources */, + C4BE078B272844AF003F4AD1 /* LiveTVChannelsView.swift in Sources */, E1FCD08826C35A0D007C8DCF /* NetworkError.swift in Sources */, E13DD3E527177D15009D4DAF /* ServerListView.swift in Sources */, E18845F826DEA9C900B0C5B7 /* ItemViewBody.swift in Sources */, @@ -2019,6 +2036,7 @@ E1AD104D26D96CE3003E4A08 /* BaseItemDtoExtensions.swift in Sources */, E13DD3BF27163DD7009D4DAF /* AppDelegate.swift in Sources */, 535870AD2669D8DD00D05A09 /* Typings.swift in Sources */, + C4BE07882728448B003F4AD1 /* LiveTVChannelsCoordinator.swift in Sources */, E1AD105F26D9ADDD003E4A08 /* NameGUIDPairExtensions.swift in Sources */, E13DD3D5271693CD009D4DAF /* SwiftfinStoreDefaults.swift in Sources */, 62E1DCC3273CE19800C9AE76 /* URLExtensions.swift in Sources */, diff --git a/Shared/Coordinators/LiveTVChannelsCoordinator.swift b/Shared/Coordinators/LiveTVChannelsCoordinator.swift new file mode 100644 index 00000000..17b683d4 --- /dev/null +++ b/Shared/Coordinators/LiveTVChannelsCoordinator.swift @@ -0,0 +1,29 @@ +// +/* + * SwiftFin is subject to the terms of the Mozilla Public + * License, v2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright 2021 Aiden Vigue & Jellyfin Contributors + */ + +import Foundation +import JellyfinAPI +import Stinsen +import SwiftUI + +final class LiveTVChannelsCoordinator: NavigationCoordinatable { + let stack = NavigationStack(initial: \LiveTVChannelsCoordinator.start) + + @Root var start = makeStart + @Route(.modal) var modalItem = makeModalItem + + func makeModalItem(item: BaseItemDto) -> NavigationViewCoordinator { + return NavigationViewCoordinator(ItemCoordinator(item: item)) + } + + @ViewBuilder + func makeStart() -> some View { + LiveTVChannelsView() + } +} diff --git a/Shared/Coordinators/LiveTVTabCoordinator.swift b/Shared/Coordinators/LiveTVTabCoordinator.swift index 9d0f3998..971c83b5 100644 --- a/Shared/Coordinators/LiveTVTabCoordinator.swift +++ b/Shared/Coordinators/LiveTVTabCoordinator.swift @@ -13,12 +13,14 @@ import Stinsen final class LiveTVTabCoordinator: TabCoordinatable { var child = TabChild(startingItems: [ - \LiveTVTabCoordinator.programs, - \LiveTVTabCoordinator.guide + \LiveTVTabCoordinator.programs, + \LiveTVTabCoordinator.guide, + \LiveTVTabCoordinator.channels ]) @Route(tabItem: makeProgramsTab) var programs = makePrograms @Route(tabItem: makeGuideTab) var guide = makeGuide + @Route(tabItem: makeChannelsTab) var channels = makeChannels func makePrograms() -> NavigationViewCoordinator { return NavigationViewCoordinator(LiveTVProgramsCoordinator()) @@ -41,4 +43,15 @@ final class LiveTVTabCoordinator: TabCoordinatable { Text("Guide") } } + + func makeChannels() -> NavigationViewCoordinator { + return NavigationViewCoordinator(LiveTVChannelsCoordinator()) + } + + @ViewBuilder func makeChannelsTab(isActive: Bool) -> some View { + HStack { + Image(systemName: "square.grid.3x3") + Text("Channels") + } + } } diff --git a/Shared/ViewModels/LiveTVChannelsViewModel.swift b/Shared/ViewModels/LiveTVChannelsViewModel.swift new file mode 100644 index 00000000..ce29d882 --- /dev/null +++ b/Shared/ViewModels/LiveTVChannelsViewModel.swift @@ -0,0 +1,15 @@ +// + /* + * SwiftFin is subject to the terms of the Mozilla Public + * License, v2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright 2021 Aiden Vigue & Jellyfin Contributors + */ + +import Foundation +import JellyfinAPI + +final class LiveTVChannelsViewModel: ViewModel { + +}