feat(gitea): main screen

This commit is contained in:
Rongjian Zhang 2020-01-29 17:33:54 +08:00
parent 62c4c380f8
commit 76c6948b05
4 changed files with 102 additions and 9 deletions

View File

@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
import 'package:git_touch/models/notification.dart'; import 'package:git_touch/models/notification.dart';
import 'package:git_touch/models/theme.dart'; import 'package:git_touch/models/theme.dart';
import 'package:git_touch/screens/gitea_user.dart';
import 'package:git_touch/screens/gitlab_explore.dart'; import 'package:git_touch/screens/gitlab_explore.dart';
import 'package:git_touch/screens/gitlab_project.dart'; import 'package:git_touch/screens/gitlab_project.dart';
import 'package:git_touch/screens/gitlab_todos.dart'; import 'package:git_touch/screens/gitlab_todos.dart';
@ -55,6 +56,14 @@ class _HomeState extends State<Home> {
return GitlabUserScreen(null); return GitlabUserScreen(null);
} }
break; break;
case PlatformType.gitea:
switch (index) {
case 0:
return GiteaUserScreen(null);
case 1:
return GiteaUserScreen(null);
}
break;
} }
} }
@ -117,6 +126,17 @@ class _HomeState extends State<Home> {
title: Text('Me'), title: Text('Me'),
), ),
]; ];
case PlatformType.gitea:
return [
BottomNavigationBarItem(
icon: Icon(Icons.explore),
title: Text('Explore'),
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
title: Text('Me'),
),
];
} }
} }

View File

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'dart:convert'; import 'dart:convert';
import 'dart:async'; import 'dart:async';
import 'package:git_touch/models/gitea.dart';
import 'package:git_touch/utils/request_serilizer.dart'; import 'package:git_touch/utils/request_serilizer.dart';
import 'package:gql_http_link/gql_http_link.dart'; import 'package:gql_http_link/gql_http_link.dart';
import 'package:artemis/artemis.dart'; import 'package:artemis/artemis.dart';
@ -21,6 +22,7 @@ const clientId = 'df930d7d2e219f26142a';
class PlatformType { class PlatformType {
static const github = 'github'; static const github = 'github';
static const gitlab = 'gitlab'; static const gitlab = 'gitlab';
static const gitea = 'gitea';
} }
class DataWithPage<T> { class DataWithPage<T> {
@ -161,6 +163,35 @@ class AuthModel with ChangeNotifier {
return DataWithPage(info, next, next != null); return DataWithPage(info, next, next != null);
} }
Future loginToGitea(String domain, String token) async {
try {
loading = true;
notifyListeners();
final res = await http.get('$domain/api/v1/user',
headers: {'Authorization': 'token $token'});
final info = json.decode(res.body);
if (info['message'] != null) {
throw info['message'];
}
final user = GiteaUser.fromJson(info);
await _addAccount(Account(
platform: PlatformType.gitea,
domain: domain,
token: token,
login: user.login,
avatarUrl: user.avatarUrl,
));
} catch (err) {
Fimber.e('loginToGitea failed', ex: err);
// TODO: show errors
} finally {
loading = false;
notifyListeners();
}
}
Future fetchGitea(String p) async { Future fetchGitea(String p) async {
final res = await http.get('https://try.gitea.io' + '/api/v1' + p, final res = await http.get('https://try.gitea.io' + '/api/v1' + p,
headers: {'Authorization': ''}); headers: {'Authorization': ''});

View File

@ -9,23 +9,25 @@ import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
class GiteaUserScreen extends StatelessWidget { class GiteaUserScreen extends StatelessWidget {
final String username; final String login;
GiteaUserScreen(this.login);
GiteaUserScreen(this.username);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return RefreshStatefulScaffold< return RefreshStatefulScaffold<
Tuple2<GiteaUser, Iterable<GiteaRepository>>>( Tuple2<GiteaUser, Iterable<GiteaRepository>>>(
title: Text('User'), title: Text(login == null ? 'Me' : 'User'),
fetchData: () async { fetchData: () async {
final auth = Provider.of<AuthModel>(context); final auth = Provider.of<AuthModel>(context);
final u = login ?? auth.activeAccount.login;
final items = await Future.wait([ final items = await Future.wait([
auth.fetchGitea('/users/$username'), auth.fetchGitea('/users/$u'),
auth.fetchGitea('/users/$username/repos'), auth.fetchGitea('/users/$u/repos'),
]); ]);
return Tuple2(GiteaUser.fromJson(items[0]), return Tuple2(
(items[1] as List).map((v) => GiteaRepository.fromJson(v))); GiteaUser.fromJson(items[0]),
(items[1] as List).map((v) => GiteaRepository.fromJson(v)),
);
}, },
bodyBuilder: (data, _) { bodyBuilder: (data, _) {
final user = data.item1; final user = data.item1;

View File

@ -22,6 +22,8 @@ class _LoginScreenState extends State<LoginScreen> {
String _token = ''; String _token = '';
String _gitlabToken = ''; String _gitlabToken = '';
String _gitlabDomain = 'https://gitlab.com'; String _gitlabDomain = 'https://gitlab.com';
String _giteaToken = '';
String _giteaDomain = 'https://try.gitea.io';
Widget _buildAccountItem(int index) { Widget _buildAccountItem(int index) {
final theme = Provider.of<ThemeModel>(context); final theme = Provider.of<ThemeModel>(context);
@ -146,7 +148,7 @@ class _LoginScreenState extends State<LoginScreen> {
// _buildAddItem( // _buildAddItem(
// text: 'GitLab Account by Token', // text: 'GitLab Account by Token',
// onTap: () async { // onTap: () async {
// var result = // final result =
// await Provider.of<ThemeModel>(context).showConfirm( // await Provider.of<ThemeModel>(context).showConfirm(
// context, // context,
// Column( // Column(
@ -193,6 +195,44 @@ class _LoginScreenState extends State<LoginScreen> {
// } // }
// } // }
// }, // },
// ),
// _buildAddItem(
// text: 'Gitea Account by Token',
// onTap: () async {
// final result =
// await Provider.of<ThemeModel>(context).showConfirm(
// context,
// Column(
// children: <Widget>[
// CupertinoTextField(
// placeholder: 'Domain',
// onChanged: (v) {
// setState(() {
// _giteaDomain = v;
// });
// },
// ),
// SizedBox(height: 8),
// CupertinoTextField(
// placeholder: 'Access token',
// onChanged: (v) {
// setState(() {
// _giteaToken = v;
// });
// },
// ),
// ],
// ),
// );
// if (result == true) {
// try {
// await auth.loginToGitea(_giteaDomain, _giteaToken);
// } catch (err) {
// Provider.of<ThemeModel>(context).showConfirm(
// context, Text('Token invalid: $err'));
// }
// }
// },
// ) // )
], ],
), ),