add pick default reaction

This commit is contained in:
krawieck 2020-09-23 15:27:24 +02:00
parent 22eaa6cade
commit a18300f0f1
1 changed files with 91 additions and 9 deletions

View File

@ -10,6 +10,7 @@ class AccountsStore extends _AccountsStore with _$AccountsStore {}
abstract class _AccountsStore with Store {
ReactionDisposer _saveReactionDisposer;
ReactionDisposer _pickDefaultsDisposer;
_AccountsStore() {
// persistently save settings each time they are changed
@ -24,10 +25,98 @@ abstract class _AccountsStore with Store {
],
(_) => save(),
);
// check if there's a default profile and if not, select one
_pickDefaultsDisposer = reaction(
(_) => [
users.forEach((k, submap) =>
MapEntry(k, submap.forEach((k2, v2) => MapEntry(k2, v2)))),
tokens.forEach((k, submap) =>
MapEntry(k, submap.forEach((k2, v2) => MapEntry(k2, v2)))),
], (_) {
if (users.isEmpty) {
// if empty clear def users
_defaultAccount = null;
_defaultAccounts = ObservableMap();
return;
}
// == SET LOCAL DEFAULTS ==
// go through instances
for (final instanceUrl in users.keys) {
// if this instance is already in defaults
if (_defaultAccounts.keys.contains(instanceUrl)) {
// if this account wasn't removed, skip
if (users[instanceUrl].keys.contains(_defaultAccounts[instanceUrl])) {
continue;
}
// if every account was removed,
if (users[instanceUrl].isEmpty) {
_defaultAccounts.remove(instanceUrl);
continue;
}
_defaultAccounts[instanceUrl] = users[instanceUrl].entries.first.key;
} else {
// select first account in this instance, if any
if (users[instanceUrl].isEmpty) {
continue;
}
_defaultAccounts[instanceUrl] = users[instanceUrl].entries.first.key;
}
}
// clean up
for (final instance in _defaultAccounts.keys) {
if (!users.keys.contains(instance)) {
_defaultAccounts.remove(instance);
}
}
// == SET GLOBAL DEFAULT ==
if (_defaultAccount == null) {
// select first account of first instance
for (final instance in users.keys) {
if (users[instance].isNotEmpty) {
_defaultAccount = '$instance@${users[instance].keys.first}';
}
}
return;
}
final instance = _defaultAccount.split('@')[1];
final username = _defaultAccount.split('@')[0];
final containsDefaultInstance = users.keys.contains(instance);
// if default instance is even added
if (containsDefaultInstance && users[instance].isNotEmpty) {
if (users[instance].containsKey(username)) return;
// select new profile
final newDefault = users[instance].entries.first;
_defaultAccount = '${newDefault.value.name}@${newDefault.key}';
return;
} else {
// if default instance is not even added
// select first account of first instance
for (final user in users.entries) {
if (user.value.entries.isEmpty) continue;
final newDefault = user.value.entries.first;
_defaultAccount = '${newDefault.value.name}@${newDefault.key}';
return;
}
_defaultAccount = null;
return;
}
});
}
void dispose() {
_saveReactionDisposer();
_pickDefaultsDisposer();
}
void load() async {
@ -122,11 +211,13 @@ abstract class _AccountsStore with Store {
return tokens[instanceUrl][_defaultAccounts[instanceUrl]];
}).value;
/// sets globally default account
@action
void setDefaultAccount(String instanceUrl, String username) {
_defaultAccount = '$username@$instanceUrl';
}
/// sets default account for given instance
@action
void setDefaultAccountFor(String instanceUrl, String username) {
_defaultAccounts[instanceUrl] = username;
@ -167,15 +258,6 @@ abstract class _AccountsStore with Store {
final userData =
await lemmy.getSite(auth: token.raw).then((value) => value.myUser);
// first account for this instance
if (users[instanceUrl].isEmpty) {
// first account ever
if (hasNoAccount) {
setDefaultAccount(instanceUrl, userData.name);
}
setDefaultAccountFor(instanceUrl, userData.name);
}
users[instanceUrl][userData.name] = userData;
tokens[instanceUrl][userData.name] = token;
}