mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 18:38:36 +08:00
@ -36,6 +36,7 @@ class GitHostSetupScreen extends StatefulWidget {
|
|||||||
|
|
||||||
enum PageChoice0 { Unknown, KnownProvider, CustomProvider }
|
enum PageChoice0 { Unknown, KnownProvider, CustomProvider }
|
||||||
enum PageChoice1 { Unknown, Manual, Auto }
|
enum PageChoice1 { Unknown, Manual, Auto }
|
||||||
|
enum KeyGenerationChoice { Unknown, AutoGenerated, UserProvided }
|
||||||
|
|
||||||
class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
||||||
var _pageCount = 1;
|
var _pageCount = 1;
|
||||||
@ -44,6 +45,7 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
PageChoice0.Unknown,
|
PageChoice0.Unknown,
|
||||||
PageChoice1.Unknown,
|
PageChoice1.Unknown,
|
||||||
];
|
];
|
||||||
|
var _keyGenerationChoice = KeyGenerationChoice.Unknown;
|
||||||
|
|
||||||
var _gitHostType = GitHostType.Unknown;
|
var _gitHostType = GitHostType.Unknown;
|
||||||
var _gitCloneUrl = "";
|
var _gitCloneUrl = "";
|
||||||
@ -87,7 +89,6 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
|
|
||||||
_pageCount = pos + 2;
|
_pageCount = pos + 2;
|
||||||
_nextPage();
|
_nextPage();
|
||||||
_generateSshKey(context);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
initialValue: _gitCloneUrl,
|
initialValue: _gitCloneUrl,
|
||||||
@ -115,16 +116,23 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
|
|
||||||
if (pos == 2) {
|
if (pos == 2) {
|
||||||
if (_pageChoice[0] == PageChoice0.CustomProvider) {
|
if (_pageChoice[0] == PageChoice0.CustomProvider) {
|
||||||
return GitHostSetupSshKeyUnknownProvider(
|
return GitHostSetupKeyChoice(
|
||||||
doneFunction: () {
|
onGenerateKeys: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
_keyGenerationChoice = KeyGenerationChoice.AutoGenerated;
|
||||||
|
_pageCount = pos + 2;
|
||||||
|
|
||||||
|
_nextPage();
|
||||||
|
_generateSshKey(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onUserProvidedKeys: () {
|
||||||
|
setState(() {
|
||||||
|
_keyGenerationChoice = KeyGenerationChoice.UserProvided;
|
||||||
_pageCount = pos + 2;
|
_pageCount = pos + 2;
|
||||||
_nextPage();
|
_nextPage();
|
||||||
_startGitClone(context);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
publicKey: publicKey,
|
|
||||||
copyKeyFunction: _copyKeyToClipboard,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +146,6 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
_gitCloneUrl = sshUrl;
|
_gitCloneUrl = sshUrl;
|
||||||
|
|
||||||
_nextPage();
|
_nextPage();
|
||||||
_generateSshKey(context);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
launchCreateUrlPage: _launchCreateRepoPage,
|
launchCreateUrlPage: _launchCreateRepoPage,
|
||||||
@ -163,29 +170,52 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
|
|
||||||
if (pos == 3) {
|
if (pos == 3) {
|
||||||
if (_pageChoice[0] == PageChoice0.CustomProvider) {
|
if (_pageChoice[0] == PageChoice0.CustomProvider) {
|
||||||
return GitHostSetupGitClone(errorMessage: gitCloneErrorMessage);
|
assert(_keyGenerationChoice != KeyGenerationChoice.Unknown);
|
||||||
|
if (_keyGenerationChoice == KeyGenerationChoice.AutoGenerated) {
|
||||||
|
return GitHostSetupSshKeyUnknownProvider(
|
||||||
|
doneFunction: () {
|
||||||
|
setState(() {
|
||||||
|
_pageCount = pos + 2;
|
||||||
|
_nextPage();
|
||||||
|
_startGitClone(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
publicKey: publicKey,
|
||||||
|
copyKeyFunction: _copyKeyToClipboard,
|
||||||
|
);
|
||||||
|
} else if (_keyGenerationChoice == KeyGenerationChoice.UserProvided) {
|
||||||
|
return GitHostUserProvidedKeys(
|
||||||
|
doneFunction: (String publicKey, String privateKey) async {
|
||||||
|
await setSshKeys(publicKey: publicKey, privateKey: privateKey);
|
||||||
|
setState(() {
|
||||||
|
this.publicKey = publicKey;
|
||||||
|
_pageCount = pos + 2;
|
||||||
|
_nextPage();
|
||||||
|
_startGitClone(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_pageChoice[1] == PageChoice1.Manual) {
|
if (_pageChoice[1] == PageChoice1.Manual) {
|
||||||
// FIXME: Create a new page with better instructions
|
return GitHostSetupKeyChoice(
|
||||||
return GitHostSetupSshKeyKnownProvider(
|
onGenerateKeys: () {
|
||||||
doneFunction: () {
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_pageCount = 6;
|
_keyGenerationChoice = KeyGenerationChoice.AutoGenerated;
|
||||||
|
_pageCount = pos + 2;
|
||||||
|
|
||||||
_nextPage();
|
_nextPage();
|
||||||
_startGitClone(context);
|
_generateSshKey(context);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
regenerateFunction: () {
|
onUserProvidedKeys: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
publicKey = "";
|
_keyGenerationChoice = KeyGenerationChoice.UserProvided;
|
||||||
|
_pageCount = pos + 2;
|
||||||
|
_nextPage();
|
||||||
});
|
});
|
||||||
_generateSshKey(context);
|
|
||||||
},
|
},
|
||||||
publicKey: publicKey,
|
|
||||||
copyKeyFunction: _copyKeyToClipboard,
|
|
||||||
openDeployKeyPage: _launchDeployKeyPage,
|
|
||||||
);
|
);
|
||||||
} else if (_pageChoice[1] == PageChoice1.Auto) {
|
} else if (_pageChoice[1] == PageChoice1.Auto) {
|
||||||
return GitHostSetupGitClone(errorMessage: gitCloneErrorMessage);
|
return GitHostSetupGitClone(errorMessage: gitCloneErrorMessage);
|
||||||
@ -195,6 +225,49 @@ class GitHostSetupScreenState extends State<GitHostSetupScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pos == 4) {
|
if (pos == 4) {
|
||||||
|
if (_pageChoice[0] == PageChoice0.CustomProvider) {
|
||||||
|
return GitHostSetupGitClone(errorMessage: gitCloneErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_pageChoice[1] == PageChoice1.Manual) {
|
||||||
|
assert(_keyGenerationChoice != KeyGenerationChoice.Unknown);
|
||||||
|
if (_keyGenerationChoice == KeyGenerationChoice.AutoGenerated) {
|
||||||
|
return GitHostSetupSshKeyKnownProvider(
|
||||||
|
doneFunction: () {
|
||||||
|
setState(() {
|
||||||
|
_pageCount = 6;
|
||||||
|
|
||||||
|
_nextPage();
|
||||||
|
_startGitClone(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
regenerateFunction: () {
|
||||||
|
setState(() {
|
||||||
|
publicKey = "";
|
||||||
|
});
|
||||||
|
_generateSshKey(context);
|
||||||
|
},
|
||||||
|
publicKey: publicKey,
|
||||||
|
copyKeyFunction: _copyKeyToClipboard,
|
||||||
|
openDeployKeyPage: _launchDeployKeyPage,
|
||||||
|
);
|
||||||
|
} else if (_keyGenerationChoice == KeyGenerationChoice.UserProvided) {
|
||||||
|
return GitHostUserProvidedKeys(
|
||||||
|
doneFunction: (String publicKey, String privateKey) async {
|
||||||
|
await setSshKeys(publicKey: publicKey, privateKey: privateKey);
|
||||||
|
setState(() {
|
||||||
|
this.publicKey = publicKey;
|
||||||
|
_pageCount = pos + 2;
|
||||||
|
_nextPage();
|
||||||
|
_startGitClone(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos == 5) {
|
||||||
if (_pageChoice[1] == PageChoice1.Manual) {
|
if (_pageChoice[1] == PageChoice1.Manual) {
|
||||||
return GitHostSetupGitClone(errorMessage: gitCloneErrorMessage);
|
return GitHostSetupGitClone(errorMessage: gitCloneErrorMessage);
|
||||||
}
|
}
|
||||||
|
@ -157,6 +157,121 @@ class GitHostSetupSshKeyUnknownProvider extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class GitHostSetupKeyChoice extends StatelessWidget {
|
||||||
|
final Func0<void> onGenerateKeys;
|
||||||
|
final Func0<void> onUserProvidedKeys;
|
||||||
|
|
||||||
|
GitHostSetupKeyChoice({
|
||||||
|
@required this.onGenerateKeys,
|
||||||
|
@required this.onUserProvidedKeys,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
"We need SSH keys to authenticate -",
|
||||||
|
style: Theme.of(context).textTheme.headline,
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16.0),
|
||||||
|
GitHostSetupButton(
|
||||||
|
text: "Generate new keys",
|
||||||
|
onPressed: onGenerateKeys,
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8.0),
|
||||||
|
GitHostSetupButton(
|
||||||
|
text: "Provide Custom SSH Keys",
|
||||||
|
onPressed: onUserProvidedKeys,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GitHostUserProvidedKeys extends StatefulWidget {
|
||||||
|
final Func2<String, String, void> doneFunction;
|
||||||
|
|
||||||
|
GitHostUserProvidedKeys({
|
||||||
|
@required this.doneFunction,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_GitHostUserProvidedKeysState createState() =>
|
||||||
|
_GitHostUserProvidedKeysState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _GitHostUserProvidedKeysState extends State<GitHostUserProvidedKeys> {
|
||||||
|
final _publicKeyController = TextEditingController();
|
||||||
|
final _privateKeyController = TextEditingController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
"Public Key -",
|
||||||
|
style: Theme.of(context).textTheme.headline,
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8.0),
|
||||||
|
KeyEditor(_publicKeyController),
|
||||||
|
const SizedBox(height: 8.0),
|
||||||
|
Text(
|
||||||
|
"Private Key -",
|
||||||
|
style: Theme.of(context).textTheme.headline,
|
||||||
|
),
|
||||||
|
KeyEditor(_privateKeyController),
|
||||||
|
const SizedBox(height: 16.0),
|
||||||
|
GitHostSetupButton(
|
||||||
|
text: "Next",
|
||||||
|
onPressed: () {
|
||||||
|
var publicKey = _publicKeyController.text.trim();
|
||||||
|
var privateKey = _privateKeyController.text.trim();
|
||||||
|
widget.doneFunction(publicKey, privateKey);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: vHanda: Add validation
|
||||||
|
class KeyEditor extends StatelessWidget {
|
||||||
|
final TextEditingController controller;
|
||||||
|
|
||||||
|
KeyEditor(this.controller);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 80.0,
|
||||||
|
child: Container(
|
||||||
|
color: Theme.of(context).buttonColor,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: TextField(
|
||||||
|
controller: controller,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
maxLines: null,
|
||||||
|
style: Theme.of(context).textTheme.body1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PublicKeyWidget extends StatelessWidget {
|
class PublicKeyWidget extends StatelessWidget {
|
||||||
final String publicKey;
|
final String publicKey;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user