mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-03 11:44:18 +00:00 
			
		
		
		
	Can respond to friendship requests from memberships bar
This commit is contained in:
		@@ -30,4 +30,8 @@ class MembershipList extends AbstractList<Membership> {
 | 
				
			|||||||
  Set<int> get groupsId => where((f) => f.type == MembershipType.GROUP)
 | 
					  Set<int> get groupsId => where((f) => f.type == MembershipType.GROUP)
 | 
				
			||||||
      .map((f) => f.groupID)
 | 
					      .map((f) => f.groupID)
 | 
				
			||||||
      .toSet();
 | 
					      .toSet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Remove a friend membership from the list
 | 
				
			||||||
 | 
					  void removeFriend(int friendID) => remove(firstWhere(
 | 
				
			||||||
 | 
					      (f) => f.type == MembershipType.FRIEND && f.friend.id == friendID));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,12 +8,12 @@ import 'package:meta/meta.dart';
 | 
				
			|||||||
/// @author Pierre HUBERT
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Friend extends CacheModel implements Comparable<Friend> {
 | 
					class Friend extends CacheModel implements Comparable<Friend> {
 | 
				
			||||||
  final bool accepted;
 | 
					  bool accepted;
 | 
				
			||||||
  final int lastActive;
 | 
					  final int lastActive;
 | 
				
			||||||
  final bool following;
 | 
					  final bool following;
 | 
				
			||||||
  final bool canPostTexts;
 | 
					  final bool canPostTexts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const Friend({
 | 
					  Friend({
 | 
				
			||||||
    @required int id,
 | 
					    @required int id,
 | 
				
			||||||
    @required this.accepted,
 | 
					    @required this.accepted,
 | 
				
			||||||
    @required this.lastActive,
 | 
					    @required this.lastActive,
 | 
				
			||||||
@@ -22,6 +22,8 @@ class Friend extends CacheModel implements Comparable<Friend> {
 | 
				
			|||||||
  })  : assert(id != null),
 | 
					  })  : assert(id != null),
 | 
				
			||||||
        assert(accepted != null),
 | 
					        assert(accepted != null),
 | 
				
			||||||
        assert(lastActive != null),
 | 
					        assert(lastActive != null),
 | 
				
			||||||
 | 
					        assert(following != null),
 | 
				
			||||||
 | 
					        assert(canPostTexts != null),
 | 
				
			||||||
        super(id: id);
 | 
					        super(id: id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Check out whether friend is connected or not
 | 
					  /// Check out whether friend is connected or not
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,12 @@
 | 
				
			|||||||
import 'package:comunic/helpers/conversations_helper.dart';
 | 
					import 'package:comunic/helpers/conversations_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/helpers/friends_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/groups_helper.dart';
 | 
					import 'package:comunic/helpers/groups_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/users_helper.dart';
 | 
					import 'package:comunic/helpers/users_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/webapp_helper.dart';
 | 
					import 'package:comunic/helpers/webapp_helper.dart';
 | 
				
			||||||
import 'package:comunic/lists/groups_list.dart';
 | 
					import 'package:comunic/lists/groups_list.dart';
 | 
				
			||||||
import 'package:comunic/lists/memberships_list.dart';
 | 
					import 'package:comunic/lists/memberships_list.dart';
 | 
				
			||||||
import 'package:comunic/lists/users_list.dart';
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/friend.dart';
 | 
				
			||||||
import 'package:comunic/models/membership.dart';
 | 
					import 'package:comunic/models/membership.dart';
 | 
				
			||||||
import 'package:comunic/ui/widgets/account_image_widget.dart';
 | 
					import 'package:comunic/ui/widgets/account_image_widget.dart';
 | 
				
			||||||
import 'package:comunic/ui/widgets/group_icon_widget.dart';
 | 
					import 'package:comunic/ui/widgets/group_icon_widget.dart';
 | 
				
			||||||
@@ -92,13 +94,40 @@ class _MembershipsPanelState extends SafeState<MembershipsPanel> {
 | 
				
			|||||||
  Widget _buildFriendMembership(Membership membership) {
 | 
					  Widget _buildFriendMembership(Membership membership) {
 | 
				
			||||||
    final user = _usersList.getUser(membership.friend.id);
 | 
					    final user = _usersList.getUser(membership.friend.id);
 | 
				
			||||||
    final connected = membership.friend.isConnected;
 | 
					    final connected = membership.friend.isConnected;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Widget subtitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!membership.friend.accepted) {
 | 
				
			||||||
 | 
					      subtitle = RichText(
 | 
				
			||||||
 | 
					          text: TextSpan(children: [
 | 
				
			||||||
 | 
					        WidgetSpan(
 | 
				
			||||||
 | 
					            child: _RespondFriendshipRequestButton(
 | 
				
			||||||
 | 
					          friend: membership.friend,
 | 
				
			||||||
 | 
					          accept: true,
 | 
				
			||||||
 | 
					          text: tr("Accept"),
 | 
				
			||||||
 | 
					          color: Colors.green,
 | 
				
			||||||
 | 
					          onTap: _respondFriendshipRequest,
 | 
				
			||||||
 | 
					        )),
 | 
				
			||||||
 | 
					        TextSpan(text: "   "),
 | 
				
			||||||
 | 
					        WidgetSpan(
 | 
				
			||||||
 | 
					            child: _RespondFriendshipRequestButton(
 | 
				
			||||||
 | 
					          friend: membership.friend,
 | 
				
			||||||
 | 
					          accept: false,
 | 
				
			||||||
 | 
					          text: tr("Reject"),
 | 
				
			||||||
 | 
					          color: Colors.red,
 | 
				
			||||||
 | 
					          onTap: _respondFriendshipRequest,
 | 
				
			||||||
 | 
					        )),
 | 
				
			||||||
 | 
					      ]));
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					      subtitle = Text(
 | 
				
			||||||
 | 
					        connected ? tr("Online") : diffTimeFromNowToStr(membership.lastActive),
 | 
				
			||||||
 | 
					        style: TextStyle(color: connected ? Colors.green : null),
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ListTile(
 | 
					    return ListTile(
 | 
				
			||||||
      leading: AccountImageWidget(user: user, width: _MembershipIconsWidth),
 | 
					      leading: AccountImageWidget(user: user, width: _MembershipIconsWidth),
 | 
				
			||||||
      title: Text(user.displayName),
 | 
					      title: Text(user.displayName),
 | 
				
			||||||
      subtitle: Text(
 | 
					      subtitle: subtitle,
 | 
				
			||||||
        connected ? tr("Online") : diffTimeFromNowToStr(membership.lastActive),
 | 
					 | 
				
			||||||
        style: TextStyle(color: connected ? Colors.green : null),
 | 
					 | 
				
			||||||
      ),
 | 
					 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -124,4 +153,55 @@ class _MembershipsPanelState extends SafeState<MembershipsPanel> {
 | 
				
			|||||||
      subtitle: Text(diffTimeFromNowToStr(membership.lastActive)),
 | 
					      subtitle: Text(diffTimeFromNowToStr(membership.lastActive)),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Respond to a friendship request
 | 
				
			||||||
 | 
					  Future<void> _respondFriendshipRequest(Friend f, bool accept) async {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      if (!accept &&
 | 
				
			||||||
 | 
					          !await showConfirmDialog(
 | 
				
			||||||
 | 
					              context: Scaffold.of(context)
 | 
				
			||||||
 | 
					                  .context, // Without this the text appears in white
 | 
				
			||||||
 | 
					              message:
 | 
				
			||||||
 | 
					                  tr("Do you really want to reject this friendship request?")))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await FriendsHelper().respondRequest(f.id, accept);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      setState(() {
 | 
				
			||||||
 | 
					        if (accept)
 | 
				
			||||||
 | 
					          f.accepted = true;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          _membershipList.removeFriend(f.id);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      _refreshKey.currentState.show();
 | 
				
			||||||
 | 
					    } catch (e, s) {
 | 
				
			||||||
 | 
					      print("Could not respond to friendship request! $e\n$s");
 | 
				
			||||||
 | 
					      showSimpleSnack(context, tr("Could not respond to friendship request!"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _RespondFriendshipRequestButton extends StatelessWidget {
 | 
				
			||||||
 | 
					  final Friend friend;
 | 
				
			||||||
 | 
					  final bool accept;
 | 
				
			||||||
 | 
					  final String text;
 | 
				
			||||||
 | 
					  final Color color;
 | 
				
			||||||
 | 
					  final void Function(Friend, bool) onTap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const _RespondFriendshipRequestButton({
 | 
				
			||||||
 | 
					    Key key,
 | 
				
			||||||
 | 
					    @required this.friend,
 | 
				
			||||||
 | 
					    @required this.accept,
 | 
				
			||||||
 | 
					    @required this.text,
 | 
				
			||||||
 | 
					    @required this.color,
 | 
				
			||||||
 | 
					    @required this.onTap,
 | 
				
			||||||
 | 
					  }) : super(key: key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
 | 
					    return InkWell(
 | 
				
			||||||
 | 
					      onTap: () => onTap(friend, accept),
 | 
				
			||||||
 | 
					      child: Text(text, style: TextStyle(color: color)),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user