diff --git a/lib/config/themes.dart b/lib/config/themes.dart index eae5f19f..f9ab67f7 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -8,6 +8,8 @@ import 'app_config.dart'; abstract class FluffyThemes { static const double columnWidth = 360.0; + static bool isColumnMode(BuildContext context) => + MediaQuery.of(context).size.width > columnWidth * 2; static const fallbackTextStyle = TextStyle(fontFamily: 'NotoSans', fontFamilyFallback: ['NotoEmoji']); diff --git a/lib/main.dart b/lib/main.dart index d4de6c2e..be4dc45e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,7 +18,6 @@ import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:universal_html/html.dart' as html; import 'package:vrouter/vrouter.dart'; -import 'widgets/layouts/wait_for_login.dart'; import 'widgets/lock_screen.dart'; import 'widgets/matrix.dart'; import 'config/themes.dart'; @@ -35,7 +34,7 @@ void main() async { Zone.current.handleUncaughtError(details.exception, details.stack); final clients = await ClientManager.getClients(); - + await Future.wait(clients.map((client) => client.init())); if (PlatformInfos.isMobile) { BackgroundPush.clientOnly(clients.first); } @@ -83,7 +82,15 @@ class _FluffyChatAppState extends State { final GlobalKey _matrix = GlobalKey(); GlobalKey _router; bool columnMode; - String _initialUrl = '/'; + String _initialUrl; + + @override + void initState() { + super.initState(); + _initialUrl = + widget.clients.any((client) => client.isLogged()) ? '/rooms' : '/home'; + } + @override Widget build(BuildContext context) { return AdaptiveTheme( @@ -142,7 +149,7 @@ class _FluffyChatAppState extends State { context: context, router: _router, clients: widget.clients, - child: WaitForInitPage(child), + child: child, ); }, ); diff --git a/lib/pages/chat_list.dart b/lib/pages/chat_list.dart index b816dae9..53e677eb 100644 --- a/lib/pages/chat_list.dart +++ b/lib/pages/chat_list.dart @@ -413,8 +413,7 @@ class ChatListController extends State { void setActiveClient(int i) => setState(() { _activeSpaceId = null; selectedRoomIds.clear(); - Matrix.of(context).activeClient = - i - (Matrix.of(context).hasComplexBundles ? 1 : 0); + Matrix.of(context).activeClient = i - (displayBundles ? 1 : 0); }); void setActiveBundle(String bundle) => setState(() { @@ -464,6 +463,10 @@ class ChatListController extends State { } } + bool get displayBundles => + Matrix.of(context).hasComplexBundles && + Matrix.of(context).accountBundles.keys.length > 1; + void resetActiveBundle() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { setState(() { diff --git a/lib/pages/views/chat_list_view.dart b/lib/pages/views/chat_list_view.dart index eb4b88c7..9cd1fc75 100644 --- a/lib/pages/views/chat_list_view.dart +++ b/lib/pages/views/chat_list_view.dart @@ -1,5 +1,6 @@ import 'dart:math'; import 'package:async/async.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:flutter/widgets.dart'; @@ -54,7 +55,7 @@ class ChatListView extends StatelessWidget { ); }).toList(); - if (Matrix.of(context).hasComplexBundles) { + if (controller.displayBundles) { items.insert( 0, BottomNavigationBarItem( @@ -292,13 +293,15 @@ class ChatListView extends StatelessWidget { scrollDirection: Axis.horizontal, child: SizedBox( width: max( - MediaQuery.of(context).size.width, + FluffyThemes.isColumnMode(context) + ? FluffyThemes.columnWidth + : MediaQuery.of(context).size.width, Matrix.of(context).widget.clients.length * 84.0, ), child: BottomNavigationBar( onTap: controller.setActiveClient, currentIndex: Matrix.of(context).activeClient + - (Matrix.of(context).hasComplexBundles ? 1 : 0), + (controller.displayBundles ? 1 : 0), showUnselectedLabels: false, showSelectedLabels: true, type: BottomNavigationBarType.shifting, diff --git a/lib/widgets/layouts/loading_view.dart b/lib/widgets/layouts/loading_view.dart index defa8064..9c5f2712 100644 --- a/lib/widgets/layouts/loading_view.dart +++ b/lib/widgets/layouts/loading_view.dart @@ -7,10 +7,16 @@ import 'package:flutter/material.dart'; class LoadingView extends StatelessWidget { @override Widget build(BuildContext context) { - if (Matrix.of(context).client.loginState != null) { + if (Matrix.of(context) + .widget + .clients + .every((client) => client.loginState != null)) { WidgetsBinding.instance.addPostFrameCallback( (_) => VRouter.of(context).to( - Matrix.of(context).client.loginState == LoginState.loggedIn + Matrix.of(context) + .widget + .clients + .any((client) => client.loginState == LoginState.loggedIn) ? '/rooms' : '/home', queryParameters: VRouter.of(context).queryParameters, diff --git a/lib/widgets/layouts/one_page_card.dart b/lib/widgets/layouts/one_page_card.dart index 22f07763..121f20c2 100644 --- a/lib/widgets/layouts/one_page_card.dart +++ b/lib/widgets/layouts/one_page_card.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; class OnePageCard extends StatelessWidget { @@ -12,7 +13,9 @@ class OnePageCard extends StatelessWidget { static num breakpoint = FluffyThemes.columnWidth * 2; @override Widget build(BuildContext context) { - return MediaQuery.of(context).size.width <= breakpoint + final displayInCard = MediaQuery.of(context).size.width <= breakpoint && + Matrix.of(context).client.isLogged(); + return !displayInCard ? child : Container( decoration: BoxDecoration( diff --git a/lib/widgets/layouts/wait_for_login.dart b/lib/widgets/layouts/wait_for_login.dart deleted file mode 100644 index 1193cb76..00000000 --- a/lib/widgets/layouts/wait_for_login.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:fluffychat/pages/views/empty_page_view.dart'; -import 'package:matrix/matrix.dart'; -import 'package:flutter/material.dart'; - -import '../matrix.dart'; - -class WaitForInitPage extends StatelessWidget { - final Widget page; - const WaitForInitPage(this.page, {Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - if (Matrix.of(context).client.loginState == null) { - return StreamBuilder( - stream: Matrix.of(context).client.onLoginStateChanged.stream, - builder: (context, snapshot) { - if (!snapshot.hasData) { - return EmptyPage(loading: true); - } - return page; - }); - } - return page; - } -} diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 82d9bece..89979de9 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -145,7 +145,6 @@ class MatrixState extends State with WidgetsBindingObserver { void _initWithStore() async { try { - await Future.wait(widget.clients.map((client) => client.init())); if (client.isLogged()) { // TODO: Figure out how this works in multi account final statusMsg = await store.getItem(SettingKeys.ownStatusMessage);