mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-30 00:36:28 +00:00
85 lines
2.3 KiB
Dart
85 lines
2.3 KiB
Dart
import 'package:comunic/helpers/events_helper.dart';
|
|
import 'package:comunic/helpers/server_config_helper.dart';
|
|
import 'package:comunic/helpers/users_helper.dart';
|
|
import 'package:comunic/lists/users_list.dart';
|
|
import 'package:comunic/ui/widgets/safe_state.dart';
|
|
import 'package:comunic/utils/intl_utils.dart';
|
|
import 'package:comunic/utils/log_utils.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
/// User writing a message in a conversation notifier
|
|
///
|
|
/// @author Pierre Hubert
|
|
|
|
class UserWritingInConvNotifier extends StatefulWidget {
|
|
final int convID;
|
|
|
|
const UserWritingInConvNotifier({Key key, @required this.convID})
|
|
: assert(convID != null),
|
|
super(key: key);
|
|
|
|
@override
|
|
_UserWritingInConvNotifierState createState() =>
|
|
_UserWritingInConvNotifierState();
|
|
}
|
|
|
|
class _UserWritingInConvNotifierState
|
|
extends SafeState<UserWritingInConvNotifier> {
|
|
final _usersInfo = UsersList();
|
|
|
|
final _list = [];
|
|
|
|
@override
|
|
void initState() {
|
|
this.listen<WritingMessageInConversationEvent>((ev) async {
|
|
try {
|
|
if (ev.convID != widget.convID) return;
|
|
|
|
if (!_usersInfo.hasUser(ev.userID))
|
|
_usersInfo.add(await UsersHelper().getSingleWithThrow(ev.userID));
|
|
|
|
_handleEvent(ev.userID);
|
|
} catch (e, s) {
|
|
logError(e, s);
|
|
}
|
|
});
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) => Padding(
|
|
padding: EdgeInsets.only(left: 5, right: 5),
|
|
child: Align(
|
|
alignment: Alignment.centerLeft,
|
|
child: Text(
|
|
writingText,
|
|
style: TextStyle(fontSize: 10),
|
|
textAlign: TextAlign.justify,
|
|
),
|
|
),
|
|
);
|
|
|
|
String get writingText {
|
|
if (_list.isEmpty) return "";
|
|
|
|
final users = _list.toSet().map((e) => _usersInfo.getUser(e)).toList();
|
|
|
|
if (users.length == 1)
|
|
return tr("%1% is writing...", args: {"1": users.first.fullName});
|
|
|
|
return tr("%1% and %2% are writing...", args: {
|
|
"1": users.first.fullName,
|
|
"2": users.sublist(1).map((e) => e.fullName).join(", ")
|
|
});
|
|
}
|
|
|
|
void _handleEvent(int userID) async {
|
|
setState(() => this._list.add(userID));
|
|
|
|
await Future.delayed(
|
|
Duration(seconds: srvConfig.conversationsPolicy.writingEventLifetime));
|
|
|
|
setState(() => this._list.removeAt(0));
|
|
}
|
|
}
|