From 13ade8aad3f4e1f3d08ab972582ea16b19daacad Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Fri, 17 Apr 2026 21:52:10 +0200 Subject: [PATCH] Add Continue Watching toggle to tab bar settings Exposes ContinueWatchingView as an opt-in compact tab bar item, hidden by default. Uses a short "Continue" label since the full "Continue Watching" string does not fit as a tab bar title. --- Yattee/Localizable.xcstrings | 11 +++++++++++ Yattee/Models/Navigation/SidebarMainItem.swift | 1 + Yattee/Models/Navigation/TabBarItem.swift | 7 +++++-- Yattee/Views/Navigation/CompactTabView.swift | 10 ++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Yattee/Localizable.xcstrings b/Yattee/Localizable.xcstrings index 7ad699f2..91192006 100644 --- a/Yattee/Localizable.xcstrings +++ b/Yattee/Localizable.xcstrings @@ -16712,6 +16712,17 @@ } } }, + "tabBar.item.continueWatching" : { + "comment" : "Tab bar item title for continue watching (short title)", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continue" + } + } + } + }, "tabBar.item.sources" : { "comment" : "Tab bar item title for sources", "localizations" : { diff --git a/Yattee/Models/Navigation/SidebarMainItem.swift b/Yattee/Models/Navigation/SidebarMainItem.swift index ee6d60a9..3b39849e 100644 --- a/Yattee/Models/Navigation/SidebarMainItem.swift +++ b/Yattee/Models/Navigation/SidebarMainItem.swift @@ -181,6 +181,7 @@ enum SidebarMainItem: String, CaseIterable, Codable, Identifiable, Sendable { case .downloads: self = .downloads case .sources: self = .sources case .settings: self = .settings + case .continueWatching: self = .continueWatching } } } diff --git a/Yattee/Models/Navigation/TabBarItem.swift b/Yattee/Models/Navigation/TabBarItem.swift index 792ced6a..22181ad5 100644 --- a/Yattee/Models/Navigation/TabBarItem.swift +++ b/Yattee/Models/Navigation/TabBarItem.swift @@ -17,17 +17,18 @@ enum TabBarItem: String, CaseIterable, Codable, Identifiable, Sendable { case downloads case sources case settings + case continueWatching var id: String { rawValue } /// Default order for tab bar items. static var defaultOrder: [TabBarItem] { - [.subscriptions, .channels, .bookmarks, .playlists, .history, .sources, .downloads, .settings] + [.subscriptions, .channels, .bookmarks, .playlists, .history, .continueWatching, .sources, .downloads, .settings] } /// Default visibility (only subscriptions visible by default). static var defaultVisibility: [TabBarItem: Bool] { - [.subscriptions: false, .channels: false, .bookmarks: false, .playlists: false, .history: false, .downloads: true, .sources: true, .settings: false] + [.subscriptions: false, .channels: false, .bookmarks: false, .playlists: false, .history: false, .downloads: true, .sources: true, .settings: false, .continueWatching: false] } /// SF Symbol icon name. @@ -41,6 +42,7 @@ enum TabBarItem: String, CaseIterable, Codable, Identifiable, Sendable { case .downloads: "arrow.down.circle" case .sources: "server.rack" case .settings: "gear" + case .continueWatching: "play.circle" } } @@ -55,6 +57,7 @@ enum TabBarItem: String, CaseIterable, Codable, Identifiable, Sendable { case .downloads: String(localized: "tabBar.item.downloads") case .sources: String(localized: "tabBar.item.sources") case .settings: String(localized: "tabBar.item.settings") + case .continueWatching: String(localized: "tabBar.item.continueWatching") } } } diff --git a/Yattee/Views/Navigation/CompactTabView.swift b/Yattee/Views/Navigation/CompactTabView.swift index 4abd3361..cd828189 100644 --- a/Yattee/Views/Navigation/CompactTabView.swift +++ b/Yattee/Views/Navigation/CompactTabView.swift @@ -25,6 +25,7 @@ struct CompactTabView: View { @State private var downloadsPath = NavigationPath() @State private var sourcesPath = NavigationPath() @State private var settingsPath = NavigationPath() + @State private var continueWatchingPath = NavigationPath() // Tab selection - using String to support both fixed and dynamic tabs // Initial value is a placeholder; actual startup tab is applied in onAppear @@ -241,6 +242,8 @@ struct CompactTabView: View { sourcesPath.append(destination) case TabBarItem.settings.rawValue: settingsPath.append(destination) + case TabBarItem.continueWatching.rawValue: + continueWatchingPath.append(destination) default: homePath.append(destination) } @@ -291,6 +294,11 @@ struct CompactTabView: View { SettingsView(showCloseButton: false) .withNavigationDestinations() } + case .continueWatching: + NavigationStack(path: $continueWatchingPath) { + ContinueWatchingView() + .withNavigationDestinations() + } } } @@ -321,6 +329,8 @@ struct CompactTabView: View { sourcesPath.append(destination) case TabBarItem.settings.rawValue: settingsPath.append(destination) + case TabBarItem.continueWatching.rawValue: + continueWatchingPath.append(destination) default: // Fallback to home homePath.append(destination)