mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 12:14:11 +00:00 
			
		
		
		
	Can cancel membership request
This commit is contained in:
		@@ -100,13 +100,20 @@ class GroupsHelper {
 | 
				
			|||||||
          .map((f) => cast<int>(f))
 | 
					          .map((f) => cast<int>(f))
 | 
				
			||||||
          .toSet();
 | 
					          .toSet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Remove group membership
 | 
					  /// Perform a simple membership request
 | 
				
			||||||
  Future<bool> removeMembership(int groupID) async =>
 | 
					  Future<bool> _simpleMembershipRequest(int groupID, String uri) async =>
 | 
				
			||||||
      (await (APIRequest(uri: "groups/remove_membership", needLogin: true)
 | 
					      (await (APIRequest(uri: uri, needLogin: true)..addInt("id", groupID))
 | 
				
			||||||
                ..addInt("id", groupID))
 | 
					 | 
				
			||||||
              .exec())
 | 
					              .exec())
 | 
				
			||||||
          .isOK;
 | 
					          .isOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Remove group membership
 | 
				
			||||||
 | 
					  Future<bool> removeMembership(int groupID) async =>
 | 
				
			||||||
 | 
					      _simpleMembershipRequest(groupID, "groups/remove_membership");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Cancel membership request
 | 
				
			||||||
 | 
					  Future<bool> cancelRequest(int groupID) async =>
 | 
				
			||||||
 | 
					      _simpleMembershipRequest(groupID, "groups/cancel_request");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Turn an API entry into a group object
 | 
					  /// Turn an API entry into a group object
 | 
				
			||||||
  Group _getGroupFromAPI(Map<String, dynamic> map) {
 | 
					  Group _getGroupFromAPI(Map<String, dynamic> map) {
 | 
				
			||||||
    return Group(
 | 
					    return Group(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ class Group {
 | 
				
			|||||||
  final String name;
 | 
					  final String name;
 | 
				
			||||||
  final String iconURL;
 | 
					  final String iconURL;
 | 
				
			||||||
  final int numberMembers;
 | 
					  final int numberMembers;
 | 
				
			||||||
  final GroupMembershipLevel membershipLevel;
 | 
					  GroupMembershipLevel membershipLevel;
 | 
				
			||||||
  final GroupVisibilityLevel visibilityLevel;
 | 
					  final GroupVisibilityLevel visibilityLevel;
 | 
				
			||||||
  final GroupRegistrationLevel registrationLevel;
 | 
					  final GroupRegistrationLevel registrationLevel;
 | 
				
			||||||
  final GroupPostCreationLevel postCreationLevel;
 | 
					  final GroupPostCreationLevel postCreationLevel;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ import 'package:comunic/helpers/groups_helper.dart';
 | 
				
			|||||||
import 'package:comunic/lists/groups_list.dart';
 | 
					import 'package:comunic/lists/groups_list.dart';
 | 
				
			||||||
import 'package:comunic/models/group.dart';
 | 
					import 'package:comunic/models/group.dart';
 | 
				
			||||||
import 'package:comunic/ui/widgets/group_icon_widget.dart';
 | 
					import 'package:comunic/ui/widgets/group_icon_widget.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/ui/widgets/group_membership_widget.dart';
 | 
				
			||||||
import 'package:comunic/ui/widgets/safe_state.dart';
 | 
					import 'package:comunic/ui/widgets/safe_state.dart';
 | 
				
			||||||
import 'package:comunic/utils/intl_utils.dart';
 | 
					import 'package:comunic/utils/intl_utils.dart';
 | 
				
			||||||
import 'package:comunic/utils/ui_utils.dart';
 | 
					import 'package:comunic/utils/ui_utils.dart';
 | 
				
			||||||
@@ -57,6 +58,7 @@ class _GroupsListScreenState extends SafeState<GroupsListScreen> {
 | 
				
			|||||||
                      .map((g) => ListTile(
 | 
					                      .map((g) => ListTile(
 | 
				
			||||||
                            leading: GroupIcon(group: g),
 | 
					                            leading: GroupIcon(group: g),
 | 
				
			||||||
                            title: Text(g.displayName),
 | 
					                            title: Text(g.displayName),
 | 
				
			||||||
 | 
					                            subtitle: GroupMembershipWidget(group: g),
 | 
				
			||||||
                            trailing: IconButton(
 | 
					                            trailing: IconButton(
 | 
				
			||||||
                                icon: Icon(Icons.delete),
 | 
					                                icon: Icon(Icons.delete),
 | 
				
			||||||
                                onPressed: () => _deleteGroup(g)),
 | 
					                                onPressed: () => _deleteGroup(g)),
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										82
									
								
								lib/ui/widgets/group_membership_widget.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								lib/ui/widgets/group_membership_widget.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/groups_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/group.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/gestures.dart';
 | 
				
			||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Group membership information widget
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GroupMembershipWidget extends StatefulWidget {
 | 
				
			||||||
 | 
					  final Group group;
 | 
				
			||||||
 | 
					  final Function() onUpdated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const GroupMembershipWidget({
 | 
				
			||||||
 | 
					    @required this.group,
 | 
				
			||||||
 | 
					    this.onUpdated,
 | 
				
			||||||
 | 
					  }) : assert(group != null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  _GroupMembershipWidgetState createState() => _GroupMembershipWidgetState();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _GroupMembershipWidgetState extends SafeState<GroupMembershipWidget> {
 | 
				
			||||||
 | 
					  Group get group => widget.group;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int get _id => group.id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  GroupMembershipLevel get _level => group.membershipLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
 | 
					    switch (_level) {
 | 
				
			||||||
 | 
					      case GroupMembershipLevel.ADMINISTRATOR:
 | 
				
			||||||
 | 
					        return Text(tr("Administrator"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case GroupMembershipLevel.MODERATOR:
 | 
				
			||||||
 | 
					        return Text(tr("Moderator"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case GroupMembershipLevel.MEMBER:
 | 
				
			||||||
 | 
					        return Text(tr("Member"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case GroupMembershipLevel.INVITED:
 | 
				
			||||||
 | 
					        // TODO: Handle this case.
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case GroupMembershipLevel.PENDING:
 | 
				
			||||||
 | 
					        return _buildPendingState();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case GroupMembershipLevel.VISITOR:
 | 
				
			||||||
 | 
					        // TODO: Handle this case.
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Build pending state
 | 
				
			||||||
 | 
					  Widget _buildPendingState() {
 | 
				
			||||||
 | 
					    return RichText(
 | 
				
			||||||
 | 
					      text: TextSpan(children: [
 | 
				
			||||||
 | 
					        TextSpan(text: tr("Requested") + " "),
 | 
				
			||||||
 | 
					        TextSpan(
 | 
				
			||||||
 | 
					            text: tr("Cancel"),
 | 
				
			||||||
 | 
					            style: TextStyle(color: Colors.blue),
 | 
				
			||||||
 | 
					            recognizer: TapGestureRecognizer()..onTap = () => _cancelRequest()),
 | 
				
			||||||
 | 
					      ]),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Cancel group membership request
 | 
				
			||||||
 | 
					  void _cancelRequest() async {
 | 
				
			||||||
 | 
					    if (!await GroupsHelper().cancelRequest(_id))
 | 
				
			||||||
 | 
					      showSimpleSnack(context, tr("Could not cancel your membership request!"));
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      // Refresh state
 | 
				
			||||||
 | 
					      group.membershipLevel = GroupMembershipLevel.VISITOR;
 | 
				
			||||||
 | 
					      this.setState(() {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.widget.onUpdated != null) this.widget.onUpdated();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user