1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-22 12:59:21 +00:00

Can remove a friend from the list of friends

This commit is contained in:
Pierre HUBERT 2019-05-01 19:29:46 +02:00
parent a7b2bf410e
commit 7c3390f8af
4 changed files with 90 additions and 6 deletions

View File

@ -51,4 +51,15 @@ class FriendsHelper {
return response.code == 200;
}
/// Remove a friend from the list
Future<bool> removeFriend(int friendID) async {
final response = await APIRequest(
uri: "friends/remove",
needLogin: true,
args: {"friendID" : friendID.toString()}
).exec();
return response.code == 200;
}
}

View File

@ -39,8 +39,10 @@ class _FriendsListScreenState extends SafeState<FriendsListScreen> {
set loading(bool loading) => setState(() => _loading = loading);
void _gotError() =>
error = _friendsList == null ? _ErrorsLevel.MAJOR : _ErrorsLevel.MINOR;
void _gotError() {
loading = false;
error = _friendsList == null ? _ErrorsLevel.MAJOR : _ErrorsLevel.MINOR;
}
@override
void didChangeDependencies() {
@ -109,6 +111,7 @@ class _FriendsListScreenState extends SafeState<FriendsListScreen> {
? AcceptedFriendTile(
friend: _friendsList[i],
user: _usersInfo.getUser(_friendsList[i].id),
onRequestDelete: _deleteFriend,
)
: PendingFriendTile(
friend: _friendsList[i],
@ -125,10 +128,45 @@ class _FriendsListScreenState extends SafeState<FriendsListScreen> {
loading = true;
if (!await _friendsHelper.respondRequest(f.id, accept))
Scaffold.of(context).showSnackBar(SnackBar(
content: Text(tr("Could not respond to friendship request!"))));
showSimpleSnack(context, tr("Could not respond to friendship request!"));
// Load the list of friends again
_loadList();
}
/// Handles deletion request of a friend
Future<void> _deleteFriend(Friend f) async {
final choice = await showDialog<bool>(
context: context,
builder: (b) => AlertDialog(
title: Text(tr("Delete friend")),
content: Text(tr(
"Are you sure do you want to remove this friend from your list of friends ? A friendship request will have to be sent to get this user back to your list!")),
actions: <Widget>[
FlatButton(
onPressed: () => Navigator.pop(context, false),
child: Text(tr("Cancel").toUpperCase()),
),
FlatButton(
onPressed: () => Navigator.pop(context, true),
child: Text(
tr("Confirm").toUpperCase(),
style: TextStyle(color: Colors.red),
),
),
],
),
);
if (choice == null || !choice) return;
// Forward the request to the server
loading = true;
if (!await _friendsHelper.removeFriend(f.id))
showSimpleSnack(
context, tr("Could not delete this person from your friends list!"));
// Refresh list
_loadList();
}
}

View File

@ -9,14 +9,23 @@ import 'package:flutter/material.dart';
///
/// @author Pierre HUBERT
enum _FriendMenuChoices { REMOVE }
typedef OnRequestDeleteFriend = void Function(Friend);
class AcceptedFriendTile extends StatelessWidget {
final Friend friend;
final User user;
final OnRequestDeleteFriend onRequestDelete;
const AcceptedFriendTile(
{Key key, @required this.friend, @required this.user})
{Key key,
@required this.friend,
@required this.user,
@required this.onRequestDelete})
: assert(friend != null),
assert(user != null),
assert(onRequestDelete != null),
super(key: key);
@override
@ -32,8 +41,28 @@ class AcceptedFriendTile extends StatelessWidget {
style: TextStyle(color: Colors.green),
)
: Text(
diffTimeFromNowToStr(friend.lastActive),
diffTimeFromNowToStr(friend.lastActive),
),
trailing: PopupMenuButton<_FriendMenuChoices>(
itemBuilder: (c) => [
PopupMenuItem(
child: Text(tr("Remove")),
value: _FriendMenuChoices.REMOVE,
)
],
onSelected: _selectedMenuOption,
),
);
}
void _selectedMenuOption(_FriendMenuChoices value) {
if (value == null) return;
switch (value) {
//Delete friend
case _FriendMenuChoices.REMOVE:
onRequestDelete(friend);
break;
}
}
}

View File

@ -60,3 +60,9 @@ void showImageFullScreen(BuildContext context, String url) {
}));
}
/// Show simple snack
void showSimpleSnack(BuildContext context, String message) {
Scaffold.of(context).showSnackBar(SnackBar(content: Text(message)));
}