2022-07-03 13:47:24 +00:00
|
|
|
import 'package:flutter/painting.dart';
|
2022-09-02 21:19:25 +00:00
|
|
|
import 'package:loris/themes/themes.dart';
|
2022-06-30 15:34:09 +00:00
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
2022-08-15 13:08:37 +00:00
|
|
|
import './websocket.dart' as websocket;
|
2022-09-02 21:19:25 +00:00
|
|
|
import 'package:loris/themes/themes.dart' as themes;
|
2022-06-30 15:34:09 +00:00
|
|
|
|
2022-08-13 16:14:12 +00:00
|
|
|
class AccountSettings {
|
|
|
|
final String identity;
|
2022-08-12 17:00:09 +00:00
|
|
|
late String instanceUrl;
|
|
|
|
static const String instanceUrlKey = "instance-url";
|
2022-08-15 13:08:37 +00:00
|
|
|
late String webSocketUrl = "";
|
|
|
|
static const String webSocketUrlKey = "web-socket";
|
2022-08-12 17:00:09 +00:00
|
|
|
late String authCode;
|
|
|
|
static const String authCodeKey = "authcode";
|
|
|
|
late String clientSecret;
|
|
|
|
static const clientSecretKey = "client-secret";
|
|
|
|
late String clientId;
|
|
|
|
static const clientIdKey = "client-id";
|
|
|
|
late String token;
|
|
|
|
static const tokenKey = "access-token";
|
2022-08-13 16:14:12 +00:00
|
|
|
late SharedPreferences prefs;
|
|
|
|
|
|
|
|
AccountSettings._create(this.identity);
|
|
|
|
|
|
|
|
static Future<AccountSettings> create(String identity) async {
|
|
|
|
AccountSettings settings = AccountSettings._create(identity);
|
|
|
|
settings.prefs = await SharedPreferences.getInstance();
|
|
|
|
settings.clientSecret =
|
2022-08-14 08:59:47 +00:00
|
|
|
settings.prefs.getString("${settings.identity}.$clientSecretKey") ?? "";
|
2022-08-13 16:14:12 +00:00
|
|
|
settings.clientId =
|
2022-08-14 08:59:47 +00:00
|
|
|
settings.prefs.getString("${settings.identity}.$clientIdKey") ?? "";
|
2022-08-13 16:14:12 +00:00
|
|
|
settings.token =
|
2022-08-14 08:59:47 +00:00
|
|
|
settings.prefs.getString("${settings.identity}.$tokenKey") ?? "";
|
2022-08-13 16:14:12 +00:00
|
|
|
settings.instanceUrl =
|
2022-08-14 08:59:47 +00:00
|
|
|
settings.prefs.getString("${settings.identity}.$instanceUrlKey") ??
|
2022-08-13 16:14:12 +00:00
|
|
|
"example.com";
|
2022-08-15 13:08:37 +00:00
|
|
|
settings.webSocketUrl =
|
|
|
|
settings.prefs.getString("${settings.identity}.$webSocketUrlKey") ?? "";
|
2022-08-13 16:14:12 +00:00
|
|
|
settings.authCode =
|
2022-08-14 08:59:47 +00:00
|
|
|
settings.prefs.getString("${settings.identity}.$authCodeKey") ?? "";
|
2022-08-13 16:14:12 +00:00
|
|
|
return settings;
|
|
|
|
}
|
|
|
|
|
2022-08-14 08:59:47 +00:00
|
|
|
Future<void> delete() async {
|
2022-08-14 11:32:26 +00:00
|
|
|
await prefs.remove("$identity.$instanceUrlKey");
|
2022-08-15 13:08:37 +00:00
|
|
|
await prefs.remove("$identity.$webSocketUrlKey");
|
2022-08-14 11:32:26 +00:00
|
|
|
await prefs.remove("$identity.$authCodeKey");
|
|
|
|
await prefs.remove("$identity.$clientSecretKey");
|
|
|
|
await prefs.remove("$identity.$clientIdKey");
|
|
|
|
await prefs.remove("$identity.$tokenKey");
|
2022-08-14 08:59:47 +00:00
|
|
|
}
|
|
|
|
|
2022-08-15 13:08:37 +00:00
|
|
|
Future<bool> saveWebsocketUrl(String url) async {
|
|
|
|
webSocketUrl = url;
|
|
|
|
var p = await prefs.setString("$identity.$webSocketUrlKey", url);
|
|
|
|
websocket.reloadWebsockets();
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, String> getAuthHeaders() {
|
|
|
|
return {"Authorization": "Bearer $token"};
|
|
|
|
}
|
|
|
|
|
2022-08-13 16:14:12 +00:00
|
|
|
Future<bool> saveInstanceUrl(String url) async {
|
|
|
|
instanceUrl = url;
|
2022-08-14 08:59:47 +00:00
|
|
|
return await prefs.setString("$identity.$instanceUrlKey", url);
|
2022-08-13 16:14:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<bool> saveAuthCode(String code) async {
|
|
|
|
authCode = code;
|
2022-08-14 08:59:47 +00:00
|
|
|
return await prefs.setString("$identity.$authCodeKey", code);
|
2022-08-13 16:14:12 +00:00
|
|
|
}
|
|
|
|
|
2022-09-03 19:08:53 +00:00
|
|
|
Future<void> saveApp(String clientSecret, String clientId) async {
|
|
|
|
this.clientId = clientId;
|
|
|
|
this.clientSecret = clientSecret;
|
|
|
|
await prefs.setString("$identity.$clientSecretKey", clientSecret);
|
|
|
|
await prefs.setString("$identity.$clientIdKey", clientId);
|
2022-08-13 16:14:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<bool> saveToken(String token) async {
|
|
|
|
this.token = token;
|
2022-08-14 08:59:47 +00:00
|
|
|
return await prefs.setString("$identity.$tokenKey", token);
|
2022-08-13 16:14:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class Settings {
|
2022-08-14 20:43:36 +00:00
|
|
|
late double postWidth = 0.8;
|
|
|
|
static const postWidthKey = "post-width";
|
|
|
|
late double maxPostWidth = 1000;
|
2022-08-14 18:02:42 +00:00
|
|
|
static const maxPostWidthKey = "max-post-width";
|
2022-08-13 16:14:12 +00:00
|
|
|
late Locale locale;
|
|
|
|
static const localeKey = "active-locale";
|
2022-08-12 17:00:09 +00:00
|
|
|
late int batchSize;
|
|
|
|
static const batchSizeKey = "post-batch-size";
|
2022-08-13 16:14:12 +00:00
|
|
|
late Map<String, AccountSettings> identities = {};
|
|
|
|
static const identitiesKey = "identities";
|
|
|
|
late String activeIdentity = "";
|
|
|
|
static const activeIdentityKey = "active-identity";
|
2022-08-12 17:00:09 +00:00
|
|
|
late SharedPreferences prefs;
|
2022-09-02 21:19:25 +00:00
|
|
|
static const themeKey = "theme";
|
|
|
|
late CustomColors theme;
|
2022-06-30 15:34:09 +00:00
|
|
|
|
2022-08-12 17:00:09 +00:00
|
|
|
Settings._create();
|
2022-06-30 15:34:09 +00:00
|
|
|
|
2022-08-12 17:00:09 +00:00
|
|
|
static Future<Settings> create() async {
|
|
|
|
Settings settings = Settings._create();
|
2022-07-01 14:14:13 +00:00
|
|
|
|
2022-08-12 17:00:09 +00:00
|
|
|
settings.prefs = await SharedPreferences.getInstance();
|
|
|
|
settings.locale = Locale(settings.prefs.getString(localeKey) ?? "en");
|
2022-08-13 16:14:12 +00:00
|
|
|
|
2022-08-12 17:00:09 +00:00
|
|
|
settings.batchSize = settings.prefs.getInt(batchSizeKey) ?? 20;
|
|
|
|
if (settings.batchSize < 5) {
|
|
|
|
settings.batchSize = 5;
|
|
|
|
}
|
2022-07-01 14:14:13 +00:00
|
|
|
|
2022-08-13 16:14:12 +00:00
|
|
|
List<String> identityList =
|
|
|
|
settings.prefs.getStringList(identitiesKey) ?? [];
|
|
|
|
settings.identities = {};
|
|
|
|
for (int i = 0; i < identityList.length; i++) {
|
|
|
|
settings.identities.addAll(
|
|
|
|
{identityList[i]: await AccountSettings.create(identityList[i])});
|
|
|
|
}
|
|
|
|
settings.activeIdentity = settings.prefs.getString(activeIdentityKey) ?? "";
|
2022-08-14 16:57:58 +00:00
|
|
|
if (!settings.identities.containsKey(settings.activeIdentity) &&
|
|
|
|
settings.identities.isNotEmpty) {
|
|
|
|
settings.activeIdentity = settings.identities.keys.first;
|
|
|
|
}
|
2022-08-13 16:14:12 +00:00
|
|
|
|
2022-09-23 22:30:49 +00:00
|
|
|
settings.postWidth = settings.prefs.getDouble(postWidthKey) ?? 1.0;
|
2022-08-14 20:43:36 +00:00
|
|
|
settings.maxPostWidth = settings.prefs.getDouble(maxPostWidthKey) ?? 1000;
|
2022-08-14 18:02:42 +00:00
|
|
|
|
2022-09-02 21:19:25 +00:00
|
|
|
final themename = settings.prefs.getString(themeKey);
|
|
|
|
settings.theme = themes.available.firstWhere(
|
|
|
|
(element) => element.name == themename,
|
|
|
|
orElse: () => themes.available[0],
|
|
|
|
);
|
|
|
|
|
2022-08-12 17:00:09 +00:00
|
|
|
return settings;
|
2022-07-01 14:14:13 +00:00
|
|
|
}
|
2022-07-03 13:47:24 +00:00
|
|
|
|
2022-09-02 21:19:25 +00:00
|
|
|
Future<bool> saveTheme(String name) async {
|
|
|
|
theme = themes.available.firstWhere(
|
|
|
|
(element) => element.name == name,
|
|
|
|
);
|
|
|
|
return prefs.setString(themeKey, name);
|
|
|
|
}
|
|
|
|
|
2022-08-14 18:02:42 +00:00
|
|
|
Future<bool> saveMaxPostWidth(double width) {
|
|
|
|
maxPostWidth = width;
|
|
|
|
return prefs.setDouble(maxPostWidthKey, width);
|
|
|
|
}
|
|
|
|
|
2022-08-14 20:43:36 +00:00
|
|
|
Future<bool> savePostWidth(double width) {
|
|
|
|
postWidth = width;
|
|
|
|
return prefs.setDouble(postWidthKey, width);
|
|
|
|
}
|
|
|
|
|
2022-08-13 16:14:12 +00:00
|
|
|
Future<bool> addNewIdentity(String key) async {
|
|
|
|
List<String> a = identities.keys.toList();
|
2022-08-14 14:34:28 +00:00
|
|
|
a.removeWhere((element) {
|
|
|
|
return element == key;
|
|
|
|
});
|
2022-08-13 16:14:12 +00:00
|
|
|
a.add(key);
|
|
|
|
identities.addAll({key: await AccountSettings.create(key)});
|
2022-08-15 13:08:37 +00:00
|
|
|
var p = await prefs.setStringList(identitiesKey, a);
|
|
|
|
return p;
|
2022-07-04 20:39:25 +00:00
|
|
|
}
|
|
|
|
|
2022-08-12 17:00:09 +00:00
|
|
|
Future<bool> saveLocale(String locale) async {
|
|
|
|
this.locale = Locale(locale);
|
|
|
|
return await prefs.setString(localeKey, locale);
|
2022-07-04 20:39:25 +00:00
|
|
|
}
|
|
|
|
|
2022-08-13 16:14:12 +00:00
|
|
|
Future<bool> saveActiveIdentity(String identity) {
|
|
|
|
activeIdentity = identity;
|
2022-08-15 13:08:37 +00:00
|
|
|
var p = prefs.setString(activeIdentityKey, identity);
|
|
|
|
return p;
|
2022-08-12 17:00:09 +00:00
|
|
|
}
|
2022-08-10 16:47:34 +00:00
|
|
|
|
2022-08-12 17:00:09 +00:00
|
|
|
Future<bool> saveBatchSize(int size) async {
|
|
|
|
batchSize = size;
|
|
|
|
return await prefs.setInt(batchSizeKey, size);
|
|
|
|
}
|
2022-08-14 08:59:47 +00:00
|
|
|
|
|
|
|
Future<bool> removeIdentity(String key) async {
|
2022-08-14 11:32:26 +00:00
|
|
|
await identities[key]!.delete();
|
2022-08-14 08:59:47 +00:00
|
|
|
identities.remove(key);
|
2022-08-14 11:32:26 +00:00
|
|
|
if (identities.isNotEmpty) {
|
2022-08-14 17:10:12 +00:00
|
|
|
await saveActiveIdentity(identities.keys.first);
|
2022-08-14 11:32:26 +00:00
|
|
|
}
|
2022-08-15 13:08:37 +00:00
|
|
|
var p = await prefs.setStringList(
|
2022-08-14 08:59:47 +00:00
|
|
|
identitiesKey,
|
|
|
|
identities.keys.toList(),
|
|
|
|
);
|
2022-08-15 13:08:37 +00:00
|
|
|
websocket.reloadWebsockets();
|
|
|
|
return p;
|
2022-08-14 08:59:47 +00:00
|
|
|
}
|
2022-08-10 16:47:34 +00:00
|
|
|
}
|