diff --git a/packages/app/pubspec.lock b/packages/app/pubspec.lock index a7eb10d4..0d424e70 100644 --- a/packages/app/pubspec.lock +++ b/packages/app/pubspec.lock @@ -101,10 +101,10 @@ packages: dependency: transitive description: name: cookie_jar - sha256: "823fd13d22c5cf0c846e8a31c9b276f768f423cca134990c22c33045462f8ef9" + sha256: "1024f3a52bee181fc8f10f4a359085471587d7406323090a53a7171bc0aa5c37" url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "4.0.5" cross_file: dependency: transitive description: @@ -244,6 +244,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_adaptive_scaffold: + dependency: transitive + description: + name: flutter_adaptive_scaffold + sha256: "01ee32a8f64b68f15436b5e59124e79df9c46bbffe7bbb6edb8ae93d879511fb" + url: "https://pub.dev" + source: hosted + version: "0.1.5" flutter_cache_manager: dependency: transitive description: diff --git a/packages/neon/neon/lib/neon.dart b/packages/neon/neon/lib/neon.dart index 048c8f32..ac029a1c 100644 --- a/packages/neon/neon/lib/neon.dart +++ b/packages/neon/neon/lib/neon.dart @@ -13,6 +13,7 @@ import 'package:filesize/filesize.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_file_dialog/flutter_file_dialog.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; @@ -27,6 +28,7 @@ import 'package:neon/src/models/account.dart'; import 'package:neon/src/models/push_notification.dart'; import 'package:neon/src/router.dart'; import 'package:neon/src/widgets/app_bar.dart'; +import 'package:neon/src/widgets/app_tab_bar.dart'; import 'package:neon/src/widgets/drawer.dart'; import 'package:neon/src/widgets/drawer_destination.dart'; import 'package:nextcloud/nextcloud.dart'; diff --git a/packages/neon/neon/lib/src/pages/home.dart b/packages/neon/neon/lib/src/pages/home.dart index 0994b71b..598005a7 100644 --- a/packages/neon/neon/lib/src/pages/home.dart +++ b/packages/neon/neon/lib/src/pages/home.dart @@ -15,7 +15,6 @@ class _HomePageState extends State { final _scaffoldKey = GlobalKey(); late Account _account; - late GlobalOptions _globalOptions; late AccountsBloc _accountsBloc; late AppsBloc _appsBloc; late StreamSubscription _versionCheckSubscription; @@ -23,7 +22,6 @@ class _HomePageState extends State { @override void initState() { super.initState(); - _globalOptions = Provider.of(context, listen: false); _accountsBloc = Provider.of(context, listen: false); _account = _accountsBloc.activeAccount.value!; _appsBloc = _accountsBloc.activeAppsBloc; @@ -101,9 +99,6 @@ class _HomePageState extends State { @override Widget build(final BuildContext context) { - const drawer = NeonDrawer(); - const appBar = NeonAppBar(); - final appView = ResultBuilder>.behaviorSubject( stream: _appsBloc.appImplementations, builder: (final context, final appImplementations) { @@ -127,38 +122,62 @@ class _HomePageState extends State { return const SizedBox(); } - return activeAppIDSnapshot.requireData.page; + final view = activeAppIDSnapshot.requireData.page; + + final topNavigation = SlotLayout( + config: { + Breakpoints.standard: SlotLayout.from( + key: const Key('Standard topNavigation'), + builder: (final _) => const SizedBox( + height: kToolbarHeight, + child: NeonAppBar(), + ), + ), + Breakpoints.large: SlotLayout.from( + key: const Key('Large topNavigation'), + builder: (final _) => const NeonTabBar(), + ), + if (view is AdaptiveLayout) ...{ + ...?view.topNavigation?.config, + }, + }, + ); + + if (view is! AdaptiveLayout) { + final body = SlotLayout( + config: { + Breakpoints.standard: SlotLayout.from( + key: const Key('Standard body'), + builder: (final _) => view, + ), + }, + ); + return AdaptiveLayout( + topNavigation: topNavigation, + body: body, + ); + } + + return AdaptiveLayout( + topNavigation: topNavigation, + primaryNavigation: view.primaryNavigation, + secondaryNavigation: view.secondaryNavigation, + bottomNavigation: view.bottomNavigation, + body: view.body, + secondaryBody: view.secondaryBody, + bodyRatio: view.bodyRatio, + internalAnimations: view.internalAnimations, + bodyOrientation: view.bodyOrientation, + ); }, ); }, ); - final body = OptionBuilder( - option: _globalOptions.navigationMode, - builder: (final context, final navigationMode) { - final drawerAlwaysVisible = navigationMode == NavigationMode.drawerAlwaysVisible; - - final body = Scaffold( - key: _scaffoldKey, - resizeToAvoidBottomInset: false, - drawer: !drawerAlwaysVisible ? drawer : null, - appBar: appBar, - body: appView, - ); - - if (drawerAlwaysVisible) { - return Row( - children: [ - drawer, - Expanded( - child: body, - ), - ], - ); - } - - return body; - }, + final body = Scaffold( + key: _scaffoldKey, + drawer: const NeonDrawer(), + body: appView, ); return WillPopScope( diff --git a/packages/neon/neon/lib/src/utils/app_implementation.dart b/packages/neon/neon/lib/src/utils/app_implementation.dart index 8cc14e47..f8c18724 100644 --- a/packages/neon/neon/lib/src/utils/app_implementation.dart +++ b/packages/neon/neon/lib/src/utils/app_implementation.dart @@ -39,6 +39,10 @@ abstract class AppImplementation? getUnreadCounter(final T bloc) => null; + /// Main view of the app. + /// + /// It is encuraged to use an [AdaptiveLayout] to adapt the page to different + /// screen sizes and layouts. Widget get page; NeonNavigationDestination destination(final BuildContext context) { diff --git a/packages/neon/neon/pubspec.yaml b/packages/neon/neon/pubspec.yaml index e6b18cd3..31ace631 100644 --- a/packages/neon/neon/pubspec.yaml +++ b/packages/neon/neon/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: filesize: ^2.0.1 flutter: sdk: flutter + flutter_adaptive_scaffold: ^0.1.5 flutter_cache_manager: ^3.3.0 flutter_file_dialog: ^3.0.0 flutter_local_notifications: ^14.0.0+2