Files
GitJournal/lib/settings/git_config.dart
Vishesh Handa 149859b09f Setup: Stop depending on the GitConfig class
Instead mark it as an interface that must be implemented.
2022-06-26 16:12:38 +02:00

134 lines
3.7 KiB
Dart

/*
* SPDX-FileCopyrightText: 2019-2021 Vishesh Handa <me@vhanda.in>
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import 'dart:core';
import 'package:flutter/foundation.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:git_setup/keygen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:gitjournal/generated/locale_keys.g.dart';
import 'package:gitjournal/settings/settings_sharedpref.dart';
import 'package:git_setup/git_config.dart' as setup;
class GitConfig extends ChangeNotifier
with SettingsSharedPref
implements setup.GitConfig {
GitConfig(this.id, this.pref);
@override
final String id;
@override
final SharedPreferences pref;
@override
var gitAuthor = "GitJournal";
@override
var gitAuthorEmail = "app@gitjournal.io";
@override
var sshPublicKey = "";
@override
var sshPrivateKey = "";
@override
var sshPassword = "";
@override
var sshKeyType = SettingsSSHKey.Default.val;
void load() {
gitAuthor = getString("gitAuthor") ?? gitAuthor;
gitAuthorEmail = getString("gitAuthorEmail") ?? gitAuthorEmail;
sshPublicKey = getString("sshPublicKey") ?? sshPublicKey;
sshPrivateKey = getString("sshPrivateKey") ?? sshPrivateKey;
sshPassword = getString("sshPassword") ?? sshPassword;
sshKeyType = SettingsSSHKey.fromInternalString(getString("sshKeyType")).val;
}
@override
Future<void> save() async {
var def = GitConfig(id, pref);
// I could call _load and get all the values
// and then compare it.
// why am I doing this? - I'm not sure
await setString("gitAuthor", gitAuthor, def.gitAuthor);
await setString("gitAuthorEmail", gitAuthorEmail, def.gitAuthorEmail);
await setString("sshPublicKey", sshPublicKey, def.sshPublicKey);
await setString("sshPrivateKey", sshPrivateKey, def.sshPrivateKey);
await setString("sshPassword", sshPassword, def.sshPassword);
await setOption(
"sshKeyType",
SettingsSSHKey.fromEnum(sshKeyType),
SettingsSSHKey.fromEnum(def.sshKeyType),
);
notifyListeners();
}
Map<String, String> toLoggableMap() {
return <String, String>{
"gitAuthor": gitAuthor.isNotEmpty.toString(),
"gitAuthorEmail": gitAuthorEmail.isNotEmpty.toString(),
'sshPublicKey': sshPublicKey.isNotEmpty.toString(),
'sshPrivateKey': sshPrivateKey.isNotEmpty.toString(),
'sshPassword': sshPassword.isNotEmpty.toString(),
};
}
}
// 1. Make sure we don't need to set the value and call save
// 2. Less calls to setString so this is much faster
// Optimizing this doesn't matter
abstract class SettingsOption {
String toPublicString();
String toInternalString();
List<SettingsOption> get allValues;
}
enum SettingsSSHKey implements SettingsOption {
Ed25519(LocaleKeys.settings_sshKey_ed25519, SshKeyType.Ed25519),
Rsa(LocaleKeys.settings_sshKey_rsa, SshKeyType.Rsa);
static const SettingsSSHKey Default = Ed25519;
final String _publicString;
final SshKeyType val;
const SettingsSSHKey(this._publicString, this.val);
@override
String toPublicString() => tr(_publicString);
@override
String toInternalString() => name;
@override
List<SettingsOption> get allValues => values;
static SettingsSSHKey fromInternalString(String? str) {
return values.firstWhere(
(e) => e.toInternalString() == str,
orElse: () => Default,
);
}
static SettingsSSHKey fromPublicString(String str) {
return values.firstWhere(
(e) => e.toPublicString() == str,
orElse: () => Default,
);
}
static SettingsSSHKey fromEnum(SshKeyType k) {
return values.firstWhere(
(e) => e.val == k,
orElse: () => Default,
);
}
}