Setup: Stop depending on the GitConfig class

Instead mark it as an interface that must be implemented.
This commit is contained in:
Vishesh Handa
2022-06-26 16:12:38 +02:00
parent 794b32128a
commit 149859b09f
9 changed files with 146 additions and 29 deletions

View File

@ -28,8 +28,8 @@ import 'package:gitjournal/settings/app_config.dart';
import 'package:gitjournal/settings/settings.dart';
import 'package:gitjournal/settings/settings_screen.dart';
import 'package:gitjournal/settings/storage_config.dart';
import 'package:gitjournal/ssh/keygen.dart';
import 'package:gitjournal/utils/utils.dart';
import 'package:gitjournal/widgets/setup.dart';
class AppRoute {
static const NewNotePrefix = '/newNote/';
@ -136,11 +136,9 @@ class AppRouter {
case AccountScreen.routePath:
return const AccountScreen();
case GitHostSetupScreen.routePath:
return GitHostSetupScreen(
return GitJournalGitSetupScreen(
repoFolderName: storageConfig.folderName,
remoteName: "origin",
onCompletedFunction: repository.completeGitHostSetup,
keygen: GitJournalKeygen(),
);
case OnBoardingScreen.routePath:
return const OnBoardingScreen();

View File

@ -14,8 +14,11 @@ 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 {
class GitConfig extends ChangeNotifier
with SettingsSharedPref
implements setup.GitConfig {
GitConfig(this.id, this.pref);
@override
@ -24,12 +27,18 @@ class GitConfig extends ChangeNotifier with SettingsSharedPref {
@override
final SharedPreferences pref;
@override
var gitAuthor = "GitJournal";
@override
var gitAuthorEmail = "app@gitjournal.io";
@override
var sshPublicKey = "";
@override
var sshPrivateKey = "";
@override
var sshPassword = "";
var sshKeyType = SettingsSSHKey.Default;
@override
var sshKeyType = SettingsSSHKey.Default.val;
void load() {
gitAuthor = getString("gitAuthor") ?? gitAuthor;
@ -37,9 +46,10 @@ class GitConfig extends ChangeNotifier with SettingsSharedPref {
sshPublicKey = getString("sshPublicKey") ?? sshPublicKey;
sshPrivateKey = getString("sshPrivateKey") ?? sshPrivateKey;
sshPassword = getString("sshPassword") ?? sshPassword;
sshKeyType = SettingsSSHKey.fromInternalString(getString("sshKeyType"));
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
@ -51,7 +61,11 @@ class GitConfig extends ChangeNotifier with SettingsSharedPref {
await setString("sshPublicKey", sshPublicKey, def.sshPublicKey);
await setString("sshPrivateKey", sshPrivateKey, def.sshPrivateKey);
await setString("sshPassword", sshPassword, def.sshPassword);
await setOption("sshKeyType", sshKeyType, def.sshKeyType);
await setOption(
"sshKeyType",
SettingsSSHKey.fromEnum(sshKeyType),
SettingsSSHKey.fromEnum(def.sshKeyType),
);
notifyListeners();
}
@ -109,4 +123,11 @@ enum SettingsSSHKey implements SettingsOption {
orElse: () => Default,
);
}
static SettingsSSHKey fromEnum(SshKeyType k) {
return values.firstWhere(
(e) => e.val == k,
orElse: () => Default,
);
}
}

View File

@ -49,11 +49,11 @@ class SettingsGit extends StatelessWidget {
),
ListOptionPreference<SettingsSSHKey>(
title: tr(LocaleKeys.settings_sshKey_keyType),
currentOption: gitConfig.sshKeyType,
currentOption: SettingsSSHKey.fromEnum(gitConfig.sshKeyType),
values: SettingsSSHKey.values,
defaultValue: SettingsSSHKey.Default,
onChange: (val) {
gitConfig.sshKeyType = val;
onChange: (keyType) {
gitConfig.sshKeyType = keyType.val;
gitConfig.save();
},
),

View File

@ -9,7 +9,6 @@ import 'package:flutter/services.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:git_setup/keygen.dart';
import 'package:git_setup/screens.dart';
import 'package:git_setup/sshkey.dart';
import 'package:path/path.dart' as p;
import 'package:provider/provider.dart';
@ -25,6 +24,7 @@ import 'package:gitjournal/settings/widgets/settings_list_preference.dart';
import 'package:gitjournal/ssh/keygen.dart';
import 'package:gitjournal/utils/utils.dart';
import 'package:gitjournal/widgets/future_builder_with_progress.dart';
import 'package:gitjournal/widgets/setup.dart';
class GitRemoteSettingsScreen extends StatefulWidget {
static const routePath = '/settings/gitRemote';
@ -215,7 +215,7 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
DateTime.now().toIso8601String().substring(0, 10); // only the date
GitJournalKeygen()
.generate(type: keyType.val, comment: comment)
.generate(type: keyType, comment: comment)
.then((SshKey? sshKey) {
var config = Provider.of<GitConfig>(context, listen: false);
config.sshPublicKey = sshKey!.publicKey;
@ -263,11 +263,9 @@ class _GitRemoteSettingsScreenState extends State<GitRemoteSettingsScreen> {
await storageConfig.save();
var route = MaterialPageRoute(
builder: (context) => GitHostSetupScreen(
builder: (context) => GitJournalGitSetupScreen(
repoFolderName: repoFolderName,
remoteName: 'origin',
onCompletedFunction: repo.completeGitHostSetup,
keygen: GitJournalKeygen(),
),
settings: const RouteSettings(name: '/setupRemoteGit'),
);

38
lib/widgets/setup.dart Normal file
View File

@ -0,0 +1,38 @@
import 'package:flutter/widgets.dart';
import 'package:function_types/function_types.dart';
import 'package:git_setup/git_config.dart' as setup;
import 'package:git_setup/screens.dart';
import 'package:gitjournal/settings/git_config.dart';
import 'package:provider/provider.dart';
import 'package:gitjournal/ssh/keygen.dart';
class GitJournalGitSetupScreen extends StatelessWidget {
final String repoFolderName;
final Func2<String, String, Future<void>> onCompletedFunction;
const GitJournalGitSetupScreen({
Key? key,
required this.repoFolderName,
required this.onCompletedFunction,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GitHostSetupScreen(
repoFolderName: repoFolderName,
remoteName: "origin",
onCompletedFunction: onCompletedFunction,
keygen: GitJournalKeygen(),
providers: _Providers(),
);
}
}
class _Providers implements setup.SetupProviders {
@override
setup.GitConfig readGitConfig(BuildContext context) {
return context.read<GitConfig>();
}
}

View File

@ -9,12 +9,11 @@ import 'package:flutter/services.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:function_types/function_types.dart';
import 'package:git_setup/git_config.dart';
import 'package:gitjournal/analytics/analytics.dart';
import 'package:gitjournal/error_reporting.dart';
import 'package:gitjournal/generated/locale_keys.g.dart';
import 'package:gitjournal/logger/logger.dart';
import 'package:gitjournal/settings/git_config.dart';
import 'package:provider/provider.dart';
import 'apis/githost_factory.dart';
import 'button.dart';
@ -24,10 +23,12 @@ import 'loading.dart';
class GitHostSetupAutoConfigurePage extends StatefulWidget {
final GitHostType gitHostType;
final Func2<GitHost?, UserInfo?, void> onDone;
final SetupProviders providers;
const GitHostSetupAutoConfigurePage({
required this.gitHostType,
required this.onDone,
required this.providers,
Key? key,
}) : super(key: key);
@ -81,7 +82,7 @@ class GitHostSetupAutoConfigurePageState
userInfo = await gitHost!.getUserInfo().getOrThrow();
Log.d("Got UserInfo - $userInfo");
var gitConfig = Provider.of<GitConfig>(context, listen: false);
var gitConfig = widget.providers.readGitConfig(context);
if (userInfo.name.isNotEmpty) {
gitConfig.gitAuthor = userInfo.name;
} else if (userInfo.username.isNotEmpty) {

View File

@ -0,0 +1,25 @@
import 'package:flutter/widgets.dart';
import 'package:git_setup/keygen.dart';
abstract class GitConfig {
String get gitAuthor;
String get gitAuthorEmail;
String get sshPublicKey;
String get sshPrivateKey;
String get sshPassword;
SshKeyType get sshKeyType;
set gitAuthor(String x);
set gitAuthorEmail(String x);
set sshPublicKey(String x);
set sshPrivateKey(String x);
set sshPassword(String x);
set sshKeyType(SshKeyType x);
Future<void> save();
}
abstract class SetupProviders {
GitConfig readGitConfig(BuildContext context);
}

View File

@ -15,7 +15,6 @@ import 'package:gitjournal/error_reporting.dart';
import 'package:gitjournal/generated/locale_keys.g.dart';
import 'package:gitjournal/logger/logger.dart';
import 'package:gitjournal/repository.dart';
import 'package:gitjournal/settings/git_config.dart';
import 'package:gitjournal/settings/storage_config.dart';
import 'package:gitjournal/utils/utils.dart';
import 'package:path/path.dart' as p;
@ -24,6 +23,7 @@ import 'package:time/time.dart';
import 'package:universal_io/io.dart' show Platform, Directory;
import 'package:url_launcher/url_launcher.dart';
import 'package:git_setup/git_config.dart';
import 'apis/githost_factory.dart';
import 'autoconfigure.dart';
import 'button.dart';
@ -44,12 +44,14 @@ class GitHostSetupScreen extends StatefulWidget {
final String remoteName;
final Func2<String, String, Future<void>> onCompletedFunction;
final Keygen keygen;
final SetupProviders providers;
const GitHostSetupScreen({
required this.repoFolderName,
required this.remoteName,
required this.onCompletedFunction,
required this.keygen,
required this.providers,
});
@override
@ -208,6 +210,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
});
}
},
providers: widget.providers,
);
}
}
@ -239,7 +242,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
return GitHostUserProvidedKeysPage(
doneFunction:
(String publicKey, String privateKey, String password) async {
var gitConfig = Provider.of<GitConfig>(context, listen: false);
var gitConfig = widget.providers.readGitConfig(context);
gitConfig.sshPublicKey = publicKey;
gitConfig.sshPrivateKey = privateKey;
gitConfig.sshPassword = password;
@ -336,7 +339,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
} else if (_keyGenerationChoice == KeyGenerationChoice.UserProvided) {
return GitHostUserProvidedKeysPage(
doneFunction: (publicKey, privateKey, password) async {
var gitConfig = Provider.of<GitConfig>(context, listen: false);
var gitConfig = widget.providers.readGitConfig(context);
gitConfig.sshPublicKey = publicKey;
gitConfig.sshPrivateKey = privateKey;
gitConfig.sshPassword = password;
@ -462,16 +465,16 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
return;
}
var keyType = context.read<GitConfig>().sshKeyType;
var keyType = widget.providers.readGitConfig(context).sshKeyType;
var comment = "GitJournal-" +
Platform.operatingSystem +
"-" +
DateTime.now().toIso8601String().substring(0, 10); // only the date
widget.keygen
.generate(type: keyType.val, comment: comment)
.generate(type: keyType, comment: comment)
.then((SshKey? sshKey) {
var gitConfig = Provider.of<GitConfig>(context, listen: false);
var gitConfig = widget.providers.readGitConfig(context);
gitConfig.sshPublicKey = sshKey!.publicKey;
gitConfig.sshPrivateKey = sshKey.privateKey;
gitConfig.sshPassword = sshKey.password;
@ -560,7 +563,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
var repo = context.read<GitJournalRepo>();
var basePath = repo.gitBaseDirectory;
var gitConfig = Provider.of<GitConfig>(context, listen: false);
var gitConfig = widget.providers.readGitConfig(context);
var repoPath = p.join(basePath, widget.repoFolderName);
Log.i("RepoPath: $repoPath");
@ -628,16 +631,16 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
setState(() {
_autoConfigureMessage = tr(LocaleKeys.setup_sshKey_generate);
});
var keyType = context.read<GitConfig>().sshKeyType;
var keyType = widget.providers.readGitConfig(context).sshKeyType;
var sshKey = await widget.keygen.generate(
type: keyType.val,
type: keyType,
comment: "GitJournal",
);
if (sshKey == null) {
// FIXME: Handle case when sshKey generation failed
return;
}
var gitConfig = Provider.of<GitConfig>(context, listen: false);
var gitConfig = widget.providers.readGitConfig(context);
gitConfig.sshPublicKey = sshKey.publicKey;
gitConfig.sshPrivateKey = sshKey.privateKey;
gitConfig.sshPassword = sshKey.password;

View File

@ -5,6 +5,8 @@
*/
import 'package:flutter/material.dart';
import 'package:git_setup/git_config.dart';
import 'package:git_setup/keygen.dart';
import 'apis/api_fakes.dart';
import 'apis/githost_factory.dart';
@ -17,6 +19,36 @@ import 'repo_selector.dart';
import 'screens.dart';
import 'sshkey.dart';
class DummyGitConfig implements GitConfig {
@override
String gitAuthor = "GitAuthor";
@override
String gitAuthorEmail = "test@example.com";
@override
SshKeyType sshKeyType = SshKeyType.Ed25519;
@override
String sshPassword = "";
@override
String sshPrivateKey = "";
@override
String sshPublicKey = "";
@override
Future<void> save() async {}
}
class _Providers implements SetupProviders {
@override
GitConfig readGitConfig(BuildContext context) {
return DummyGitConfig();
}
}
Widget autoConfigureChoice() {
return Padding(
padding: const EdgeInsets.all(16.0),
@ -42,6 +74,7 @@ Widget autoConfigure() {
child: GitHostSetupAutoConfigurePage(
gitHostType: GitHostType.GitHub,
onDone: (host, userInfo) {},
providers: _Providers(),
),
);
}