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 = {}; final _connectionsByName = {}; final _connectionsByProfileUrl = {}; final _listsForConnection = >{}; 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 newConnections) { bool result = true; for (final connection in newConnections) { result &= addConnection(connection); } return result; } Result, ExecError> getListsForUser(String id) { final result = _listsForConnection[id] ?? []; _refreshConnectionListData(id); return Result.ok(result); } Future _refreshConnectionListData(String id) async { _logger.finest('Refreshing member list data for Connection $id'); await getIt() .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 getById(String id) { final result = _connectionsById[id]; return result != null ? Result.ok(result) : Result.error('$id not found'); } Result getByName(String name) { final result = _connectionsByName[name]; return result != null ? Result.ok(result) : Result.error('$name not found'); } Result getByProfileUrl(Uri url) { final result = _connectionsByProfileUrl[url]; return result != null ? Result.ok(result) : Result.error('$url not found'); } }