fix: Bottombar design

This commit is contained in:
Christian Pauly 2021-09-19 11:50:31 +02:00
parent 31815a2fc2
commit 8225c00e02
8 changed files with 36 additions and 38 deletions

View File

@ -8,6 +8,8 @@ import 'app_config.dart';
abstract class FluffyThemes { abstract class FluffyThemes {
static const double columnWidth = 360.0; static const double columnWidth = 360.0;
static bool isColumnMode(BuildContext context) =>
MediaQuery.of(context).size.width > columnWidth * 2;
static const fallbackTextStyle = static const fallbackTextStyle =
TextStyle(fontFamily: 'NotoSans', fontFamilyFallback: ['NotoEmoji']); TextStyle(fontFamily: 'NotoSans', fontFamilyFallback: ['NotoEmoji']);

View File

@ -18,7 +18,6 @@ import 'package:future_loading_dialog/future_loading_dialog.dart';
import 'package:universal_html/html.dart' as html; import 'package:universal_html/html.dart' as html;
import 'package:vrouter/vrouter.dart'; import 'package:vrouter/vrouter.dart';
import 'widgets/layouts/wait_for_login.dart';
import 'widgets/lock_screen.dart'; import 'widgets/lock_screen.dart';
import 'widgets/matrix.dart'; import 'widgets/matrix.dart';
import 'config/themes.dart'; import 'config/themes.dart';
@ -35,7 +34,7 @@ void main() async {
Zone.current.handleUncaughtError(details.exception, details.stack); Zone.current.handleUncaughtError(details.exception, details.stack);
final clients = await ClientManager.getClients(); final clients = await ClientManager.getClients();
await Future.wait(clients.map((client) => client.init()));
if (PlatformInfos.isMobile) { if (PlatformInfos.isMobile) {
BackgroundPush.clientOnly(clients.first); BackgroundPush.clientOnly(clients.first);
} }
@ -83,7 +82,15 @@ class _FluffyChatAppState extends State<FluffyChatApp> {
final GlobalKey<MatrixState> _matrix = GlobalKey<MatrixState>(); final GlobalKey<MatrixState> _matrix = GlobalKey<MatrixState>();
GlobalKey<VRouterState> _router; GlobalKey<VRouterState> _router;
bool columnMode; bool columnMode;
String _initialUrl = '/'; String _initialUrl;
@override
void initState() {
super.initState();
_initialUrl =
widget.clients.any((client) => client.isLogged()) ? '/rooms' : '/home';
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AdaptiveTheme( return AdaptiveTheme(
@ -142,7 +149,7 @@ class _FluffyChatAppState extends State<FluffyChatApp> {
context: context, context: context,
router: _router, router: _router,
clients: widget.clients, clients: widget.clients,
child: WaitForInitPage(child), child: child,
); );
}, },
); );

View File

@ -413,8 +413,7 @@ class ChatListController extends State<ChatList> {
void setActiveClient(int i) => setState(() { void setActiveClient(int i) => setState(() {
_activeSpaceId = null; _activeSpaceId = null;
selectedRoomIds.clear(); selectedRoomIds.clear();
Matrix.of(context).activeClient = Matrix.of(context).activeClient = i - (displayBundles ? 1 : 0);
i - (Matrix.of(context).hasComplexBundles ? 1 : 0);
}); });
void setActiveBundle(String bundle) => setState(() { void setActiveBundle(String bundle) => setState(() {
@ -464,6 +463,10 @@ class ChatListController extends State<ChatList> {
} }
} }
bool get displayBundles =>
Matrix.of(context).hasComplexBundles &&
Matrix.of(context).accountBundles.keys.length > 1;
void resetActiveBundle() { void resetActiveBundle() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
setState(() { setState(() {

View File

@ -1,5 +1,6 @@
import 'dart:math'; import 'dart:math';
import 'package:async/async.dart'; import 'package:async/async.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -54,7 +55,7 @@ class ChatListView extends StatelessWidget {
); );
}).toList(); }).toList();
if (Matrix.of(context).hasComplexBundles) { if (controller.displayBundles) {
items.insert( items.insert(
0, 0,
BottomNavigationBarItem( BottomNavigationBarItem(
@ -292,13 +293,15 @@ class ChatListView extends StatelessWidget {
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
child: SizedBox( child: SizedBox(
width: max( 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, Matrix.of(context).widget.clients.length * 84.0,
), ),
child: BottomNavigationBar( child: BottomNavigationBar(
onTap: controller.setActiveClient, onTap: controller.setActiveClient,
currentIndex: Matrix.of(context).activeClient + currentIndex: Matrix.of(context).activeClient +
(Matrix.of(context).hasComplexBundles ? 1 : 0), (controller.displayBundles ? 1 : 0),
showUnselectedLabels: false, showUnselectedLabels: false,
showSelectedLabels: true, showSelectedLabels: true,
type: BottomNavigationBarType.shifting, type: BottomNavigationBarType.shifting,

View File

@ -7,10 +7,16 @@ import 'package:flutter/material.dart';
class LoadingView extends StatelessWidget { class LoadingView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { 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( WidgetsBinding.instance.addPostFrameCallback(
(_) => VRouter.of(context).to( (_) => VRouter.of(context).to(
Matrix.of(context).client.loginState == LoginState.loggedIn Matrix.of(context)
.widget
.clients
.any((client) => client.loginState == LoginState.loggedIn)
? '/rooms' ? '/rooms'
: '/home', : '/home',
queryParameters: VRouter.of(context).queryParameters, queryParameters: VRouter.of(context).queryParameters,

View File

@ -1,6 +1,7 @@
import 'dart:math'; import 'dart:math';
import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class OnePageCard extends StatelessWidget { class OnePageCard extends StatelessWidget {
@ -12,7 +13,9 @@ class OnePageCard extends StatelessWidget {
static num breakpoint = FluffyThemes.columnWidth * 2; static num breakpoint = FluffyThemes.columnWidth * 2;
@override @override
Widget build(BuildContext context) { 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 ? child
: Container( : Container(
decoration: BoxDecoration( decoration: BoxDecoration(

View File

@ -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<LoginState>(
stream: Matrix.of(context).client.onLoginStateChanged.stream,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return EmptyPage(loading: true);
}
return page;
});
}
return page;
}
}

View File

@ -145,7 +145,6 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
void _initWithStore() async { void _initWithStore() async {
try { try {
await Future.wait(widget.clients.map((client) => client.init()));
if (client.isLogged()) { if (client.isLogged()) {
// TODO: Figure out how this works in multi account // TODO: Figure out how this works in multi account
final statusMsg = await store.getItem(SettingKeys.ownStatusMessage); final statusMsg = await store.getItem(SettingKeys.ownStatusMessage);