mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 04:04:18 +00:00 
			
		
		
		
	Can respond to group membership invitations
This commit is contained in:
		@@ -73,7 +73,7 @@ class GroupsHelper {
 | 
			
		||||
    // Check which groups information to download
 | 
			
		||||
    final toDownload = Set<int>();
 | 
			
		||||
    groups.forEach((groupID) {
 | 
			
		||||
      if (_groupsListCache.containsKey(groupID))
 | 
			
		||||
      if (!force && _groupsListCache.containsKey(groupID))
 | 
			
		||||
        list[groupID] = _groupsListCache[groupID];
 | 
			
		||||
      else
 | 
			
		||||
        toDownload.add(groupID);
 | 
			
		||||
@@ -101,8 +101,11 @@ class GroupsHelper {
 | 
			
		||||
          .toSet();
 | 
			
		||||
 | 
			
		||||
  /// Perform a simple membership request
 | 
			
		||||
  Future<bool> _simpleMembershipRequest(int groupID, String uri) async =>
 | 
			
		||||
      (await (APIRequest(uri: uri, needLogin: true)..addInt("id", groupID))
 | 
			
		||||
  Future<bool> _simpleMembershipRequest(int groupID, String uri,
 | 
			
		||||
          {Map<String, String> args}) async =>
 | 
			
		||||
      (await (APIRequest(uri: uri, needLogin: true)
 | 
			
		||||
                ..addInt("id", groupID)
 | 
			
		||||
                ..addArgs(args == null ? Map() : args))
 | 
			
		||||
              .exec())
 | 
			
		||||
          .isOK;
 | 
			
		||||
 | 
			
		||||
@@ -118,6 +121,12 @@ class GroupsHelper {
 | 
			
		||||
  Future<bool> sendRequest(int groupID) async =>
 | 
			
		||||
      _simpleMembershipRequest(groupID, "groups/send_request");
 | 
			
		||||
 | 
			
		||||
  /// Respond to a group membership invitation
 | 
			
		||||
  Future<bool> respondInvitation(int groupID, bool accept) async =>
 | 
			
		||||
      _simpleMembershipRequest(groupID, "groups/respond_invitation", args: {
 | 
			
		||||
        "accept": accept ? "true" : "false",
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
  /// Turn an API entry into a group object
 | 
			
		||||
  Group _getGroupFromAPI(Map<String, dynamic> map) {
 | 
			
		||||
    return Group(
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,8 @@ class APIRequest {
 | 
			
		||||
 | 
			
		||||
  void addFile(String name, File file) => files[name] = file;
 | 
			
		||||
 | 
			
		||||
  void addArgs(Map<String, String> newArgs) => args.addAll(newArgs);
 | 
			
		||||
 | 
			
		||||
  /// Execute the request
 | 
			
		||||
  Future<APIResponse> exec() async => APIHelper().exec(this);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,8 @@ class _GroupMembershipWidgetState extends SafeState<GroupMembershipWidget> {
 | 
			
		||||
        return Text(tr("Member"));
 | 
			
		||||
 | 
			
		||||
      case GroupMembershipLevel.INVITED:
 | 
			
		||||
        // TODO: Handle this case.
 | 
			
		||||
        break;
 | 
			
		||||
        return _buildInvitedState();
 | 
			
		||||
 | 
			
		||||
      case GroupMembershipLevel.PENDING:
 | 
			
		||||
        return _buildPendingState();
 | 
			
		||||
 | 
			
		||||
@@ -53,6 +53,49 @@ class _GroupMembershipWidgetState extends SafeState<GroupMembershipWidget> {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Build invited state
 | 
			
		||||
  Widget _buildInvitedState() {
 | 
			
		||||
    return RichText(
 | 
			
		||||
      text: TextSpan(children: [
 | 
			
		||||
        WidgetSpan(
 | 
			
		||||
            child: Icon(Icons.info_outline, size: 12),
 | 
			
		||||
            alignment: PlaceholderAlignment.middle),
 | 
			
		||||
        TextSpan(text: " " + tr("Invited") + " "),
 | 
			
		||||
        TextSpan(
 | 
			
		||||
            text: tr("Accept"),
 | 
			
		||||
            style: TextStyle(color: Colors.green),
 | 
			
		||||
            recognizer: TapGestureRecognizer()
 | 
			
		||||
              ..onTap = () => _respondInvitation(true)),
 | 
			
		||||
        TextSpan(text: "  "),
 | 
			
		||||
        TextSpan(
 | 
			
		||||
            text: tr("Reject"),
 | 
			
		||||
            style: TextStyle(color: Colors.red),
 | 
			
		||||
            recognizer: TapGestureRecognizer()
 | 
			
		||||
              ..onTap = () => _respondInvitation(false)),
 | 
			
		||||
      ]),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Respond to an invitation
 | 
			
		||||
  void _respondInvitation(bool accept) async {
 | 
			
		||||
    if (!accept &&
 | 
			
		||||
        !await showConfirmDialog(
 | 
			
		||||
            context: context,
 | 
			
		||||
            message: tr("Do you really want to reject this invitation?")))
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
    if (!await GroupsHelper().respondInvitation(_id, accept))
 | 
			
		||||
      showSimpleSnack(context, tr("Could not respond to your invitation!"));
 | 
			
		||||
    else {
 | 
			
		||||
      // Refresh state
 | 
			
		||||
      group.membershipLevel =
 | 
			
		||||
          accept ? GroupMembershipLevel.MEMBER : GroupMembershipLevel.VISITOR;
 | 
			
		||||
      this.setState(() {});
 | 
			
		||||
 | 
			
		||||
      if (this.widget.onUpdated != null) this.widget.onUpdated();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Build pending state
 | 
			
		||||
  Widget _buildPendingState() {
 | 
			
		||||
    return RichText(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user