diff --git a/lib/app_router.dart b/lib/app_router.dart index 174c88cc..ca1b71e2 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -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(); diff --git a/lib/settings/git_config.dart b/lib/settings/git_config.dart index be648db4..d7805169 100644 --- a/lib/settings/git_config.dart +++ b/lib/settings/git_config.dart @@ -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 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, + ); + } } diff --git a/lib/settings/settings_git.dart b/lib/settings/settings_git.dart index a1f46d81..7d64158c 100644 --- a/lib/settings/settings_git.dart +++ b/lib/settings/settings_git.dart @@ -49,11 +49,11 @@ class SettingsGit extends StatelessWidget { ), ListOptionPreference( 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(); }, ), diff --git a/lib/settings/settings_git_remote.dart b/lib/settings/settings_git_remote.dart index b97593dd..189a8259 100644 --- a/lib/settings/settings_git_remote.dart +++ b/lib/settings/settings_git_remote.dart @@ -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 { 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(context, listen: false); config.sshPublicKey = sshKey!.publicKey; @@ -263,11 +263,9 @@ class _GitRemoteSettingsScreenState extends State { 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'), ); diff --git a/lib/widgets/setup.dart b/lib/widgets/setup.dart new file mode 100644 index 00000000..641c1402 --- /dev/null +++ b/lib/widgets/setup.dart @@ -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> 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(); + } +} diff --git a/packages/git_setup/lib/autoconfigure.dart b/packages/git_setup/lib/autoconfigure.dart index 2da9d8e2..e1b51ee3 100644 --- a/packages/git_setup/lib/autoconfigure.dart +++ b/packages/git_setup/lib/autoconfigure.dart @@ -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 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(context, listen: false); + var gitConfig = widget.providers.readGitConfig(context); if (userInfo.name.isNotEmpty) { gitConfig.gitAuthor = userInfo.name; } else if (userInfo.username.isNotEmpty) { diff --git a/packages/git_setup/lib/git_config.dart b/packages/git_setup/lib/git_config.dart new file mode 100644 index 00000000..905e505d --- /dev/null +++ b/packages/git_setup/lib/git_config.dart @@ -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 save(); +} + +abstract class SetupProviders { + GitConfig readGitConfig(BuildContext context); +} diff --git a/packages/git_setup/lib/screens.dart b/packages/git_setup/lib/screens.dart index 26218f44..c361ba09 100644 --- a/packages/git_setup/lib/screens.dart +++ b/packages/git_setup/lib/screens.dart @@ -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> 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 { }); } }, + providers: widget.providers, ); } } @@ -239,7 +242,7 @@ class GitHostSetupScreenState extends State { return GitHostUserProvidedKeysPage( doneFunction: (String publicKey, String privateKey, String password) async { - var gitConfig = Provider.of(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 { } else if (_keyGenerationChoice == KeyGenerationChoice.UserProvided) { return GitHostUserProvidedKeysPage( doneFunction: (publicKey, privateKey, password) async { - var gitConfig = Provider.of(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 { return; } - var keyType = context.read().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(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 { var repo = context.read(); var basePath = repo.gitBaseDirectory; - var gitConfig = Provider.of(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 { setState(() { _autoConfigureMessage = tr(LocaleKeys.setup_sshKey_generate); }); - var keyType = context.read().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(context, listen: false); + var gitConfig = widget.providers.readGitConfig(context); gitConfig.sshPublicKey = sshKey.publicKey; gitConfig.sshPrivateKey = sshKey.privateKey; gitConfig.sshPassword = sshKey.password; diff --git a/packages/git_setup/lib/screens_stories.dart b/packages/git_setup/lib/screens_stories.dart index 382e84ef..2c380c22 100644 --- a/packages/git_setup/lib/screens_stories.dart +++ b/packages/git_setup/lib/screens_stories.dart @@ -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 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(), ), ); }