1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-23 05:19:22 +00:00
comunicmobile/lib/ui/routes/conversation_route.dart

126 lines
3.4 KiB
Dart

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/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<StatefulWidget> createState() => _ConversationRouteState();
}
class _ConversationRouteState extends State<ConversationRoute> {
final ConversationsHelper _conversationsHelper = ConversationsHelper();
Conversation _conversation;
String _conversationName;
bool _error = false;
setError(bool err) => setState(() => _error = err);
@override
void didChangeDependencies() {
super.didChangeDependencies();
_loadConversation();
}
Future<void> _loadConversation() async {
setError(false);
_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;
if (conversationName == null) return setError(true);
setState(() {
_conversationName = conversationName;
});
}
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: <Widget>[
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: <Widget>[
// 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(),
);
}
}