1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-10-23 15:03:22 +00:00
comunicmobile/lib/ui/screens/friends_list_screen.dart

123 lines
3.3 KiB
Dart
Raw Normal View History

import 'package:comunic/helpers/friends_helper.dart';
import 'package:comunic/helpers/users_helper.dart';
import 'package:comunic/lists/friends_list.dart';
import 'package:comunic/lists/users_list.dart';
import 'package:comunic/ui/tiles/accepted_friend_tile.dart';
import 'package:comunic/ui/tiles/pending_friend_tile.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/material.dart';
/// Friends list screen
///
/// Display the list of friends of the current user
///
/// @author Pierre HUBERT
enum _ErrorsLevel { NONE, MINOR, MAJOR }
class FriendsListScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() => _FriendsListScreenState();
}
class _FriendsListScreenState extends SafeState<FriendsListScreen> {
/// Helpers
final _friendsHelper = FriendsHelper();
final _usersHelper = UsersHelper();
/// Widget members
_ErrorsLevel _error = _ErrorsLevel.NONE;
FriendsList _friendsList;
UsersList _usersInfo;
bool _loading = true;
/// Useful setters
set error(_ErrorsLevel err) => setState(() => _error = err);
set loading(bool loading) => setState(() => _loading = loading);
void _gotError() =>
error = _friendsList == null ? _ErrorsLevel.MAJOR : _ErrorsLevel.MINOR;
@override
void didChangeDependencies() {
super.didChangeDependencies();
_loadList();
}
/// Load the list of friends
Future<void> _loadList() async {
error = _ErrorsLevel.NONE;
loading = true;
// Get the list of friends
final list = await _friendsHelper.downloadList();
// Check for errors
if (list == null) return _gotError();
// Get information about related users
final users = await _usersHelper.getUsersInfo(list.usersId);
// Check for errors
if (users == null) return _gotError();
// Apply new information
setState(() {
_friendsList = list;
_usersInfo = users;
});
loading = false;
error = _ErrorsLevel.NONE;
}
/// Build and return loading error
Widget _buildError() =>
buildErrorCard(
tr("Could not load your list of friends!"),
actions: [
FlatButton(
onPressed: _loadList,
child: Text(
tr("Retry").toUpperCase(),
style: TextStyle(color: Colors.white),
),
),
],
);
@override
Widget build(BuildContext context) {
if (_error == _ErrorsLevel.MAJOR) return _buildError();
if (_friendsList == null) return buildCenteredProgressBar();
return Column(
children: <Widget>[
// Check for errors
Container(child: _error != _ErrorsLevel.NONE ? _buildError() : null),
// Check if loading
Container(child: _loading ? CircularProgressIndicator() : null),
// List of friends
Expanded(
child: ListView.builder(itemCount: _friendsList.length, itemBuilder: (c, i) =>
_friendsList[i].accepted ? AcceptedFriendTile(
friend: _friendsList[i],
user: _usersInfo.getUser(_friendsList[i].id),
) : PendingFriendTile(
friend: _friendsList[i],
user: _usersInfo.getUser(_friendsList[i].id),
onRespond: (friend, accept){},
)),
),
],
);
}
}