fix(ios): restore Compose tablet settings

This commit is contained in:
tapframe 2026-07-10 17:01:54 +05:30
parent d8b3370faa
commit 802a31fdf9
3 changed files with 46 additions and 7 deletions

View file

@ -394,6 +394,8 @@ fun App(
initialTab: AppScreenTab = AppScreenTab.Home,
initialRoute: AppRoute = TabsRoute,
useNativeNavigation: Boolean = false,
useNativeTabBar: Boolean = false,
useTabletFloatingTabBar: Boolean = false,
ownsAppRuntime: Boolean = true,
bypassAppGate: Boolean = false,
onNavigate: ((AppRoute, launchSingleTop: Boolean) -> Unit)? = null,
@ -425,6 +427,8 @@ fun App(
initialTab = initialTab,
initialRoute = initialRoute,
useNativeNavigation = useNativeNavigation,
useNativeTabBar = useNativeTabBar,
useTabletFloatingTabBar = useTabletFloatingTabBar,
ownsAppRuntime = false,
onNavigate = onNavigate,
onGoBack = onGoBack,
@ -688,6 +692,8 @@ fun App(
initialTab = initialTab,
initialRoute = initialRoute,
useNativeNavigation = useNativeNavigation,
useNativeTabBar = useNativeTabBar,
useTabletFloatingTabBar = useTabletFloatingTabBar,
ownsAppRuntime = ownsAppRuntime,
onNavigate = onNavigate,
onGoBack = onGoBack,
@ -716,6 +722,8 @@ private fun MainAppContent(
initialTab: AppScreenTab = AppScreenTab.Home,
initialRoute: AppRoute = TabsRoute,
useNativeNavigation: Boolean = false,
useNativeTabBar: Boolean = false,
useTabletFloatingTabBar: Boolean = false,
ownsAppRuntime: Boolean = true,
onNavigate: ((AppRoute, launchSingleTop: Boolean) -> Unit)? = null,
onGoBack: (() -> Unit)? = null,
@ -1762,9 +1770,12 @@ private fun MainAppContent(
)
BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
val isTabletLayout = maxWidth >= 768.dp
val useNativeBottomTabs = useNativeNavigation ||
(liquidGlassNativeTabBarSupported && liquidGlassNativeTabBarEnabled && initialHomeReady)
val isTabletLayout = useTabletFloatingTabBar || maxWidth >= 768.dp
val useNativeBottomTabs = if (useNativeNavigation) {
useNativeTabBar
} else {
liquidGlassNativeTabBarSupported && liquidGlassNativeTabBarEnabled && initialHomeReady
}
val nativeTabSafeBottomPadding = nuvioBottomNavigationBarInsets()
.asPaddingValues()
.calculateBottomPadding()
@ -1877,7 +1888,7 @@ private fun MainAppContent(
}
},
onConnectCloudClick = {
if (useNativeNavigation) {
if (useNativeNavigation && !isTabletLayout) {
activateTab(AppScreenTab.Settings)
navController.navigate(
SettingsPageRoute(
@ -1893,7 +1904,7 @@ private fun MainAppContent(
onContinueWatchingClick = onContinueWatchingClick,
onContinueWatchingLongPress = onContinueWatchingLongPress,
onSwitchProfile = onSwitchProfile,
onSettingsPageClick = if (useNativeNavigation) {
onSettingsPageClick = if (useNativeNavigation && !isTabletLayout) {
{ pageName, title ->
navController.navigate(SettingsPageRoute(pageName, title))
}

View file

@ -16,6 +16,8 @@ fun MainViewController(): UIViewController = nuvioComposeViewController {
@Suppress("unused")
fun MainViewController(
initialTabName: String,
useNativeTabBar: Boolean,
useTabletFloatingTabBar: Boolean,
onNavigate: (AppRoute, Boolean) -> Unit,
onGoBack: () -> Unit,
onReplace: (AppRoute) -> Unit,
@ -28,6 +30,8 @@ fun MainViewController(
App(
initialTab = initialTab,
useNativeNavigation = true,
useNativeTabBar = useNativeTabBar,
useTabletFloatingTabBar = useTabletFloatingTabBar,
ownsAppRuntime = initialTab == AppScreenTab.Home,
bypassAppGate = initialTab != AppScreenTab.Home,
onNavigate = onNavigate,

View file

@ -529,12 +529,16 @@ final class AppNavigationCoordinator: ObservableObject {
@available(iOS 16.0, *)
struct NativeNavComposeView: UIViewControllerRepresentable {
let tab: NuvioAppTab
let usesNativeTabBar: Bool
let usesTabletFloatingTabBar: Bool
let coordinator: TabNavigationCoordinator
let appCoordinator: AppNavigationCoordinator
func makeUIViewController(context: Context) -> UIViewController {
let controller = MainViewControllerKt.MainViewController(
initialTabName: tab.rawValue,
useNativeTabBar: usesNativeTabBar,
useTabletFloatingTabBar: usesTabletFloatingTabBar,
onNavigate: { route, launchSingleTop in
appCoordinator.push(
route,
@ -607,6 +611,8 @@ struct DetailComposeView: UIViewControllerRepresentable {
@available(iOS 16.0, *)
struct TabContentView: View {
let tab: NuvioAppTab
let usesNativeTabBar: Bool
let usesTabletFloatingTabBar: Bool
@ObservedObject var coordinator: TabNavigationCoordinator
@ObservedObject var appCoordinator: AppNavigationCoordinator
@ -619,6 +625,8 @@ struct TabContentView: View {
) {
NativeNavComposeView(
tab: tab,
usesNativeTabBar: usesNativeTabBar,
usesTabletFloatingTabBar: usesTabletFloatingTabBar,
coordinator: coordinator,
appCoordinator: appCoordinator
)
@ -646,7 +654,7 @@ struct TabContentView: View {
// stack. Applying it here keeps the authentication/profile gate truly
// full-screen on iOS 26, where a modifier on TabView itself is ignored.
.toolbar(
appCoordinator.isAppReady && coordinator.path.isEmpty
usesNativeTabBar && appCoordinator.isAppReady && coordinator.path.isEmpty
? Visibility.visible
: Visibility.hidden,
for: .tabBar
@ -728,6 +736,20 @@ struct NativeNavContentView: View {
@StateObject private var appCoordinator = AppNavigationCoordinator()
@StateObject private var iconStore = NativeTabIconStore()
private var usesNativeTabBar: Bool {
guard UIDevice.current.userInterfaceIdiom == .phone else {
return false
}
if #available(iOS 26.0, *) {
return true
}
return false
}
private var usesTabletFloatingTabBar: Bool {
UIDevice.current.userInterfaceIdiom == .pad
}
private var tabs: some View {
TabView(
selection: Binding(
@ -746,6 +768,8 @@ struct NativeNavContentView: View {
ForEach(NuvioAppTab.allCases, id: \.self) { tab in
TabContentView(
tab: tab,
usesNativeTabBar: usesNativeTabBar,
usesTabletFloatingTabBar: usesTabletFloatingTabBar,
coordinator: appCoordinator.coordinator(for: tab),
appCoordinator: appCoordinator
)
@ -773,7 +797,7 @@ struct NativeNavContentView: View {
@ViewBuilder
var body: some View {
if #available(iOS 26.0, *) {
if #available(iOS 26.0, *), usesNativeTabBar {
tabs.tabBarMinimizeBehavior(.automatic)
} else {
tabs