import 'package:comunic/helpers/account_helper.dart'; import 'package:comunic/ui/routes/account_settings/account_settings_route.dart'; import 'package:comunic/ui/routes/app_settings_route.dart'; import 'package:comunic/ui/routes/conversation_route.dart'; import 'package:comunic/ui/routes/main_route/main_route.dart'; import 'package:comunic/ui/screens/call_screen.dart'; import 'package:comunic/ui/screens/conversations_list_screen.dart'; import 'package:comunic/ui/screens/friends_list_screen.dart'; import 'package:comunic/ui/screens/group_screen.dart'; import 'package:comunic/ui/screens/groups_list_screen.dart'; import 'package:comunic/ui/screens/newest_posts.dart'; import 'package:comunic/ui/screens/notifications_screen.dart'; import 'package:comunic/ui/screens/other_friends_lists_screen.dart'; import 'package:comunic/ui/screens/search_screen.dart'; import 'package:comunic/ui/screens/user_access_denied_screen.dart'; import 'package:comunic/ui/screens/user_page_screen.dart'; import 'package:comunic/ui/widgets/mobile_mode/mobile_navbar_widget.dart'; import 'package:comunic/utils/account_utils.dart'; import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/ui_utils.dart'; import 'package:flutter/material.dart'; import '../login_route.dart'; /// Main route of the application /// /// @author Pierre HUBERT class SmartphoneMainRoute extends StatefulWidget implements MainRoute { @override State createState() => _MainRouteState(); } class CurrPage { final BarCallbackActions action; final Map args; final bool hideNavBar; const CurrPage( this.action, { this.args, this.hideNavBar = false, }) : assert(action != null), assert(hideNavBar != null); @override String toString() => "CurrPage {\n\taction: " + this.action.toString() + "\n\targs: " + this.args.toString() + "\n}"; } /// Private implementation of HomeController class _MainRouteState extends State implements MainController { CurrPage get _currTab => history.last; List history = List(); /// Change currently visible tab void _pushPage(CurrPage newPage) { setState(() { history.add(newPage); }); } /// Pop the page void popPage() { if (history.length > 1) history.removeLast(); setState(() {}); } /// Allows to go to previous tab Future _willPop() async { if (history.length == 1) return true; popPage(); return false; } /// Handles a new tab being tapped void _onTap(BarCallbackActions action) { /// Check more quick actions switch (action) { /// Open current user page case BarCallbackActions.OPEN_MY_PAGE: _openCurrentUserPage(); break; /// Open app settings page case BarCallbackActions.OPEN_APP_SETTINGS: _openAppSettings(); break; case BarCallbackActions.OPEN_ACCOUNT_SETTINGS: _openAccountsSettings(); break; /// Logout user case BarCallbackActions.ACTION_LOGOUT: _logoutRequested(); break; default: _pushPage(CurrPage(action)); } } @override void initState() { super.initState(); // Default page: conversations list _pushPage(CurrPage(BarCallbackActions.OPEN_NOTIFICATIONS)); } /// Build the body of the application Widget _buildBody(BuildContext context) { switch (_currTab.action) { case BarCallbackActions.OPEN_CUSTOM_WIDGET: return _currTab.args["widget"]; case BarCallbackActions.OPEN_NOTIFICATIONS: return NotificationsScreen(); case BarCallbackActions.OPEN_CONVERSATIONS: return ConversationsListScreen(); case BarCallbackActions.OPEN_NEWEST_POSTS: return NewestPostsScreen(); case BarCallbackActions.OPEN_FRIENDS: return FriendsListScreen(); case BarCallbackActions.OPEN_USER_PAGE: return UserPageScreen(userID: _currTab.args["userID"]); case BarCallbackActions.OPEN_USER_ACCESS_DENIED_PAGE: return UserAccessDeniedScreen(userID: _currTab.args["userID"]); case BarCallbackActions.OPEN_SEARCH_PAGE: return SearchScreen(); case BarCallbackActions.OPEN_GROUPS: return GroupsListScreen(); case BarCallbackActions.OPEN_GROUP_PAGE: return GroupPageScreen(groupID: _currTab.args["groupID"]); case BarCallbackActions.OPEN_USER_FRIENDS_LIST: return OtherUserFriendsListScreen( userID: _currTab.args["userID"], ); case BarCallbackActions.OPEN_CONVERSATION: return ConversationRoute( conversationID: _currTab.args["convID"], ); default: throw "Invalid tab : " + _currTab.toString(); } } @override Widget build(BuildContext context) { return Container( color: Colors.blueAccent, child: SafeArea( // Avoid OS areas child: WillPopScope( onWillPop: _willPop, child: Scaffold( appBar: _currTab.hideNavBar ? null : ComunicMobileAppBar( onTap: _onTap, selectedAction: _currTab.action, ), body: SafeArea( child: _buildBody(context), ), ), ), ), ); } /// Open current user page Future _openCurrentUserPage() async { this.openUserPage(userID()); } void _openAppSettings() { Navigator.of(context) .push(MaterialPageRoute(builder: (c) => AppSettingsRoute())); } void _openAccountsSettings() { Navigator.of(context) .push(MaterialPageRoute(builder: (c) => AccountSettingsRoute())); } /// Handle logout requests from user Future _logoutRequested() async { if (!await showConfirmDialog( context: context, message: tr("Do you really want to sign out from the application ?"), title: tr("Sign out"))) return; await AccountHelper().signOut(); Navigator.pushReplacement(context, MaterialPageRoute(builder: (c) { return LoginRoute(); })); } @override void openGroup(int groupID) { _pushPage(CurrPage(BarCallbackActions.OPEN_GROUP_PAGE, args: {"groupID": groupID})); } @override void openUserPage(int userID) { _pushPage( CurrPage(BarCallbackActions.OPEN_USER_PAGE, args: {"userID": userID})); } @override void openUserAccessDeniedPage(int userID) { _pushPage(CurrPage(BarCallbackActions.OPEN_USER_ACCESS_DENIED_PAGE, args: {"userID": userID})); } @override void openUserFriendsList(int userID) { _pushPage(CurrPage(BarCallbackActions.OPEN_USER_FRIENDS_LIST, args: {"userID": userID})); } @override void push(Widget w, {bool hideNavBar = false}) { _pushPage(CurrPage( BarCallbackActions.OPEN_CUSTOM_WIDGET, args: {"widget": w}, hideNavBar: hideNavBar, )); } @override void openConversation(int convID) { _pushPage(CurrPage( BarCallbackActions.OPEN_CONVERSATION, args: {"convID": convID}, hideNavBar: true, )); } @override void startCall(int convID) { push(CallScreen(convID: convID), hideNavBar: true); } }