git-touch-android-ios-app/lib/screens/login.dart

134 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import '../providers/settings.dart';
import '../scaffolds/simple.dart';
import '../utils/constants.dart';
import '../widgets/link.dart';
import '../widgets/loading.dart';
import '../models/account.dart';
import '../widgets/avatar.dart';
// import 'login_gitlab.dart';
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
Widget _buildAccountItem(AccountModel account) {
var settings = SettingsProvider.of(context);
return Link(
onTap: () {
// Navigator.of(context).pop();
settings.setActiveAccount(
account.platform, account.domain, account.login);
},
child: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.black12)),
),
child: Row(children: <Widget>[
Avatar(url: account.avatarUrl, size: 24),
Padding(padding: EdgeInsets.only(left: 10)),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(account.login, style: TextStyle(fontSize: 20)),
Padding(padding: EdgeInsets.only(top: 6)),
Text(account.domain)
],
),
),
(settings.activePlatform == account.platform &&
settings.activeDomain == account.domain &&
settings.activeLogin == account.login)
? Icon(Icons.check)
: Container(),
]),
),
);
}
Widget _buildAddItem(
{String text, Function onTap, WidgetBuilder screenBuilder}) {
return Link(
child: Container(
padding: EdgeInsets.symmetric(vertical: 20),
decoration: BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.black12)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.add),
Text(text, style: TextStyle(fontSize: 16)),
],
),
),
onTap: onTap,
screenBuilder: screenBuilder,
);
}
@override
Widget build(BuildContext context) {
var settings = SettingsProvider.of(context);
List<AccountModel> accounts = [];
settings.accountMap.forEach((platform, v0) {
v0.forEach((domain, v1) {
v1.forEach((login, v2) {
accounts.add(AccountModel(
avatarUrl: v2.avatarUrl,
token: v2.token,
platform: platform,
domain: domain,
login: login,
));
});
});
});
return SimpleScaffold(
title: Text('Select account'),
bodyBuilder: () {
if (settings.loading) {
return Center(child: Loading());
}
return Container(
child: Column(
children: settings.githubAccountMap.entries
.map<Widget>((entry) => _buildAccountItem(AccountModel(
avatarUrl: entry.value.avatarUrl,
token: entry.value.token,
platform: PlatformType.github,
domain: 'https://github.com',
login: entry.key)))
.toList()
..addAll(accounts.map(_buildAccountItem))
..addAll([
_buildAddItem(
text: 'GitHub Account',
onTap: () {
var state = settings.generateRandomString();
launch(
'https://github.com/login/oauth/authorize?client_id=$clientId&redirect_uri=gittouch://login&scope=user%20repo&state=$state',
);
},
),
// _buildAddItem(
// text: 'GitLab Account',
// screenBuilder: (_) => LoginGitlabScreen(),
// )
]),
),
);
},
);
}
}