Files
GitJournal/lib/screens/githostsetup_clone_url.dart
Vishesh Handa 2aba80cb75 GitHostSetup: Use git_url_parse2 to try to verify the url
This way if the url is invalid we will know before trying to clone,
which happens much later during the process.
2020-02-16 20:01:59 +01:00

205 lines
5.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:git_url_parse2/git_url_parse2.dart';
import 'package:function_types/function_types.dart';
import 'package:gitjournal/apis/githost_factory.dart';
import 'githostsetup_button.dart';
class GitCloneUrlPage extends StatefulWidget {
final Func1<String, void> doneFunction;
final String initialValue;
GitCloneUrlPage({
@required this.doneFunction,
@required this.initialValue,
});
@override
GitCloneUrlPageState createState() {
return GitCloneUrlPageState();
}
}
class GitCloneUrlPageState extends State<GitCloneUrlPage> {
final GlobalKey<FormFieldState<String>> sshUrlKey =
GlobalKey<FormFieldState<String>>();
final _formKey = GlobalKey<FormState>();
final inputFormFocus = FocusNode();
@override
Widget build(BuildContext context) {
final formSubmitted = () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
var url = sshUrlKey.currentState.value;
widget.doneFunction(url.trim());
inputFormFocus.unfocus();
}
};
var inputForm = Form(
key: _formKey,
child: TextFormField(
key: sshUrlKey,
textAlign: TextAlign.center,
autofocus: true,
style: Theme.of(context).textTheme.title,
decoration: const InputDecoration(
hintText: 'git@github.com:GitJournal/GitJournal.git',
),
validator: _isCloneUrlValid,
focusNode: inputFormFocus,
textInputAction: TextInputAction.done,
onFieldSubmitted: (String _) => formSubmitted(),
initialValue: widget.initialValue,
minLines: 1,
maxLines: 3,
),
);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
"Enter the Git Clone URL",
style: Theme.of(context).textTheme.headline,
),
),
const SizedBox(height: 16.0),
Padding(
padding: const EdgeInsets.all(8.0),
child: inputForm,
),
const SizedBox(height: 8.0),
GitHostSetupButton(
text: "Next",
onPressed: formSubmitted,
),
],
);
}
}
class GitCloneUrlKnownProviderPage extends StatefulWidget {
final Func1<String, void> doneFunction;
final Func0<void> launchCreateUrlPage;
final GitHostType gitHostType;
final String initialValue;
GitCloneUrlKnownProviderPage({
@required this.doneFunction,
@required this.launchCreateUrlPage,
@required this.gitHostType,
@required this.initialValue,
});
@override
GitCloneUrlKnownProviderPageState createState() {
return GitCloneUrlKnownProviderPageState();
}
}
class GitCloneUrlKnownProviderPageState
extends State<GitCloneUrlKnownProviderPage> {
final GlobalKey<FormFieldState<String>> sshUrlKey =
GlobalKey<FormFieldState<String>>();
final _formKey = GlobalKey<FormState>();
final inputFormFocus = FocusNode();
@override
Widget build(BuildContext context) {
final formSubmitted = () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
var url = sshUrlKey.currentState.value;
widget.doneFunction(url.trim());
inputFormFocus.unfocus();
}
};
var inputForm = Form(
key: _formKey,
child: TextFormField(
key: sshUrlKey,
textAlign: TextAlign.center,
autofocus: true,
style: Theme.of(context).textTheme.title,
decoration: const InputDecoration(
hintText: 'git@github.com:GitJournal/GitJournal.git',
),
validator: _isCloneUrlValid,
focusNode: inputFormFocus,
textInputAction: TextInputAction.done,
onFieldSubmitted: (String _) => formSubmitted(),
initialValue: widget.initialValue,
minLines: 1,
maxLines: 3,
),
);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Please create a new git repository -',
style: Theme.of(context).textTheme.title,
),
const SizedBox(height: 32.0),
// Step 1
Text(
'1. Go to the website, create a repo and copy its git clone URL',
style: Theme.of(context).textTheme.subtitle,
),
const SizedBox(height: 8.0),
GitHostSetupButton(
text: "Open Create New Repo Webpage",
onPressed: widget.launchCreateUrlPage,
),
const SizedBox(height: 16.0),
// Step 2
Text(
'2. Enter the Git clone URL',
style: Theme.of(context).textTheme.subtitle,
),
const SizedBox(height: 8.0),
inputForm,
const SizedBox(height: 16.0),
GitHostSetupButton(
text: "Next",
onPressed: formSubmitted,
),
],
);
}
}
// Returns null when valid
String _isCloneUrlValid(String url) {
url = url.trim();
if (url.isEmpty) {
return 'Please enter some text';
}
var result = gitUrlParse(url);
if (result == null) {
return 'Invalid Input';
}
if (result.protocol != 'ssh') {
return 'Only SSH urls are currently accepted';
}
return null;
}