From b193b752542f979d103d5a3011187f225398e165 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Mon, 18 May 2020 18:19:26 +0200 Subject: [PATCH] Setup: Move generating ssh key + deploy key code out of widget It's strange, but this widget routinely gets constructed twice. So performing a long async operation (generating the ssh key + adding it as a deploy key) from initState, results in it being called twice. I'm not sure where the state is initialized twice. Even adding a unique key to the widget did not help. In the end, I've just moved the code to its parent widget. --- lib/setup/autoconfigure_complete.dart | 90 --------------------------- lib/setup/screens.dart | 65 ++++++++++++++----- 2 files changed, 51 insertions(+), 104 deletions(-) delete mode 100644 lib/setup/autoconfigure_complete.dart diff --git a/lib/setup/autoconfigure_complete.dart b/lib/setup/autoconfigure_complete.dart deleted file mode 100644 index a7cb581b..00000000 --- a/lib/setup/autoconfigure_complete.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:function_types/function_types.dart'; - -import 'package:git_bindings/git_bindings.dart'; - -import 'package:gitjournal/analytics.dart'; -import 'package:gitjournal/apis/githost_factory.dart'; -import 'package:gitjournal/error_reporting.dart'; -import 'package:gitjournal/utils/logger.dart'; - -import 'error.dart'; -import 'loading.dart'; - -class GitHostSetupAutoConfigureComplete extends StatefulWidget { - final GitHost gitHost; - final GitHostRepo repo; - final Func1 onDone; - - GitHostSetupAutoConfigureComplete({ - @required this.gitHost, - @required this.repo, - @required this.onDone, - }); - - @override - GitHostSetupAutoConfigureCompleteState createState() { - return GitHostSetupAutoConfigureCompleteState(); - } -} - -class GitHostSetupAutoConfigureCompleteState - extends State { - String errorMessage = ""; - - String _message = "..."; - - @override - void initState() { - super.initState(); - _initAsync(); - } - - void _initAsync() async { - Log.d("Starting autoconfigure copletion"); - - try { - Log.i("Generating SSH Key"); - setState(() { - _message = "Generating SSH Key"; - }); - var publicKey = await generateSSHKeys(comment: "GitJournal"); - - Log.i("Adding as a deploy key"); - if (mounted) { - setState(() { - _message = "Adding as a Deploy Key"; - }); - } - await widget.gitHost.addDeployKey(publicKey, widget.repo.fullName); - } on Exception catch (e, stacktrace) { - _handleGitHostException(e, stacktrace); - return; - } - widget.onDone(widget.repo.cloneUrl); - } - - void _handleGitHostException(Exception e, StackTrace stacktrace) { - Log.d("GitHostSetupAutoConfigureComplete: " + e.toString()); - setState(() { - errorMessage = e.toString(); - getAnalytics().logEvent( - name: "githostsetup_error", - parameters: { - 'errorMessage': errorMessage, - }, - ); - - logException(e, stacktrace); - }); - } - - @override - Widget build(BuildContext context) { - if (errorMessage == null || errorMessage.isEmpty) { - return GitHostSetupLoadingPage(_message); - } - - return GitHostSetupErrorPage(errorMessage); - } -} diff --git a/lib/setup/screens.dart b/lib/setup/screens.dart index 121ff29d..ef3f2f42 100644 --- a/lib/setup/screens.dart +++ b/lib/setup/screens.dart @@ -9,7 +9,7 @@ import 'package:git_bindings/git_bindings.dart'; import 'package:gitjournal/analytics.dart'; import 'package:gitjournal/apis/githost_factory.dart'; -import 'package:gitjournal/setup/autoconfigure_complete.dart'; +import 'package:gitjournal/error_reporting.dart'; import 'package:gitjournal/setup/repo_selector.dart'; import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/utils.dart'; @@ -22,8 +22,8 @@ import 'package:url_launcher/url_launcher.dart'; import 'autoconfigure.dart'; import 'button.dart'; -import 'clone.dart'; import 'clone_url.dart'; +import 'loading_error.dart'; import 'sshkey.dart'; class GitHostSetupScreen extends StatefulWidget { @@ -53,6 +53,8 @@ class GitHostSetupScreenState extends State { var _gitHostType = GitHostType.Unknown; GitHost _gitHost; GitHostRepo _gitHostRepo; + String _autoConfigureMessage = ""; + String _autoConfigureErrorMessage = ""; var _gitCloneUrl = ""; var gitCloneErrorMessage = ""; @@ -236,6 +238,7 @@ class GitHostSetupScreenState extends State { _gitHostRepo = repo; _pageCount = pos + 2; _nextPage(); + _completeAutoConfigure(); }); }, ); @@ -288,18 +291,9 @@ class GitHostSetupScreenState extends State { ); } } else if (_pageChoice[1] == PageChoice1.Auto) { - return GitHostSetupAutoConfigureComplete( - gitHost: _gitHost, - repo: _gitHostRepo, - onDone: (String gitCloneUrl) { - setState(() { - _gitCloneUrl = gitCloneUrl; - _pageCount = pos + 2; - - _nextPage(); - _startGitClone(context); - }); - }, + return GitHostSetupLoadingErrorPage( + loadingMessage: _autoConfigureMessage, + errorMessage: _autoConfigureErrorMessage, ); } } @@ -530,6 +524,49 @@ class GitHostSetupScreenState extends State { widget.onCompletedFunction(); } + Future _completeAutoConfigure() async { + Log.d("Starting autoconfigure copletion"); + + try { + Log.i("Generating SSH Key"); + setState(() { + _autoConfigureMessage = "Generating SSH Key"; + }); + var publicKey = await generateSSHKeys(comment: "GitJournal"); + + Log.i("Adding as a deploy key"); + _autoConfigureMessage = "Adding as a Deploy Key"; + + await _gitHost.addDeployKey(publicKey, _gitHostRepo.fullName); + } on Exception catch (e, stacktrace) { + _handleGitHostException(e, stacktrace); + return; + } + + setState(() { + _gitCloneUrl = _gitHostRepo.cloneUrl; + _pageCount += 1; + + _nextPage(); + _startGitClone(context); + }); + } + + void _handleGitHostException(Exception e, StackTrace stacktrace) { + Log.d("GitHostSetupAutoConfigureComplete: " + e.toString()); + setState(() { + _autoConfigureErrorMessage = e.toString(); + getAnalytics().logEvent( + name: "githostsetup_error", + parameters: { + 'errorMessage': _autoConfigureErrorMessage, + }, + ); + + logException(e, stacktrace); + }); + } + Map _buildOnboardingAnalytics() { var map = {};