2022-01-27 01:03:48 +00:00
|
|
|
import 'package:cwtch/models/remoteserver.dart';
|
2021-06-24 23:10:45 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
2022-01-18 21:26:52 +00:00
|
|
|
import 'contact.dart';
|
|
|
|
|
2021-10-29 23:37:02 +00:00
|
|
|
class ProfileServerListState extends ChangeNotifier {
|
|
|
|
List<RemoteServerInfoState> _servers = [];
|
2021-06-24 23:10:45 +00:00
|
|
|
|
2021-10-29 23:37:02 +00:00
|
|
|
void replace(Iterable<RemoteServerInfoState> newServers) {
|
2021-06-24 23:10:45 +00:00
|
|
|
_servers.clear();
|
|
|
|
_servers.addAll(newServers);
|
2021-11-19 00:09:55 +00:00
|
|
|
resort();
|
2021-06-24 23:10:45 +00:00
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
2021-10-29 23:37:02 +00:00
|
|
|
RemoteServerInfoState? getServer(String onion) {
|
2021-06-24 23:10:45 +00:00
|
|
|
int idx = _servers.indexWhere((element) => element.onion == onion);
|
|
|
|
return idx >= 0 ? _servers[idx] : null;
|
|
|
|
}
|
|
|
|
|
2021-11-19 00:09:55 +00:00
|
|
|
void updateServerState(String onion, String status) {
|
2021-06-24 23:10:45 +00:00
|
|
|
int idx = _servers.indexWhere((element) => element.onion == onion);
|
|
|
|
if (idx >= 0) {
|
2021-11-20 18:09:06 +00:00
|
|
|
_servers[idx].status = status;
|
2021-06-24 23:10:45 +00:00
|
|
|
} else {
|
|
|
|
print("Tried to update server cache without a starting state...this is probably an error");
|
|
|
|
}
|
2021-11-19 00:09:55 +00:00
|
|
|
resort();
|
2021-06-24 23:10:45 +00:00
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
2021-11-19 00:09:55 +00:00
|
|
|
void resort() {
|
|
|
|
_servers.sort((RemoteServerInfoState a, RemoteServerInfoState b) {
|
|
|
|
// return -1 = a first in list
|
|
|
|
// return 1 = b first in list
|
2021-11-20 18:09:06 +00:00
|
|
|
|
2022-01-27 01:03:48 +00:00
|
|
|
// online v syncing v offline
|
2021-11-19 00:09:55 +00:00
|
|
|
if (a.status == "Synced" && b.status != "Synced") {
|
|
|
|
return -1;
|
2021-12-15 22:29:27 +00:00
|
|
|
} else if (a.status != "Synced" && b.status == "Synced") {
|
2021-11-19 00:09:55 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2022-01-27 01:03:48 +00:00
|
|
|
if (a.status == "Authenticated" && b.status != "Authenticated") {
|
|
|
|
return -1;
|
|
|
|
} else if (a.status != "Authenticated" && b.status == "Authenticated") {
|
|
|
|
return 1;
|
|
|
|
}
|
2021-11-20 18:09:06 +00:00
|
|
|
|
|
|
|
// num of groups
|
|
|
|
if (a.groups.length > b.groups.length) {
|
|
|
|
return -1;
|
|
|
|
} else if (b.groups.length > a.groups.length) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2021-11-19 00:09:55 +00:00
|
|
|
return 0;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
void clearGroups() {
|
|
|
|
_servers.map((server) => server.clearGroups());
|
|
|
|
}
|
|
|
|
|
|
|
|
void addGroup(ContactInfoState group) {
|
|
|
|
int idx = _servers.indexWhere((element) => element.onion == group.server);
|
|
|
|
if (idx >= 0) {
|
|
|
|
_servers[idx].addGroup(group);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-29 23:37:02 +00:00
|
|
|
List<RemoteServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|