refactor: rename to auth

This commit is contained in:
Rongjian Zhang 2019-09-27 20:52:38 +08:00
parent ee615097e7
commit 62c53e543d
19 changed files with 66 additions and 87 deletions

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:git_touch/models/code.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/models/theme.dart';
import 'package:git_touch/screens/issues.dart';
import 'package:git_touch/screens/repository.dart';
@ -34,7 +34,7 @@ class _HomeState extends State<Home> {
nextTick(() {
// FIXME:
Provider.of<ThemeModel>(context).init();
Provider.of<SettingsModel>(context).init();
Provider.of<AuthModel>(context).init();
Provider.of<CodeModel>(context).init();
});
}
@ -107,7 +107,7 @@ class _HomeState extends State<Home> {
return SearchScreen();
case 4:
return UserScreen(
Provider.of<SettingsModel>(context).activeAccount.login,
Provider.of<AuthModel>(context).activeAccount.login,
isMe: true,
);
}
@ -115,7 +115,7 @@ class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
var settings = Provider.of<SettingsModel>(context);
var settings = Provider.of<AuthModel>(context);
var themData = ThemeData(
// primaryColor: HSLColor.fromColor(Palette.primary)
// .withLightness(0.3)
@ -182,7 +182,7 @@ class App extends StatelessWidget {
providers: [
ChangeNotifierProvider(builder: (context) => NotificationModel()),
ChangeNotifierProvider(builder: (context) => ThemeModel()),
ChangeNotifierProvider(builder: (context) => SettingsModel()),
ChangeNotifierProvider(builder: (context) => AuthModel()),
ChangeNotifierProvider(builder: (context) => CodeModel()),
],
child: Home(),

View File

@ -4,14 +4,14 @@ import 'package:meta/meta.dart';
part 'account.g.dart';
@JsonSerializable()
class AccountModel {
class Account {
String platform;
String domain;
String token;
String login;
String avatarUrl;
equals(AccountModel a) {
equals(Account a) {
final uri = Uri.parse(domain);
final uriA = Uri.parse(a.domain);
@ -22,7 +22,7 @@ class AccountModel {
uri.port == uriA.port;
}
AccountModel({
Account({
@required this.platform,
@required this.domain,
@required this.token,
@ -30,8 +30,8 @@ class AccountModel {
@required this.avatarUrl,
});
factory AccountModel.fromJson(Map<String, dynamic> json) =>
_$AccountModelFromJson(json);
factory Account.fromJson(Map<String, dynamic> json) =>
_$AccountFromJson(json);
Map<String, dynamic> toJson() => _$AccountModelToJson(this);
Map<String, dynamic> toJson() => _$AccountToJson(this);
}

View File

@ -6,8 +6,8 @@ part of 'account.dart';
// JsonSerializableGenerator
// **************************************************************************
AccountModel _$AccountModelFromJson(Map<String, dynamic> json) {
return AccountModel(
Account _$AccountFromJson(Map<String, dynamic> json) {
return Account(
platform: json['platform'] as String,
domain: json['domain'] as String,
token: json['token'] as String,
@ -16,8 +16,7 @@ AccountModel _$AccountModelFromJson(Map<String, dynamic> json) {
);
}
Map<String, dynamic> _$AccountModelToJson(AccountModel instance) =>
<String, dynamic>{
Map<String, dynamic> _$AccountToJson(Account instance) => <String, dynamic>{
'platform': instance.platform,
'domain': instance.domain,
'token': instance.token,

View File

@ -19,44 +19,26 @@ class PlatformType {
static const gitlab = 'gitlab';
}
// abstract class Model<T> {
// Future<T> query(BuildContext context) {
// var settings = Provider.of<SettingsModel>(context);
// switch (settings.platformType) {
// case PlatformType.github:
// return queryGithub(settings);
// case PlatformType.gitlab:
// return queryGitlab(settings);
// default:
// return null;
// }
// }
// Future<T> queryGithub(SettingsProviderState settings);
// Future<T> queryGitlab(SettingsProviderState settings);
// }
class SettingsModel with ChangeNotifier {
class AuthModel with ChangeNotifier {
static const _apiPrefix = 'https://api.github.com';
List<AccountModel> _accounts;
List<Account> _accounts;
int activeAccountIndex;
StreamSubscription<Uri> _sub;
bool loading = false;
List<AccountModel> get accounts => _accounts;
List<Account> get accounts => _accounts;
bool get ready => _accounts != null;
AccountModel get activeAccount {
Account get activeAccount {
if (activeAccountIndex == null || _accounts == null) return null;
return _accounts[activeAccountIndex];
}
String get token => activeAccount.token;
_setAccounts(AccountModel account) async {
_addAccount(Account account) async {
// Remove previous if duplicated
List<AccountModel> newAccounts = [];
List<Account> newAccounts = [];
for (var a in _accounts) {
if (!account.equals(a)) {
newAccounts.add(a);
@ -107,7 +89,7 @@ class SettingsModel with ChangeNotifier {
}
''', token);
await _setAccounts(AccountModel(
await _addAccount(Account(
platform: PlatformType.github,
domain: 'https://github.com',
token: token,
@ -132,7 +114,7 @@ class SettingsModel with ChangeNotifier {
throw info['message'];
}
await _setAccounts(AccountModel(
await _addAccount(Account(
platform: PlatformType.gitlab,
domain: domain,
token: token,
@ -161,7 +143,7 @@ class SettingsModel with ChangeNotifier {
String str = prefs.getString(StorageKeys.accounts);
print('read accounts: $str');
_accounts = (json.decode(str ?? '[]') as List)
.map((item) => AccountModel.fromJson(item))
.map((item) => Account.fromJson(item))
.toList();
} catch (err) {
print(err);

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/scaffolds/list_stateful.dart';
import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
@ -22,7 +22,7 @@ class CommitsScreen extends StatelessWidget {
params += ', after: "$cursor"';
}
var key = getBranchQueryKey(branch, withParams: true);
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
repository(owner: "$owner", name: "$name") {
$key {

View File

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:primer/primer.dart';
import 'package:provider/provider.dart';
import 'package:share/share.dart';
@ -273,7 +273,7 @@ __typename
}
}
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
repository(owner: "$owner", name: "$name") {
$resource(number: $number) {
@ -323,7 +323,7 @@ __typename
var id = payload['id'] as String;
var operation = isRemove ? 'remove' : 'add';
await Provider.of<SettingsModel>(context).query('''
await Provider.of<AuthModel>(context).query('''
mutation {
${operation}Reaction(input: {subjectId: "$id", content: $emojiKey}) {
clientMutationId

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/scaffolds/list_stateful.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/issue_item.dart';
@ -21,7 +21,7 @@ class IssuesScreen extends StatelessWidget {
var cursorChunk = cursor == null ? '' : ', after: "$cursor"';
var resource = isPullRequest ? 'pullRequests' : 'issues';
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
repository(owner: "$owner", name: "$name") {
$resource(states: OPEN, orderBy: {field: CREATED_AT, direction: DESC}, first: $pageSize$cursorChunk) {

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/scaffolds/single.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:provider/provider.dart';
@ -15,7 +15,7 @@ class LoginScreen extends StatefulWidget {
class _LoginScreenState extends State<LoginScreen> {
Widget _buildAccountItem(int index) {
final settings = Provider.of<SettingsModel>(context);
final settings = Provider.of<AuthModel>(context);
final account = settings.accounts[index];
return Link(
@ -72,7 +72,7 @@ class _LoginScreenState extends State<LoginScreen> {
@override
Widget build(BuildContext context) {
final settings = Provider.of<SettingsModel>(context);
final settings = Provider.of<AuthModel>(context);
return SingleScaffold(
title: AppBarTitle('Select account'),

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/scaffolds/single.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:provider/provider.dart';
@ -33,8 +33,7 @@ class _LoginGitlabScreenState extends State<LoginGitlabScreen> {
MaterialButton(
child: Text('Login'),
onPressed: () {
Provider.of<SettingsModel>(context)
.loginToGitlab(_domain, _token);
Provider.of<AuthModel>(context).loginToGitlab(_domain, _token);
Navigator.of(context).pop();
},
)

View File

@ -6,7 +6,7 @@ import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:provider/provider.dart';
import '../widgets/event_item.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
class NewsFilter {
static const all = 'all';
@ -32,7 +32,7 @@ class NewsScreenState extends State<NewsScreen> {
nextTick(() async {
// Check if there are unread notification items.
// 1 item is enough since count is not displayed for now.
var items = await Provider.of<SettingsModel>(context)
var items = await Provider.of<AuthModel>(context)
.getWithCredentials('/notifications?per_page=1');
if (items is List && items.isNotEmpty) {
@ -49,7 +49,7 @@ class NewsScreenState extends State<NewsScreen> {
}
Future<ListPayload<EventPayload, int>> fetchEvents([int page = 1]) async {
final settings = Provider.of<SettingsModel>(context);
final settings = Provider.of<AuthModel>(context);
final login = settings.activeAccount.login;
List data = await settings.getWithCredentials(
'/users/$login/received_events?page=$page&per_page=$pageSize');

View File

@ -4,7 +4,7 @@ import 'package:git_touch/scaffolds/tab_stateful.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:provider/provider.dart';
import 'package:git_touch/models/notification.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import '../widgets/notification_item.dart';
import '../widgets/list_group.dart';
import '../widgets/link.dart';
@ -18,7 +18,7 @@ class NotificationScreen extends StatefulWidget {
class NotificationScreenState extends State<NotificationScreen> {
Future<Map<String, NotificationGroup>> fetchNotifications(int index) async {
List items = await Provider.of<SettingsModel>(context).getWithCredentials(
List items = await Provider.of<AuthModel>(context).getWithCredentials(
'/notifications?all=${index == 2}&participating=${index == 1}');
var ns = items.map((item) => NotificationPayload.fromJson(item)).toList();
@ -77,7 +77,7 @@ $key: pullRequest(number: ${item.number}) {
schema += '}';
// print(schema);
var data = await Provider.of<SettingsModel>(context).query(schema);
var data = await Provider.of<AuthModel>(context).query(schema);
_groupMap.forEach((repo, group) {
group.items.forEach((item) {
var groupData = data[group.key];
@ -112,7 +112,7 @@ $key: pullRequest(number: ${item.number}) {
Link(
material: false,
onTap: () async {
await Provider.of<SettingsModel>(context)
await Provider.of<AuthModel>(context)
.putWithCredentials('/repos/$repo/notifications');
// await _onSwitchTab(); // TODO:
},

View File

@ -11,7 +11,7 @@ import 'package:git_touch/widgets/table_view.dart';
import 'package:path/path.dart' as path;
import 'package:flutter/material.dart';
import 'package:flutter_highlight/flutter_highlight.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:provider/provider.dart';
import 'package:git_touch/utils/utils.dart';
import 'package:primer/primer.dart';
@ -146,7 +146,7 @@ class ObjectScreen extends StatelessWidget {
return RefreshStatefulScaffold(
title: AppBarTitle(paths.join('/')),
onRefresh: () async {
var data = await Provider.of<SettingsModel>(context).query('''{
var data = await Provider.of<AuthModel>(context).query('''{
repository(owner: "$owner", name: "$name") {
object(expression: "$_expression") {
$_subQuery

View File

@ -10,7 +10,7 @@ import 'package:git_touch/widgets/table_view.dart';
import 'package:git_touch/widgets/user_item.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:share/share.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:provider/provider.dart';
import '../widgets/action.dart';
import '../utils/utils.dart';
@ -57,7 +57,7 @@ class OrganizationScreen extends StatelessWidget {
return RefreshStatefulScaffold(
onRefresh: () async {
// Use pinnableItems instead of organization here due to token permission
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
organization(login: "$login") {
name

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:git_touch/scaffolds/list_stateful.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:provider/provider.dart';
import '../utils/utils.dart';
import 'package:git_touch/widgets/repository_item.dart';
@ -39,7 +39,7 @@ class RepositoriesScreen extends StatelessWidget {
Future<ListPayload> _queryRepos(BuildContext context, [String cursor]) async {
var cursorChunk = cursor == null ? '' : ', after: "$cursor"';
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
$scope(login: "$login") {
$resource(first: $pageSize$cursorChunk, $extra0) {

View File

@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:filesize/filesize.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/scaffolds/refresh_stateful.dart';
import 'package:git_touch/screens/users.dart';
import 'package:git_touch/utils/utils.dart';
@ -38,7 +38,7 @@ class RepositoryScreen extends StatelessWidget {
Future queryRepo(BuildContext context) async {
var branchKey = getBranchQueryKey(branch, withParams: true);
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
repository(owner: "$owner", name: "$name") {
id
@ -127,7 +127,7 @@ class RepositoryScreen extends StatelessWidget {
}
Future<String> fetchReadme(BuildContext context) async {
var data = await Provider.of<SettingsModel>(context)
var data = await Provider.of<AuthModel>(context)
.getWithCredentials('/repos/$owner/$name/readme');
if (data['content'] == null) {
@ -174,11 +174,11 @@ class RepositoryScreen extends StatelessWidget {
text: data[0]['viewerHasStarred'] ? 'Unstar' : 'Star',
onPress: () async {
if (data[0]['viewerHasStarred']) {
await Provider.of<SettingsModel>(context)
await Provider.of<AuthModel>(context)
.deleteWithCredentials('/user/starred/$owner/$name');
data[0]['viewerHasStarred'] = false;
} else {
Provider.of<SettingsModel>(context)
Provider.of<AuthModel>(context)
.putWithCredentials('/user/starred/$owner/$name');
data[0]['viewerHasStarred'] = true;
}
@ -190,12 +190,11 @@ class RepositoryScreen extends StatelessWidget {
: 'Watch',
onPress: () async {
if (data[0]['viewerSubscription'] == 'SUBSCRIBED') {
await Provider.of<SettingsModel>(context)
.deleteWithCredentials(
'/repos/$owner/$name/subscription');
await Provider.of<AuthModel>(context).deleteWithCredentials(
'/repos/$owner/$name/subscription');
data[0]['viewerSubscription'] = 'UNSUBSCRIBED';
} else {
Provider.of<SettingsModel>(context)
Provider.of<AuthModel>(context)
.putWithCredentials('/repos/$owner/$name/subscription');
data[0]['viewerSubscription'] = 'SUBSCRIBED';
}

View File

@ -6,7 +6,7 @@ import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/issue_item.dart';
import 'package:git_touch/widgets/user_item.dart';
import 'package:provider/provider.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import '../utils/utils.dart';
import 'package:git_touch/widgets/repository_item.dart';
@ -44,7 +44,7 @@ class _SearchScreenState extends State<SearchScreen> {
_loading = true;
});
try {
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
repository: search(first: $pageSize, type: REPOSITORY, query: "$keyword") {
nodes {

View File

@ -10,7 +10,7 @@ import 'package:primer/primer.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:share/share.dart';
import 'package:github_contributions/github_contributions.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:provider/provider.dart';
import '../widgets/entry_item.dart';
import 'package:git_touch/widgets/repository_item.dart';
@ -27,7 +27,7 @@ class UserScreen extends StatelessWidget {
UserScreen(this.login, {this.isMe = false});
Future query(BuildContext context) async {
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
user(login: "$login") {
name
@ -164,11 +164,11 @@ class UserScreen extends StatelessWidget {
text: data[0]['viewerIsFollowing'] ? 'Unfollow' : 'Follow',
onPress: () async {
if (data[0]['viewerIsFollowing']) {
await Provider.of<SettingsModel>(context)
await Provider.of<AuthModel>(context)
.deleteWithCredentials('/user/following/$login');
data[0]['viewerIsFollowing'] = false;
} else {
Provider.of<SettingsModel>(context)
Provider.of<AuthModel>(context)
.putWithCredentials('/user/following/$login');
data[0]['viewerIsFollowing'] = true;
}

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:git_touch/scaffolds/list_stateful.dart';
import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/user_item.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:provider/provider.dart';
import '../utils/utils.dart';
@ -40,7 +40,7 @@ class UsersScreen extends StatelessWidget {
Future<ListPayload> _queryUsers(BuildContext context, [String cursor]) async {
var cursorChunk = cursor == null ? '' : ', after: "$cursor"';
var data = await Provider.of<SettingsModel>(context).query('''
var data = await Provider.of<AuthModel>(context).query('''
{
$scope($params) {
$resource(first: $pageSize$cursorChunk) {

View File

@ -7,7 +7,7 @@ import 'package:url_launcher/url_launcher.dart';
import '../utils/utils.dart';
import '../screens/issue.dart';
// import '../screens/not_found.dart';
import 'package:git_touch/models/settings.dart';
import 'package:git_touch/models/auth.dart';
import 'package:provider/provider.dart';
import 'link.dart';
@ -82,7 +82,7 @@ class _NotificationItemState extends State<NotificationItem> {
loading = true;
});
try {
await Provider.of<SettingsModel>(context)
await Provider.of<AuthModel>(context)
.patchWithCredentials('/notifications/threads/' + payload.id);
widget.markAsRead();
} finally {