mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-18 19:23:31 +00:00
87 lines
2.5 KiB
Dart
87 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:logging/logging.dart';
|
|
import 'package:result_monad/result_monad.dart';
|
|
|
|
import '../globals.dart';
|
|
import '../models/connection.dart';
|
|
import '../models/exec_error.dart';
|
|
import '../models/group_data.dart';
|
|
import 'auth_service.dart';
|
|
|
|
class ConnectionsManager extends ChangeNotifier {
|
|
static final _logger = Logger('$ConnectionsManager');
|
|
final _connectionsById = <String, Connection>{};
|
|
final _connectionsByName = <String, Connection>{};
|
|
final _connectionsByProfileUrl = <Uri, Connection>{};
|
|
final _listsForConnection = <String, List<GroupData>>{};
|
|
|
|
int get length => _connectionsById.length;
|
|
|
|
void clearCaches() {
|
|
_connectionsById.clear();
|
|
_connectionsByName.clear();
|
|
_connectionsByProfileUrl.clear();
|
|
_listsForConnection.clear();
|
|
}
|
|
|
|
bool addConnection(Connection connection) {
|
|
if (_connectionsById.containsKey(connection.id)) {
|
|
return false;
|
|
}
|
|
_connectionsById[connection.id] = connection;
|
|
_connectionsByName[connection.name] = connection;
|
|
_connectionsByProfileUrl[connection.profileUrl] = connection;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool addAllConnections(Iterable<Connection> newConnections) {
|
|
bool result = true;
|
|
|
|
for (final connection in newConnections) {
|
|
result &= addConnection(connection);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
Result<List<GroupData>, ExecError> getListsForUser(String id) {
|
|
final result = _listsForConnection[id] ?? [];
|
|
_refreshConnectionListData(id);
|
|
return Result.ok(result);
|
|
}
|
|
|
|
Future<void> _refreshConnectionListData(String id) async {
|
|
_logger.finest('Refreshing member list data for Connection $id');
|
|
await getIt<AuthService>()
|
|
.currentClient
|
|
.andThenAsync((client) => client.getMemberGroupsForConnection(id))
|
|
.match(
|
|
onSuccess: (lists) {
|
|
_listsForConnection[id] = lists;
|
|
notifyListeners();
|
|
},
|
|
onError: (error) {
|
|
_logger.severe('Error getting list data for $id: $error');
|
|
},
|
|
);
|
|
}
|
|
|
|
Result<Connection, String> getById(String id) {
|
|
final result = _connectionsById[id];
|
|
|
|
return result != null ? Result.ok(result) : Result.error('$id not found');
|
|
}
|
|
|
|
Result<Connection, String> getByName(String name) {
|
|
final result = _connectionsByName[name];
|
|
|
|
return result != null ? Result.ok(result) : Result.error('$name not found');
|
|
}
|
|
|
|
Result<Connection, String> getByProfileUrl(Uri url) {
|
|
final result = _connectionsByProfileUrl[url];
|
|
|
|
return result != null ? Result.ok(result) : Result.error('$url not found');
|
|
}
|
|
}
|