import 'package:comunic/enums/post_target.dart'; import 'package:comunic/helpers/posts_helper.dart'; import 'package:comunic/helpers/users_helper.dart'; import 'package:comunic/models/advanced_user_info.dart'; import 'package:comunic/ui/routes/other_friends_lists_route.dart'; import 'package:comunic/ui/routes/user_access_denied_route.dart'; import 'package:comunic/ui/widgets/network_image_widget.dart'; import 'package:comunic/ui/widgets/post_create_form_widget.dart'; import 'package:comunic/ui/widgets/posts_list_widget.dart'; import 'package:comunic/utils/conversations_utils.dart'; import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/ui_utils.dart'; import 'package:flutter/material.dart'; /// User page route /// /// @author Pierre HUBERT enum _PageStatus { LOADING, ERROR, READY } enum _MenuOptions { FRIENDS_LIST } class UserPageRoute extends StatefulWidget { final int userID; const UserPageRoute({Key key, @required this.userID}) : assert(userID != null), super(key: key); @override _UserPageRouteState createState() => _UserPageRouteState(); } class _UserPageRouteState extends State { // Helpers final usersHelper = UsersHelper(); final PostsHelper _postsHelper = PostsHelper(); // Objects members final double _appBarHeight = 256.0; _PageStatus _status = _PageStatus.LOADING; AdvancedUserInfo _userInfo; GlobalKey _refreshIndicatorKey = GlobalKey(); _setStatus(_PageStatus s) => setState(() => _status = s); @override void didChangeDependencies() { super.didChangeDependencies(); _getUserInfo(); } Future _getUserInfo() async { _setStatus(_PageStatus.LOADING); try { final user = await usersHelper.getAdvancedInfo(widget.userID); setState(() { _userInfo = user; }); _setStatus(_PageStatus.READY); } on GetUserAdvancedUserError catch (e) { _setStatus(_PageStatus.ERROR); if (e.cause == GetUserAdvancedInformationErrorCause.NOT_AUTHORIZED) Navigator.of(context).pushReplacement( MaterialPageRoute( builder: (c) => UserAccessDeniedRoute( userID: widget.userID, ), ), ); } } @override Widget build(BuildContext context) { if (_status == _PageStatus.LOADING) return buildLoadingPage(); if (_status == _PageStatus.ERROR) return _buildError(); return Scaffold( body: RefreshIndicator( key: _refreshIndicatorKey, child: CustomScrollView( slivers: [_buildHeader(), _buildBody()], physics: AlwaysScrollableScrollPhysics(), ), onRefresh: _getUserInfo, ), ); } /// Error card Widget _buildError() { return Scaffold( appBar: AppBar( title: Text(tr("Error")), ), body: Center( child: buildErrorCard(tr("Could not get user information!"), actions: [ FlatButton( onPressed: _getUserInfo, child: Text( tr("Retry").toUpperCase(), style: TextStyle(color: Colors.white), ), ) ])), ); } Widget _buildHeader() { return SliverAppBar( expandedHeight: _appBarHeight, floating: false, pinned: true, snap: false, flexibleSpace: FlexibleSpaceBar( title: Text(_userInfo.displayName), background: Stack( fit: StackFit.expand, children: [ NetworkImageWidget( url: _userInfo.accountImageURL, height: _appBarHeight, roundedEdges: false, ), // This gradient ensures that the toolbar icons are distinct // against the background image. const DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment(0.0, -1.0), end: Alignment(0.0, -0.4), colors: [Color(0x60000000), Color(0x00000000)], ), ), ), const DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment(0.0, 0.4), end: Alignment(0.0, 0.9), colors: [Color(0x00000000), Color(0x60000000)], ), ), ), ], ), ), actions: [ IconButton( icon: Icon( Icons.chat, ), onPressed: () { openPrivateConversation(context, widget.userID); }, ), PopupMenuButton<_MenuOptions>( itemBuilder: (c) => [ PopupMenuItem( child: Text(tr("Friends")), enabled: _userInfo != null, value: _MenuOptions.FRIENDS_LIST, ) ], onSelected: _selectedMenuOption, ), ], ); } Widget _buildBody() { return SliverList( delegate: SliverChildListDelegate( [ // Posts create form _userInfo.canPostTexts ? PostCreateFormWidget( postTarget: PostTarget.USER_PAGE, targetID: _userInfo.id, onCreated: _postCreated, ) : Container(), // Posts list PostsListWidget( getPostsList: () => _postsHelper.getUserPosts(widget.userID), showPostsTarget: false, buildListView: false, ), ], ), ); } /// Method called each time a menu option is selected void _selectedMenuOption(_MenuOptions value) { switch (value) { case _MenuOptions.FRIENDS_LIST: Navigator.of(context).push( MaterialPageRoute( builder: (c) => OtherUserFriendsListRoute( user: _userInfo, ), ), ); break; } } /// Method called once a post has been created void _postCreated() { _refreshIndicatorKey.currentState.show(); } }