From 62f2f07f3867c3bacb5b9d23ee5f865c84f4beee Mon Sep 17 00:00:00 2001 From: Ilyas Hallak Date: Wed, 1 Oct 2025 21:55:15 +0200 Subject: [PATCH] feat: Modernize PhoneTabView with iOS 18+ Tab API - Add support for new SwiftUI Tab API (iOS 18+) alongside legacy tabItem - Implement mainTabsContentNew and moreTabContentNew with modern Tab() syntax - Maintain backward compatibility with iOS versions < 18 - Use @available annotations for version-specific implementations - Replace deprecated .tabItem with cleaner Tab(..., value:) approach - Keep all existing functionality including badges and navigation --- readeck/UI/Menu/PhoneTabView.swift | 45 ++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/readeck/UI/Menu/PhoneTabView.swift b/readeck/UI/Menu/PhoneTabView.swift index 9c4142a..9da7811 100644 --- a/readeck/UI/Menu/PhoneTabView.swift +++ b/readeck/UI/Menu/PhoneTabView.swift @@ -20,18 +20,53 @@ struct PhoneTabView: View { var body: some View { NavigationStack { GlobalPlayerContainerView { - TabView(selection: $selectedTabIndex) { - mainTabsContent - moreTabContent + if #available(iOS 18.0, *) { + TabView(selection: $selectedTabIndex) { + mainTabsContentNew + moreTabContentNew + } + .accentColor(.accentColor) + } else { + TabView(selection: $selectedTabIndex) { + mainTabsContent + moreTabContent + } + .accentColor(.accentColor) } - .accentColor(.accentColor) } } } + // MARK: - Tab Content (iOS 18+) + @available(iOS 18.0, *) + @ViewBuilder + private var mainTabsContentNew: some View { + ForEach(Array(mainTabs.enumerated()), id: \.element) { idx, tab in + Tab(tab.label, systemImage: tab.systemImage, value: idx) { + tabView(for: tab) + } + } + } - // MARK: - Tab Content + @available(iOS 18.0, *) + @ViewBuilder + private var moreTabContentNew: some View { + Tab("More", systemImage: "ellipsis", value: mainTabs.count) { + VStack(spacing: 0) { + moreTabsList + moreTabsFooter + } + .onAppear { + if selectedTabIndex == mainTabs.count && selectedMoreTab != nil { + selectedMoreTab = nil + } + } + } + .badge(offlineBookmarksViewModel.state.localBookmarkCount > 0 ? offlineBookmarksViewModel.state.localBookmarkCount : 0) + } + + // MARK: - Tab Content (Legacy) @ViewBuilder private var mainTabsContent: some View {