import 'package:comunic/helpers/conversations_helper.dart'; import 'package:comunic/models/conversation.dart'; import 'package:comunic/ui/routes/main_route/main_route.dart'; import 'package:comunic/ui/routes/update_conversation_route.dart'; import 'package:comunic/ui/screens/conversation_screen.dart'; import 'package:comunic/ui/widgets/comunic_back_button_widget.dart'; import 'package:comunic/ui/widgets/safe_state.dart'; import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/ui_utils.dart'; import 'package:flutter/material.dart'; /// Single conversation route /// /// @author Pierre HUBERT class ConversationRoute extends StatefulWidget { final int conversationID; const ConversationRoute({ Key key, @required this.conversationID, }) : assert(conversationID != null), super(key: key); @override State createState() => _ConversationRouteState(); } class _ConversationRouteState extends SafeState { final ConversationsHelper _conversationsHelper = ConversationsHelper(); Conversation _conversation; String _conversationName; bool _error = false; setError(bool err) => setState(() => _error = err); @override void didChangeDependencies() { super.didChangeDependencies(); _loadConversation(); } Future _loadConversation() async { setError(false); try { _conversation = await _conversationsHelper .getSingle(widget.conversationID, force: true); if (_conversation == null) return setError(true); final conversationName = await ConversationsHelper.getConversationNameAsync(_conversation); if (!this.mounted) return null; setState(() => _conversationName = conversationName); } catch (e, s) { print("Failed to get conversation name! $e => $s"); setError(true); } } void _openSettings() { MainController.of(context).push( UpdateConversationRoute( conversationID: widget.conversationID, ), hideNavBar: true); } Widget _buildRouteBody() { //Handle errors if (_error != null && _error) return buildErrorCard( tr("Could not get conversation information!"), actions: [ FlatButton( onPressed: _loadConversation, child: Text( tr("Try again").toUpperCase(), style: TextStyle( color: Colors.white, ), ), ), ], ); if (_conversationName == null || _conversation == null) return buildCenteredProgressBar(); return ConversationScreen( conversationID: widget.conversationID, ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: isTablet(context) ? null : ComunicBackButton(), title: Text( _conversationName == null ? tr("Loading") : _conversationName, ), actions: [ // Start call (if possible) _conversation == null || _conversation.callCapabilities == CallCapabilities.NONE ? Container() : IconButton( icon: Icon(Icons.phone), onPressed: () => MainController.of(context) .startCall(widget.conversationID), ), // Edit conversation settings IconButton( icon: Icon(Icons.settings), onPressed: _openSettings, ) ], ), body: _buildRouteBody(), ); } }