1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2025-06-19 08:15:16 +00:00

Can remove members from conversation

This commit is contained in:
2021-03-13 10:48:59 +01:00
parent ba60fa9e37
commit 5d0ead5889
3 changed files with 71 additions and 29 deletions

View File

@ -10,6 +10,7 @@ import 'package:comunic/ui/tiles/simple_user_tile.dart';
import 'package:comunic/ui/widgets/async_screen_widget.dart';
import 'package:comunic/ui/widgets/comunic_back_button_widget.dart';
import 'package:comunic/ui/widgets/pick_user_widget.dart';
import 'package:comunic/utils/account_utils.dart';
import 'package:comunic/utils/color_utils.dart';
import 'package:comunic/utils/dart_color.dart';
import 'package:comunic/utils/intl_utils.dart';
@ -21,7 +22,7 @@ import 'package:flutter/material.dart';
///
/// @author Pierre HUBERT
enum _MembersMenuChoices { REMOVE }
enum _MembersMenuChoices { TOGGLE_ADMIN_STATUS, REMOVE }
class UpdateConversationScreen extends StatefulWidget {
final convID;
@ -67,13 +68,17 @@ class _UpdateConversationScreen extends State<UpdateConversationScreen> {
get _isValid => _members.length > 0;
Future<void> _init() async {
if (!isUpdating) return;
if (!isUpdating) {
_admins.add(userID());
return;
}
_conversation =
await ConversationsHelper().getSingle(widget.convID, force: true);
_nameController.text = _conversation.name ?? "";
_colorController.text =
_conversationColor == null ? "" : "#${_conversation.color}";
_conversationColor == null ? "" : "#${colorToHex(_conversation.color)}";
_members = await UsersHelper().getList(_conversation.membersID);
_admins = _conversation.adminsID;
_followConversation = _conversation.following;
@ -172,29 +177,7 @@ class _UpdateConversationScreen extends State<UpdateConversationScreen> {
//Conversation members
Column(
children: _members
.map((f) => SimpleUserTile(
user: f,
trailing: _canAddMembers
? PopupMenuButton<_MembersMenuChoices>(
captureInheritedThemes: false,
onSelected: (choice) =>
_membersMenuItemSelected(f, choice),
itemBuilder: (c) =>
<PopupMenuEntry<_MembersMenuChoices>>[
PopupMenuItem(
child: Text(tr("Remove")),
value: _MembersMenuChoices.REMOVE,
enabled: isAdmin ||
(_canEveryoneAddMembers &&
!_conversation.membersID
.contains(f.id)),
)
],
)
: null,
))
.toList(),
children: _members.map((f) => _buildMemberTile(f)).toList(),
),
],
),
@ -202,6 +185,29 @@ class _UpdateConversationScreen extends State<UpdateConversationScreen> {
);
}
Widget _buildMemberTile(User user) => SimpleUserTile(
user: user,
subtitle: _admins.contains(user.id) ? tr("Admin") : tr("Member"),
trailing: _canAddMembers
? PopupMenuButton<_MembersMenuChoices>(
captureInheritedThemes: false,
onSelected: (choice) => _membersMenuItemSelected(user, choice),
itemBuilder: (c) => <PopupMenuEntry<_MembersMenuChoices>>[
PopupMenuItem(
child: Text(tr("Toggle admin status")),
value: _MembersMenuChoices.TOGGLE_ADMIN_STATUS,
enabled: isUpdating && isAdmin && user.id != userID(),
),
PopupMenuItem(
child: Text(tr("Remove")),
value: _MembersMenuChoices.REMOVE,
enabled: isAdmin && user.id != userID(),
),
],
)
: null,
);
void _pickColor() async {
final color = await showColorPickerDialog(context, _color);
setState(() =>
@ -212,10 +218,30 @@ class _UpdateConversationScreen extends State<UpdateConversationScreen> {
void _membersMenuItemSelected(User user, _MembersMenuChoices choice) {
if (choice == null) return;
if (choice == _MembersMenuChoices.REMOVE)
switch (choice) {
case _MembersMenuChoices.REMOVE:
_removeMember(user);
break;
case _MembersMenuChoices.TOGGLE_ADMIN_STATUS:
// TODO: Handle this case.
break;
}
}
void _removeMember(User user) async {
try {
if (isUpdating)
await ConversationsHelper.removeMember(_conversation.id, user.id);
setState(() {
_members.removeWhere((u) => u.id == user.id);
_admins.remove(user.id);
});
} catch (e, s) {
logError(e, s);
snack(context, tr("Failed to remove member!"));
}
}
/// Submit the conversation