lemmur-app-android/lib/stores/accounts_store.dart

123 lines
3.3 KiB
Dart
Raw Normal View History

2020-09-01 13:22:37 +02:00
import 'package:lemmy_api_client/lemmy_api_client.dart';
import 'package:mobx/mobx.dart';
import 'package:shared_preferences/shared_preferences.dart';
part 'accounts_store.g.dart';
class AccountsStore extends _AccountsStore with _$AccountsStore {}
abstract class _AccountsStore with Store {
ReactionDisposer _saveReactionDisposer;
_AccountsStore() {
// persitently save settings each time they are changed
_saveReactionDisposer = reaction((_) => [users, tokens], (_) {
save();
});
}
void dispose() {
_saveReactionDisposer();
}
void load() async {
var prefs = await SharedPreferences.getInstance();
// set saved settings or create defaults
// TODO: load saved
users = ObservableMap();
tokens = ObservableMap();
_defaultAccounts = ObservableMap();
}
void save() async {
var prefs = await SharedPreferences.getInstance();
// TODO: save
}
/// if path to tokens map exists, it exists for users as well
/// `users['instanceUrl']['username']`
@observable
ObservableMap<String, ObservableMap<String, User>> users;
/// if path to users map exists, it exists for tokens as well
/// `tokens['instanceUrl']['username']`
@observable
ObservableMap<String, ObservableMap<String, Jwt>> tokens;
/// default account for a given instance
/// map where keys are instanceUrls and values are usernames
@observable
ObservableMap<String, String> _defaultAccounts;
/// default account for the app
/// username@instanceUrl
@observable
String _defaultAccount;
@computed
User get defaultUser {
var userTag = _defaultAccount.split('@');
return users[userTag[1]][userTag[0]];
}
@computed
Jwt get defaultToken {
var userTag = _defaultAccount.split('@');
return tokens[userTag[1]][userTag[0]];
}
User defaultUserFor(String instanceUrl) => Computed(() {
var userTag = _defaultAccounts[instanceUrl].split('@');
return users[userTag[1]][userTag[0]];
}).value;
Jwt defaultTokenFor(String instanceUrl) => Computed(() {
var userTag = _defaultAccounts[instanceUrl].split('@');
return tokens[userTag[1]][userTag[0]];
}).value;
@action
void setDefaultAccount(String instanceUrl, String username) {
_defaultAccount = '$username@$instanceUrl';
}
@action
void setDefaultAccountFor(String instanceUrl, String username) {
_defaultAccounts[instanceUrl] = username;
}
/// adds a new account
/// if it's the first account ever the account is
/// set as default for the app
/// if it's the first account for an instance the account is
/// set as default for that instance
@action
Future<void> addAccount(
String instanceUrl,
String usernameOrEmail,
String password,
) async {
var lemmy = LemmyApi(instanceUrl).v1;
var token = await lemmy.login(
usernameOrEmail: usernameOrEmail,
password: password,
);
var userData =
await lemmy.getSite(auth: token.raw).then((value) => value.myUser);
if (!users.containsKey(instanceUrl)) {
if (users.isEmpty) {
setDefaultAccount(instanceUrl, userData.name);
}
users[instanceUrl] = ObservableMap();
tokens[instanceUrl] = ObservableMap();
setDefaultAccountFor(instanceUrl, userData.name);
}
users[instanceUrl][userData.name] = userData;
tokens[instanceUrl][userData.name] = token;
}
}