refactor: list scaffold
This commit is contained in:
parent
2d9610170b
commit
1fe7e1fdc9
|
@ -26,13 +26,11 @@ class ListStatefulScaffold<T, K> extends StatefulWidget {
|
||||||
final Widget title;
|
final Widget title;
|
||||||
final Widget Function() actionBuilder;
|
final Widget Function() actionBuilder;
|
||||||
final Widget Function(T payload) itemBuilder;
|
final Widget Function(T payload) itemBuilder;
|
||||||
final Future<ListPayload<T, K>> Function() onRefresh;
|
|
||||||
final Future<ListPayload<T, K>> Function(K cursor) onLoadMore;
|
final Future<ListPayload<T, K>> Function(K cursor) onLoadMore;
|
||||||
|
|
||||||
ListStatefulScaffold({
|
ListStatefulScaffold({
|
||||||
@required this.title,
|
@required this.title,
|
||||||
@required this.itemBuilder,
|
@required this.itemBuilder,
|
||||||
@required this.onRefresh,
|
|
||||||
@required this.onLoadMore,
|
@required this.onLoadMore,
|
||||||
this.actionBuilder,
|
this.actionBuilder,
|
||||||
});
|
});
|
||||||
|
@ -97,7 +95,7 @@ class _ListStatefulScaffoldState<T, K>
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
var _payload = await widget.onRefresh();
|
var _payload = await widget.onLoadMore(null);
|
||||||
items = _payload.items;
|
items = _payload.items;
|
||||||
cursor = _payload.cursor;
|
cursor = _payload.cursor;
|
||||||
hasMore = _payload.hasMore;
|
hasMore = _payload.hasMore;
|
||||||
|
|
|
@ -12,11 +12,14 @@ class BbCommitsScreen extends StatelessWidget {
|
||||||
final String ref;
|
final String ref;
|
||||||
BbCommitsScreen(this.owner, this.name, this.ref);
|
BbCommitsScreen(this.owner, this.name, this.ref);
|
||||||
|
|
||||||
Future<ListPayload<BbCommit, String>> _query(BuildContext context,
|
@override
|
||||||
[String nextUrl]) async {
|
Widget build(BuildContext context) {
|
||||||
final res = await context
|
final auth = Provider.of<AuthModel>(context);
|
||||||
.read<AuthModel>()
|
return ListStatefulScaffold<BbCommit, String>(
|
||||||
.fetchBbWithPage(nextUrl ?? '/repositories/$owner/$name/commits/$ref');
|
title: AppBarTitle('Commits'),
|
||||||
|
onLoadMore: (nextUrl) async {
|
||||||
|
final res = await context.read<AuthModel>().fetchBbWithPage(
|
||||||
|
nextUrl ?? '/repositories/$owner/$name/commits/$ref');
|
||||||
return ListPayload(
|
return ListPayload(
|
||||||
cursor: res.cursor,
|
cursor: res.cursor,
|
||||||
hasMore: res.hasMore,
|
hasMore: res.hasMore,
|
||||||
|
@ -24,15 +27,7 @@ class BbCommitsScreen extends StatelessWidget {
|
||||||
for (var v in res.data) BbCommit.fromJson(v),
|
for (var v in res.data) BbCommit.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final auth = Provider.of<AuthModel>(context);
|
|
||||||
return ListStatefulScaffold<BbCommit, String>(
|
|
||||||
title: AppBarTitle('Commits'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return CommitItem(
|
return CommitItem(
|
||||||
url: '${auth.activeAccount.domain}/$owner/$name/commits/${v.hash}',
|
url: '${auth.activeAccount.domain}/$owner/$name/commits/${v.hash}',
|
||||||
|
|
|
@ -7,8 +7,11 @@ import 'package:git_touch/widgets/repository_item.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class BbExploreScreen extends StatelessWidget {
|
class BbExploreScreen extends StatelessWidget {
|
||||||
Future<ListPayload<BbRepo, String>> _query(BuildContext context,
|
@override
|
||||||
[String nextUrl]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<BbRepo, String>(
|
||||||
|
title: AppBarTitle('Explore'),
|
||||||
|
onLoadMore: (nextUrl) async {
|
||||||
final res = await context.read<AuthModel>().fetchBbWithPage(
|
final res = await context.read<AuthModel>().fetchBbWithPage(
|
||||||
nextUrl ?? '/repositories?role=member&sort=-updated_on');
|
nextUrl ?? '/repositories?role=member&sort=-updated_on');
|
||||||
return ListPayload(
|
return ListPayload(
|
||||||
|
@ -18,14 +21,7 @@ class BbExploreScreen extends StatelessWidget {
|
||||||
for (var v in res.data) BbRepo.fromJson(v),
|
for (var v in res.data) BbRepo.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<BbRepo, String>(
|
|
||||||
title: AppBarTitle('Explore'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return RepositoryItem.bb(payload: v);
|
return RepositoryItem.bb(payload: v);
|
||||||
},
|
},
|
||||||
|
|
|
@ -12,8 +12,12 @@ class BbIssuesScreen extends StatelessWidget {
|
||||||
final String ref;
|
final String ref;
|
||||||
BbIssuesScreen(this.owner, this.name, this.ref);
|
BbIssuesScreen(this.owner, this.name, this.ref);
|
||||||
|
|
||||||
Future<ListPayload<BbIssues, String>> _query(BuildContext context,
|
@override
|
||||||
[String nextUrl]) async {
|
Widget build(BuildContext context) {
|
||||||
|
final auth = Provider.of<AuthModel>(context);
|
||||||
|
return ListStatefulScaffold<BbIssues, String>(
|
||||||
|
title: AppBarTitle('Issues'),
|
||||||
|
onLoadMore: (nextUrl) async {
|
||||||
final res = await context
|
final res = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.fetchBbWithPage(nextUrl ?? '/repositories/$owner/$name/issues');
|
.fetchBbWithPage(nextUrl ?? '/repositories/$owner/$name/issues');
|
||||||
|
@ -24,15 +28,7 @@ class BbIssuesScreen extends StatelessWidget {
|
||||||
for (var v in res.data) BbIssues.fromJson(v),
|
for (var v in res.data) BbIssues.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final auth = Provider.of<AuthModel>(context);
|
|
||||||
return ListStatefulScaffold<BbIssues, String>(
|
|
||||||
title: AppBarTitle('Issues'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
int issueNumber =
|
int issueNumber =
|
||||||
int.parse(v.issueLink.replaceFirst(RegExp(r'.*\/'), ''));
|
int.parse(v.issueLink.replaceFirst(RegExp(r'.*\/'), ''));
|
||||||
|
|
|
@ -12,11 +12,14 @@ class BbPullsScreen extends StatelessWidget {
|
||||||
final String ref;
|
final String ref;
|
||||||
BbPullsScreen(this.owner, this.name, this.ref);
|
BbPullsScreen(this.owner, this.name, this.ref);
|
||||||
|
|
||||||
Future<ListPayload<BbPulls, String>> _query(BuildContext context,
|
@override
|
||||||
[String nextUrl]) async {
|
Widget build(BuildContext context) {
|
||||||
final res = await context
|
final auth = Provider.of<AuthModel>(context);
|
||||||
.read<AuthModel>()
|
return ListStatefulScaffold<BbPulls, String>(
|
||||||
.fetchBbWithPage(nextUrl ?? '/repositories/$owner/$name/pullrequests');
|
title: AppBarTitle('Pull requests'),
|
||||||
|
onLoadMore: (nextUrl) async {
|
||||||
|
final res = await context.read<AuthModel>().fetchBbWithPage(
|
||||||
|
nextUrl ?? '/repositories/$owner/$name/pullrequests');
|
||||||
return ListPayload(
|
return ListPayload(
|
||||||
cursor: res.cursor,
|
cursor: res.cursor,
|
||||||
hasMore: res.hasMore,
|
hasMore: res.hasMore,
|
||||||
|
@ -24,15 +27,7 @@ class BbPullsScreen extends StatelessWidget {
|
||||||
for (var v in res.data) BbPulls.fromJson(v),
|
for (var v in res.data) BbPulls.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final auth = Provider.of<AuthModel>(context);
|
|
||||||
return ListStatefulScaffold<BbPulls, String>(
|
|
||||||
title: AppBarTitle('Pull requests'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
int pullNumber =
|
int pullNumber =
|
||||||
int.parse(v.pullRequestLink.replaceFirst(RegExp(r'.*\/'), ''));
|
int.parse(v.pullRequestLink.replaceFirst(RegExp(r'.*\/'), ''));
|
||||||
|
|
|
@ -8,8 +8,11 @@ import 'package:provider/provider.dart';
|
||||||
import 'package:timeago/timeago.dart' as timeago;
|
import 'package:timeago/timeago.dart' as timeago;
|
||||||
|
|
||||||
class BbTeamsScreen extends StatelessWidget {
|
class BbTeamsScreen extends StatelessWidget {
|
||||||
Future<ListPayload<BbUser, String>> _query(BuildContext context,
|
@override
|
||||||
[String nextUrl]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<BbUser, String>(
|
||||||
|
title: AppBarTitle('Teams'),
|
||||||
|
onLoadMore: (nextUrl) async {
|
||||||
final res = await context
|
final res = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.fetchBbWithPage(nextUrl ?? '/teams?role=member');
|
.fetchBbWithPage(nextUrl ?? '/teams?role=member');
|
||||||
|
@ -20,14 +23,7 @@ class BbTeamsScreen extends StatelessWidget {
|
||||||
for (var v in res.data) BbUser.fromJson(v),
|
for (var v in res.data) BbUser.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<BbUser, String>(
|
|
||||||
title: AppBarTitle('Teams'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return UserItem(
|
return UserItem(
|
||||||
login: v.username,
|
login: v.username,
|
||||||
|
|
|
@ -13,25 +13,6 @@ class GhCommitsScreen extends StatelessWidget {
|
||||||
final String branch;
|
final String branch;
|
||||||
GhCommitsScreen(this.owner, this.name, {this.branch});
|
GhCommitsScreen(this.owner, this.name, {this.branch});
|
||||||
|
|
||||||
Future<ListPayload<GhCommitsCommit, String>> _query(BuildContext context,
|
|
||||||
[String cursor]) async {
|
|
||||||
final res = await context.read<AuthModel>().gqlClient.execute(
|
|
||||||
GhCommitsQuery(
|
|
||||||
variables: GhCommitsArguments(
|
|
||||||
owner: owner,
|
|
||||||
name: name,
|
|
||||||
hasRef: branch != null,
|
|
||||||
ref: branch ?? '',
|
|
||||||
after: cursor)));
|
|
||||||
final ref = res.data.repository.defaultBranchRef ?? res.data.repository.ref;
|
|
||||||
final history = (ref.target as GhCommitsCommit).history;
|
|
||||||
return ListPayload(
|
|
||||||
cursor: history.pageInfo.endCursor,
|
|
||||||
hasMore: history.pageInfo.hasNextPage,
|
|
||||||
items: history.nodes,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildStatus(GhCommitsStatusState state) {
|
Widget _buildStatus(GhCommitsStatusState state) {
|
||||||
const size = 18.0;
|
const size = 18.0;
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
@ -48,8 +29,24 @@ class GhCommitsScreen extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListStatefulScaffold<GhCommitsCommit, String>(
|
return ListStatefulScaffold<GhCommitsCommit, String>(
|
||||||
title: AppBarTitle('Commits'),
|
title: AppBarTitle('Commits'),
|
||||||
onRefresh: () => _query(context),
|
onLoadMore: (cursor) async {
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
final res = await context.read<AuthModel>().gqlClient.execute(
|
||||||
|
GhCommitsQuery(
|
||||||
|
variables: GhCommitsArguments(
|
||||||
|
owner: owner,
|
||||||
|
name: name,
|
||||||
|
hasRef: branch != null,
|
||||||
|
ref: branch ?? '',
|
||||||
|
after: cursor)));
|
||||||
|
final ref =
|
||||||
|
res.data.repository.defaultBranchRef ?? res.data.repository.ref;
|
||||||
|
final history = (ref.target as GhCommitsCommit).history;
|
||||||
|
return ListPayload(
|
||||||
|
cursor: history.pageInfo.endCursor,
|
||||||
|
hasMore: history.pageInfo.hasNextPage,
|
||||||
|
items: history.nodes,
|
||||||
|
);
|
||||||
|
},
|
||||||
itemBuilder: (payload) {
|
itemBuilder: (payload) {
|
||||||
final login = payload.author?.user?.login;
|
final login = payload.author?.user?.login;
|
||||||
return CommitItem(
|
return CommitItem(
|
||||||
|
|
|
@ -12,8 +12,11 @@ class GhContributorsScreen extends StatelessWidget {
|
||||||
final String name;
|
final String name;
|
||||||
GhContributorsScreen(this.owner, this.name);
|
GhContributorsScreen(this.owner, this.name);
|
||||||
|
|
||||||
Future<ListPayload<GithubContributorItem, int>> _query(BuildContext context,
|
Widget build(BuildContext context) {
|
||||||
[int page = 1]) async {
|
return ListStatefulScaffold<GithubContributorItem, int>(
|
||||||
|
title: AppBarTitle('Contributors'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final res = await context
|
final res = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.ghClient
|
.ghClient
|
||||||
|
@ -27,13 +30,7 @@ class GhContributorsScreen extends StatelessWidget {
|
||||||
items: res,
|
items: res,
|
||||||
hasMore: res.isNotEmpty,
|
hasMore: res.isNotEmpty,
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GithubContributorItem, int>(
|
|
||||||
title: AppBarTitle('Contributors'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
final String login = v.login;
|
final String login = v.login;
|
||||||
return ContributorItem(
|
return ContributorItem(
|
||||||
|
|
|
@ -12,8 +12,13 @@ class GhEventsScreen extends StatelessWidget {
|
||||||
final String login;
|
final String login;
|
||||||
GhEventsScreen(this.login);
|
GhEventsScreen(this.login);
|
||||||
|
|
||||||
Future<ListPayload<GithubEvent, int>> fetchEvents(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(context) {
|
||||||
|
return ListStatefulScaffold<GithubEvent, int>(
|
||||||
|
title: AppBarTitle('Events'),
|
||||||
|
itemBuilder: (payload) => EventItem(payload),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final events = await context.read<AuthModel>().ghClient.getJSON(
|
final events = await context.read<AuthModel>().ghClient.getJSON(
|
||||||
'/users/$login/events?page=$page&per_page=$pageSize',
|
'/users/$login/events?page=$page&per_page=$pageSize',
|
||||||
convert: (vs) => [for (var v in vs) GithubEvent.fromJson(v)]);
|
convert: (vs) => [for (var v in vs) GithubEvent.fromJson(v)]);
|
||||||
|
@ -22,15 +27,7 @@ class GhEventsScreen extends StatelessWidget {
|
||||||
hasMore: events.length == pageSize,
|
hasMore: events.length == pageSize,
|
||||||
items: events,
|
items: events,
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(context) {
|
|
||||||
return ListStatefulScaffold<GithubEvent, int>(
|
|
||||||
title: AppBarTitle('Events'),
|
|
||||||
itemBuilder: (payload) => EventItem(payload),
|
|
||||||
onRefresh: () => fetchEvents(context),
|
|
||||||
onLoadMore: (page) => fetchEvents(context, page),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,22 +14,6 @@ class GhFilesScreen extends StatelessWidget {
|
||||||
final int pullNumber;
|
final int pullNumber;
|
||||||
GhFilesScreen(this.owner, this.name, this.pullNumber);
|
GhFilesScreen(this.owner, this.name, this.pullNumber);
|
||||||
|
|
||||||
Future<ListPayload<GithubFilesItem, int>> _query(BuildContext context,
|
|
||||||
[int page = 1]) async {
|
|
||||||
final res = await context
|
|
||||||
.read<AuthModel>()
|
|
||||||
.ghClient
|
|
||||||
.getJSON<List, List<GithubFilesItem>>(
|
|
||||||
'/repos/$owner/$name/pulls/$pullNumber/files?page=$page',
|
|
||||||
convert: (vs) => [for (var v in vs) GithubFilesItem.fromJson(v)],
|
|
||||||
);
|
|
||||||
return ListPayload(
|
|
||||||
cursor: page + 1,
|
|
||||||
items: res,
|
|
||||||
hasMore: res.isNotEmpty,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListStatefulScaffold<GithubFilesItem, int>(
|
return ListStatefulScaffold<GithubFilesItem, int>(
|
||||||
title: AppBarTitle('Files'),
|
title: AppBarTitle('Files'),
|
||||||
|
@ -42,8 +26,21 @@ class GhFilesScreen extends StatelessWidget {
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onRefresh: () => _query(context),
|
onLoadMore: (page) async {
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
page = page ?? 1;
|
||||||
|
final res = await context
|
||||||
|
.read<AuthModel>()
|
||||||
|
.ghClient
|
||||||
|
.getJSON<List, List<GithubFilesItem>>(
|
||||||
|
'/repos/$owner/$name/pulls/$pullNumber/files?page=$page',
|
||||||
|
convert: (vs) => [for (var v in vs) GithubFilesItem.fromJson(v)],
|
||||||
|
);
|
||||||
|
return ListPayload(
|
||||||
|
cursor: page + 1,
|
||||||
|
items: res,
|
||||||
|
hasMore: res.isNotEmpty,
|
||||||
|
);
|
||||||
|
},
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return FilesItem(
|
return FilesItem(
|
||||||
filename: v.filename,
|
filename: v.filename,
|
||||||
|
|
|
@ -11,8 +11,12 @@ class GhGistsScreen extends StatelessWidget {
|
||||||
final String login;
|
final String login;
|
||||||
GhGistsScreen(this.login);
|
GhGistsScreen(this.login);
|
||||||
|
|
||||||
Future<ListPayload<GithubGistsItem, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GithubGistsItem, int>(
|
||||||
|
title: AppBarTitle('Gists'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final res = await context
|
final res = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.ghClient
|
.ghClient
|
||||||
|
@ -25,14 +29,7 @@ class GhGistsScreen extends StatelessWidget {
|
||||||
items: res,
|
items: res,
|
||||||
hasMore: res.isNotEmpty,
|
hasMore: res.isNotEmpty,
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GithubGistsItem, int>(
|
|
||||||
title: AppBarTitle('Gists'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return GistsItem(
|
return GistsItem(
|
||||||
description: v.description,
|
description: v.description,
|
||||||
|
|
|
@ -14,9 +14,17 @@ class GhIssuesScreen extends StatelessWidget {
|
||||||
final String name;
|
final String name;
|
||||||
GhIssuesScreen(this.owner, this.name);
|
GhIssuesScreen(this.owner, this.name);
|
||||||
|
|
||||||
Future<ListPayload<GhIssuesIssue, String>> _query(BuildContext context,
|
@override
|
||||||
[String cursor]) async {
|
Widget build(BuildContext context) {
|
||||||
final res = await context.read<AuthModel>().gqlClient.execute(GhIssuesQuery(
|
return ListStatefulScaffold<GhIssuesIssue, String>(
|
||||||
|
title: AppBarTitle('Issues'),
|
||||||
|
actionBuilder: () => ActionEntry(
|
||||||
|
iconData: Octicons.plus,
|
||||||
|
url: '/github/$owner/$name/issues/new',
|
||||||
|
),
|
||||||
|
onLoadMore: (cursor) async {
|
||||||
|
final res =
|
||||||
|
await context.read<AuthModel>().gqlClient.execute(GhIssuesQuery(
|
||||||
variables: GhIssuesArguments(
|
variables: GhIssuesArguments(
|
||||||
owner: owner,
|
owner: owner,
|
||||||
name: name,
|
name: name,
|
||||||
|
@ -28,18 +36,7 @@ class GhIssuesScreen extends StatelessWidget {
|
||||||
hasMore: issues.pageInfo.hasNextPage,
|
hasMore: issues.pageInfo.hasNextPage,
|
||||||
items: issues.nodes,
|
items: issues.nodes,
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GhIssuesIssue, String>(
|
|
||||||
title: AppBarTitle('Issues'),
|
|
||||||
actionBuilder: () => ActionEntry(
|
|
||||||
iconData: Octicons.plus,
|
|
||||||
url: '/github/$owner/$name/issues/new',
|
|
||||||
),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (p) => IssueItem(
|
itemBuilder: (p) => IssueItem(
|
||||||
author: p.author?.login,
|
author: p.author?.login,
|
||||||
avatarUrl: p.author?.avatarUrl,
|
avatarUrl: p.author?.avatarUrl,
|
||||||
|
|
|
@ -32,7 +32,13 @@ class GhNewsScreenState extends State<GhNewsScreen> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<ListPayload<GithubEvent, int>> fetchEvents([int page = 1]) async {
|
@override
|
||||||
|
Widget build(context) {
|
||||||
|
return ListStatefulScaffold<GithubEvent, int>(
|
||||||
|
title: AppBarTitle('News'),
|
||||||
|
itemBuilder: (payload) => EventItem(payload),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final auth = context.read<AuthModel>();
|
final auth = context.read<AuthModel>();
|
||||||
final login = auth.activeAccount.login;
|
final login = auth.activeAccount.login;
|
||||||
|
|
||||||
|
@ -45,15 +51,7 @@ class GhNewsScreenState extends State<GhNewsScreen> {
|
||||||
hasMore: events.length == pageSize,
|
hasMore: events.length == pageSize,
|
||||||
items: events,
|
items: events,
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(context) {
|
|
||||||
return ListStatefulScaffold<GithubEvent, int>(
|
|
||||||
title: AppBarTitle('News'),
|
|
||||||
itemBuilder: (payload) => EventItem(payload),
|
|
||||||
onRefresh: fetchEvents,
|
|
||||||
onLoadMore: (page) => fetchEvents(page),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,12 @@ class GhOrgReposScreen extends StatelessWidget {
|
||||||
final String owner;
|
final String owner;
|
||||||
GhOrgReposScreen(this.owner);
|
GhOrgReposScreen(this.owner);
|
||||||
|
|
||||||
Future<ListPayload<Repository, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<Repository, int>(
|
||||||
|
title: AppBarTitle('Repositories'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final rs = await context
|
final rs = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.ghClient
|
.ghClient
|
||||||
|
@ -30,14 +34,7 @@ class GhOrgReposScreen extends StatelessWidget {
|
||||||
items: rs,
|
items: rs,
|
||||||
hasMore: rs.isNotEmpty, // TODO:
|
hasMore: rs.isNotEmpty, // TODO:
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<Repository, int>(
|
|
||||||
title: AppBarTitle('Repositories'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return RepositoryItem.gh(
|
return RepositoryItem.gh(
|
||||||
owner: v.owner.login,
|
owner: v.owner.login,
|
||||||
|
|
|
@ -11,9 +11,11 @@ class GhUserOrganizationScreen extends StatelessWidget {
|
||||||
final String login;
|
final String login;
|
||||||
GhUserOrganizationScreen(this.login);
|
GhUserOrganizationScreen(this.login);
|
||||||
|
|
||||||
Future<ListPayload<GithubUserOrganizationItem, int>> _query(
|
Widget build(BuildContext context) {
|
||||||
BuildContext context,
|
return ListStatefulScaffold<GithubUserOrganizationItem, int>(
|
||||||
[int page = 1]) async {
|
title: AppBarTitle('Organizations'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final res = await context
|
final res = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.ghClient
|
.ghClient
|
||||||
|
@ -27,13 +29,7 @@ class GhUserOrganizationScreen extends StatelessWidget {
|
||||||
items: res,
|
items: res,
|
||||||
hasMore: res.isNotEmpty,
|
hasMore: res.isNotEmpty,
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GithubUserOrganizationItem, int>(
|
|
||||||
title: AppBarTitle('Organizations'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return UserItem.gh(
|
return UserItem.gh(
|
||||||
avatarUrl: v.avatarUrl,
|
avatarUrl: v.avatarUrl,
|
||||||
|
|
|
@ -12,9 +12,13 @@ class GhPullsScreen extends StatelessWidget {
|
||||||
final String name;
|
final String name;
|
||||||
GhPullsScreen(this.owner, this.name);
|
GhPullsScreen(this.owner, this.name);
|
||||||
|
|
||||||
Future<ListPayload<GhPullsPullRequest, String>> _query(BuildContext context,
|
@override
|
||||||
[String cursor]) async {
|
Widget build(BuildContext context) {
|
||||||
final res = await context.read<AuthModel>().gqlClient.execute(GhPullsQuery(
|
return ListStatefulScaffold<GhPullsPullRequest, String>(
|
||||||
|
title: AppBarTitle('Pull requests'),
|
||||||
|
onLoadMore: (cursor) async {
|
||||||
|
final res =
|
||||||
|
await context.read<AuthModel>().gqlClient.execute(GhPullsQuery(
|
||||||
variables: GhPullsArguments(
|
variables: GhPullsArguments(
|
||||||
owner: owner,
|
owner: owner,
|
||||||
name: name,
|
name: name,
|
||||||
|
@ -26,14 +30,7 @@ class GhPullsScreen extends StatelessWidget {
|
||||||
hasMore: pulls.pageInfo.hasNextPage,
|
hasMore: pulls.pageInfo.hasNextPage,
|
||||||
items: pulls.nodes,
|
items: pulls.nodes,
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GhPullsPullRequest, String>(
|
|
||||||
title: AppBarTitle('Pull requests'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (p) => IssueItem(
|
itemBuilder: (p) => IssueItem(
|
||||||
isPr: true,
|
isPr: true,
|
||||||
author: p.author?.login,
|
author: p.author?.login,
|
||||||
|
|
|
@ -19,8 +19,11 @@ class GhReposScreen extends StatelessWidget {
|
||||||
: title = 'Stars',
|
: title = 'Stars',
|
||||||
isStar = true;
|
isStar = true;
|
||||||
|
|
||||||
Future<ListPayload<GhReposRepository, String>> _query(BuildContext context,
|
@override
|
||||||
[String cursor]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GhReposRepository, String>(
|
||||||
|
title: AppBarTitle(title),
|
||||||
|
onLoadMore: (cursor) async {
|
||||||
final auth = context.read<AuthModel>();
|
final auth = context.read<AuthModel>();
|
||||||
final res = await auth.gqlClient.execute(GhReposQuery(
|
final res = await auth.gqlClient.execute(GhReposQuery(
|
||||||
variables:
|
variables:
|
||||||
|
@ -39,14 +42,7 @@ class GhReposScreen extends StatelessWidget {
|
||||||
hasMore: data.repositories.pageInfo.hasNextPage,
|
hasMore: data.repositories.pageInfo.hasNextPage,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GhReposRepository, String>(
|
|
||||||
title: AppBarTitle(title),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return RepositoryItem.gh(
|
return RepositoryItem.gh(
|
||||||
owner: v.owner.login,
|
owner: v.owner.login,
|
||||||
|
|
|
@ -40,61 +40,6 @@ class GhUsersScreen extends StatelessWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<ListPayload<GhUsersUser, String>> _queryUsers(BuildContext context,
|
|
||||||
[String cursor]) async {
|
|
||||||
final auth = context.read<AuthModel>();
|
|
||||||
final res = await auth.gqlClient.execute(GhUsersQuery(
|
|
||||||
variables: GhUsersArguments(
|
|
||||||
login: login,
|
|
||||||
repoName: repoName,
|
|
||||||
isFollowers: type == UsersScreenType.follower,
|
|
||||||
isFollowing: type == UsersScreenType.following,
|
|
||||||
isStar: type == UsersScreenType.star,
|
|
||||||
isWatch: type == UsersScreenType.watch,
|
|
||||||
isMember: type == UsersScreenType.member,
|
|
||||||
after: cursor)));
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case UsersScreenType.follower:
|
|
||||||
final payload = res.data.user.followers;
|
|
||||||
return ListPayload(
|
|
||||||
cursor: payload.pageInfo.endCursor,
|
|
||||||
hasMore: payload.pageInfo.hasNextPage,
|
|
||||||
items: payload.nodes,
|
|
||||||
);
|
|
||||||
case UsersScreenType.following:
|
|
||||||
final payload = res.data.user.following;
|
|
||||||
return ListPayload(
|
|
||||||
cursor: payload.pageInfo.endCursor,
|
|
||||||
hasMore: payload.pageInfo.hasNextPage,
|
|
||||||
items: payload.nodes,
|
|
||||||
);
|
|
||||||
case UsersScreenType.member:
|
|
||||||
final payload = res.data.organization.membersWithRole;
|
|
||||||
return ListPayload(
|
|
||||||
cursor: payload.pageInfo.endCursor,
|
|
||||||
hasMore: payload.pageInfo.hasNextPage,
|
|
||||||
items: payload.nodes,
|
|
||||||
);
|
|
||||||
case UsersScreenType.watch:
|
|
||||||
final payload = res.data.repository.watchers;
|
|
||||||
return ListPayload(
|
|
||||||
cursor: payload.pageInfo.endCursor,
|
|
||||||
hasMore: payload.pageInfo.hasNextPage,
|
|
||||||
items: payload.nodes,
|
|
||||||
);
|
|
||||||
case UsersScreenType.star:
|
|
||||||
final payload = res.data.repository.stargazers;
|
|
||||||
return ListPayload(
|
|
||||||
cursor: payload.pageInfo.endCursor,
|
|
||||||
hasMore: payload.pageInfo.hasNextPage,
|
|
||||||
items: payload.nodes,
|
|
||||||
);
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildBio(BuildContext context, String company, String location,
|
Widget _buildBio(BuildContext context, String company, String location,
|
||||||
DateTime createdAt) {
|
DateTime createdAt) {
|
||||||
final theme = Provider.of<ThemeModel>(context);
|
final theme = Provider.of<ThemeModel>(context);
|
||||||
|
@ -143,8 +88,59 @@ class GhUsersScreen extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListStatefulScaffold<GhUsersUser, String>(
|
return ListStatefulScaffold<GhUsersUser, String>(
|
||||||
title: AppBarTitle(_title),
|
title: AppBarTitle(_title),
|
||||||
onRefresh: () => _queryUsers(context),
|
onLoadMore: (cursor) async {
|
||||||
onLoadMore: (cursor) => _queryUsers(context, cursor),
|
final auth = context.read<AuthModel>();
|
||||||
|
final res = await auth.gqlClient.execute(GhUsersQuery(
|
||||||
|
variables: GhUsersArguments(
|
||||||
|
login: login,
|
||||||
|
repoName: repoName,
|
||||||
|
isFollowers: type == UsersScreenType.follower,
|
||||||
|
isFollowing: type == UsersScreenType.following,
|
||||||
|
isStar: type == UsersScreenType.star,
|
||||||
|
isWatch: type == UsersScreenType.watch,
|
||||||
|
isMember: type == UsersScreenType.member,
|
||||||
|
after: cursor)));
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case UsersScreenType.follower:
|
||||||
|
final payload = res.data.user.followers;
|
||||||
|
return ListPayload(
|
||||||
|
cursor: payload.pageInfo.endCursor,
|
||||||
|
hasMore: payload.pageInfo.hasNextPage,
|
||||||
|
items: payload.nodes,
|
||||||
|
);
|
||||||
|
case UsersScreenType.following:
|
||||||
|
final payload = res.data.user.following;
|
||||||
|
return ListPayload(
|
||||||
|
cursor: payload.pageInfo.endCursor,
|
||||||
|
hasMore: payload.pageInfo.hasNextPage,
|
||||||
|
items: payload.nodes,
|
||||||
|
);
|
||||||
|
case UsersScreenType.member:
|
||||||
|
final payload = res.data.organization.membersWithRole;
|
||||||
|
return ListPayload(
|
||||||
|
cursor: payload.pageInfo.endCursor,
|
||||||
|
hasMore: payload.pageInfo.hasNextPage,
|
||||||
|
items: payload.nodes,
|
||||||
|
);
|
||||||
|
case UsersScreenType.watch:
|
||||||
|
final payload = res.data.repository.watchers;
|
||||||
|
return ListPayload(
|
||||||
|
cursor: payload.pageInfo.endCursor,
|
||||||
|
hasMore: payload.pageInfo.hasNextPage,
|
||||||
|
items: payload.nodes,
|
||||||
|
);
|
||||||
|
case UsersScreenType.star:
|
||||||
|
final payload = res.data.repository.stargazers;
|
||||||
|
return ListPayload(
|
||||||
|
cursor: payload.pageInfo.endCursor,
|
||||||
|
hasMore: payload.pageInfo.hasNextPage,
|
||||||
|
items: payload.nodes,
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
itemBuilder: (payload) {
|
itemBuilder: (payload) {
|
||||||
return UserItem.gh(
|
return UserItem.gh(
|
||||||
login: payload.login,
|
login: payload.login,
|
||||||
|
|
|
@ -12,24 +12,22 @@ class GlCommitsScreen extends StatelessWidget {
|
||||||
// final String branch; // TODO:
|
// final String branch; // TODO:
|
||||||
GlCommitsScreen(this.id, {this.prefix});
|
GlCommitsScreen(this.id, {this.prefix});
|
||||||
|
|
||||||
Future<ListPayload<GitlabCommit, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GitlabCommit, int>(
|
||||||
|
title: AppBarTitle('Commits'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final auth = context.read<AuthModel>();
|
final auth = context.read<AuthModel>();
|
||||||
final res = await auth
|
final res = await auth
|
||||||
.fetchGitlabWithPage('/projects/$id/repository/commits?page=$page');
|
.fetchGitlabWithPage('/projects/$id/repository/commits?page=$page');
|
||||||
return ListPayload(
|
return ListPayload(
|
||||||
cursor: res.cursor,
|
cursor: res.cursor,
|
||||||
hasMore: res.hasMore,
|
hasMore: res.hasMore,
|
||||||
items: (res.data as List).map((v) => GitlabCommit.fromJson(v)).toList(),
|
items:
|
||||||
|
(res.data as List).map((v) => GitlabCommit.fromJson(v)).toList(),
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GitlabCommit, int>(
|
|
||||||
title: AppBarTitle('Commits'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (c) {
|
itemBuilder: (c) {
|
||||||
return CommitItem(
|
return CommitItem(
|
||||||
author: c.authorName,
|
author: c.authorName,
|
||||||
|
|
|
@ -8,11 +8,15 @@ import 'package:provider/provider.dart';
|
||||||
import 'package:timeago/timeago.dart' as timeago;
|
import 'package:timeago/timeago.dart' as timeago;
|
||||||
|
|
||||||
class GlExploreScreen extends StatelessWidget {
|
class GlExploreScreen extends StatelessWidget {
|
||||||
Future<ListPayload<GitlabProject, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GitlabProject, int>(
|
||||||
|
title: AppBarTitle('Explore'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final auth = context.read<AuthModel>();
|
final auth = context.read<AuthModel>();
|
||||||
final res = await auth
|
final res = await auth.fetchGitlabWithPage(
|
||||||
.fetchGitlabWithPage('/projects?order_by=last_activity_at&page=$page');
|
'/projects?order_by=last_activity_at&page=$page');
|
||||||
return ListPayload(
|
return ListPayload(
|
||||||
cursor: res.cursor,
|
cursor: res.cursor,
|
||||||
hasMore: res.hasMore,
|
hasMore: res.hasMore,
|
||||||
|
@ -20,14 +24,7 @@ class GlExploreScreen extends StatelessWidget {
|
||||||
for (var v in res.data) GitlabProject.fromJson(v),
|
for (var v in res.data) GitlabProject.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GitlabProject, int>(
|
|
||||||
title: AppBarTitle('Explore'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return RepositoryItem.gl(
|
return RepositoryItem.gl(
|
||||||
payload: v,
|
payload: v,
|
||||||
|
|
|
@ -7,8 +7,12 @@ import 'package:git_touch/widgets/user_item.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class GlGroupsScreenn extends StatelessWidget {
|
class GlGroupsScreenn extends StatelessWidget {
|
||||||
Future<ListPayload<GitlabGroup, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GitlabGroup, int>(
|
||||||
|
title: AppBarTitle('Groups'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final auth = context.read<AuthModel>();
|
final auth = context.read<AuthModel>();
|
||||||
final res = await auth.fetchGitlabWithPage('/groups?page=$page');
|
final res = await auth.fetchGitlabWithPage('/groups?page=$page');
|
||||||
return ListPayload(
|
return ListPayload(
|
||||||
|
@ -18,14 +22,7 @@ class GlGroupsScreenn extends StatelessWidget {
|
||||||
for (var v in res.data) GitlabGroup.fromJson(v),
|
for (var v in res.data) GitlabGroup.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GitlabGroup, int>(
|
|
||||||
title: AppBarTitle('Groups'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return UserItem(
|
return UserItem(
|
||||||
avatarUrl: v.avatarUrl,
|
avatarUrl: v.avatarUrl,
|
||||||
|
|
|
@ -12,25 +12,23 @@ class GlIssuesScreen extends StatelessWidget {
|
||||||
final String prefix;
|
final String prefix;
|
||||||
GlIssuesScreen(this.id, {this.prefix});
|
GlIssuesScreen(this.id, {this.prefix});
|
||||||
|
|
||||||
Future<ListPayload<GitlabIssue, int>> _query(BuildContext context,
|
|
||||||
[int page = 1]) async {
|
|
||||||
final auth = context.read<AuthModel>();
|
|
||||||
final res = await auth
|
|
||||||
.fetchGitlabWithPage('/projects/$id/issues?state=opened&page=$page');
|
|
||||||
return ListPayload(
|
|
||||||
cursor: res.cursor,
|
|
||||||
hasMore: res.hasMore,
|
|
||||||
items: (res.data as List).map((v) => GitlabIssue.fromJson(v)).toList(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListStatefulScaffold<GitlabIssue, int>(
|
return ListStatefulScaffold<GitlabIssue, int>(
|
||||||
title: AppBarTitle('Issues'),
|
title: AppBarTitle('Issues'),
|
||||||
// TODO: create issue
|
// TODO: create issue
|
||||||
onRefresh: () => _query(context),
|
onLoadMore: (page) async {
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
page = page ?? 1;
|
||||||
|
final auth = context.read<AuthModel>();
|
||||||
|
final res = await auth.fetchGitlabWithPage(
|
||||||
|
'/projects/$id/issues?state=opened&page=$page');
|
||||||
|
return ListPayload(
|
||||||
|
cursor: res.cursor,
|
||||||
|
hasMore: res.hasMore,
|
||||||
|
items:
|
||||||
|
(res.data as List).map((v) => GitlabIssue.fromJson(v)).toList(),
|
||||||
|
);
|
||||||
|
},
|
||||||
itemBuilder: (p) => IssueItem(
|
itemBuilder: (p) => IssueItem(
|
||||||
author: p.author.username,
|
author: p.author.username,
|
||||||
avatarUrl: p.author.avatarUrl,
|
avatarUrl: p.author.avatarUrl,
|
||||||
|
|
|
@ -11,19 +11,6 @@ class GlMembersScreen extends StatelessWidget {
|
||||||
final String type;
|
final String type;
|
||||||
GlMembersScreen(this.id, this.type);
|
GlMembersScreen(this.id, this.type);
|
||||||
|
|
||||||
Future<ListPayload<GitlabUser, int>> _query(BuildContext context,
|
|
||||||
[int page = 1]) async {
|
|
||||||
final auth = context.read<AuthModel>();
|
|
||||||
final res = await auth.fetchGitlabWithPage('/$type/$id/members?page=$page');
|
|
||||||
return ListPayload(
|
|
||||||
cursor: res.cursor,
|
|
||||||
hasMore: res.hasMore,
|
|
||||||
items: <GitlabUser>[
|
|
||||||
for (var v in res.data) GitlabUser.fromJson(v),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://docs.gitlab.com/ee/api/access_requests.html#valid-access-levels
|
// https://docs.gitlab.com/ee/api/access_requests.html#valid-access-levels
|
||||||
static const accessLevelMap = {
|
static const accessLevelMap = {
|
||||||
10: 'Guest',
|
10: 'Guest',
|
||||||
|
@ -37,8 +24,19 @@ class GlMembersScreen extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListStatefulScaffold<GitlabUser, int>(
|
return ListStatefulScaffold<GitlabUser, int>(
|
||||||
title: AppBarTitle('Members'),
|
title: AppBarTitle('Members'),
|
||||||
onRefresh: () => _query(context),
|
onLoadMore: (page) async {
|
||||||
onLoadMore: (page) => _query(context, page),
|
page = page ?? 1;
|
||||||
|
final auth = context.read<AuthModel>();
|
||||||
|
final res =
|
||||||
|
await auth.fetchGitlabWithPage('/$type/$id/members?page=$page');
|
||||||
|
return ListPayload(
|
||||||
|
cursor: res.cursor,
|
||||||
|
hasMore: res.hasMore,
|
||||||
|
items: <GitlabUser>[
|
||||||
|
for (var v in res.data) GitlabUser.fromJson(v),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return UserItem(
|
return UserItem(
|
||||||
avatarUrl: v.avatarUrl,
|
avatarUrl: v.avatarUrl,
|
||||||
|
|
|
@ -12,23 +12,21 @@ class GlMergeRequestsScreen extends StatelessWidget {
|
||||||
final String prefix;
|
final String prefix;
|
||||||
GlMergeRequestsScreen(this.id, {this.prefix});
|
GlMergeRequestsScreen(this.id, {this.prefix});
|
||||||
|
|
||||||
Future<ListPayload<GitlabIssue, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GitlabIssue, int>(
|
||||||
|
title: AppBarTitle('Merge Requests'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final res = await context.read<AuthModel>().fetchGitlabWithPage(
|
final res = await context.read<AuthModel>().fetchGitlabWithPage(
|
||||||
'/projects/$id/merge_requests?state=opened&page=$page');
|
'/projects/$id/merge_requests?state=opened&page=$page');
|
||||||
return ListPayload(
|
return ListPayload(
|
||||||
cursor: res.cursor,
|
cursor: res.cursor,
|
||||||
hasMore: res.hasMore,
|
hasMore: res.hasMore,
|
||||||
items: (res.data as List).map((v) => GitlabIssue.fromJson(v)).toList(),
|
items:
|
||||||
|
(res.data as List).map((v) => GitlabIssue.fromJson(v)).toList(),
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GitlabIssue, int>(
|
|
||||||
title: AppBarTitle('Merge Requests'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (p) => IssueItem(
|
itemBuilder: (p) => IssueItem(
|
||||||
isPr: true,
|
isPr: true,
|
||||||
author: p.author.username,
|
author: p.author.username,
|
||||||
|
|
|
@ -11,24 +11,21 @@ import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class GlProjectActivityScreen extends StatelessWidget {
|
class GlProjectActivityScreen extends StatelessWidget {
|
||||||
final int id;
|
final int id;
|
||||||
|
|
||||||
GlProjectActivityScreen(this.id);
|
GlProjectActivityScreen(this.id);
|
||||||
|
|
||||||
Future<ListPayload<GitlabEvent, int>> _query(BuildContext context,
|
|
||||||
[int page]) async {
|
|
||||||
final auth = context.read<AuthModel>();
|
|
||||||
final vs = await auth.fetchGitlab('/projects/$id/events');
|
|
||||||
final events = (vs as List).map((v) => GitlabEvent.fromJson(v)).toList();
|
|
||||||
return ListPayload(cursor: page, items: events, hasMore: false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Provider.of<ThemeModel>(context);
|
final theme = Provider.of<ThemeModel>(context);
|
||||||
return ListStatefulScaffold<GitlabEvent, int>(
|
return ListStatefulScaffold<GitlabEvent, int>(
|
||||||
title: AppBarTitle('Activity'),
|
title: AppBarTitle('Activity'),
|
||||||
onRefresh: () => _query(context),
|
onLoadMore: (page) async {
|
||||||
onLoadMore: (int page) => _query(context, page),
|
page = page ?? 1;
|
||||||
|
final auth = context.read<AuthModel>();
|
||||||
|
final vs = await auth.fetchGitlab('/projects/$id/events');
|
||||||
|
final events =
|
||||||
|
(vs as List).map((v) => GitlabEvent.fromJson(v)).toList();
|
||||||
|
return ListPayload(cursor: page, items: events, hasMore: false);
|
||||||
|
},
|
||||||
itemBuilder: (data) {
|
itemBuilder: (data) {
|
||||||
return Link(
|
return Link(
|
||||||
url: '',
|
url: '',
|
||||||
|
|
|
@ -11,8 +11,12 @@ class GlStarrersScreen extends StatelessWidget {
|
||||||
final int id;
|
final int id;
|
||||||
GlStarrersScreen(this.id);
|
GlStarrersScreen(this.id);
|
||||||
|
|
||||||
Future<ListPayload<GitlabStarrer, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GitlabStarrer, int>(
|
||||||
|
title: AppBarTitle('Members'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final res = await context
|
final res = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.fetchGitlabWithPage('/projects/$id/starrers?page=$page');
|
.fetchGitlabWithPage('/projects/$id/starrers?page=$page');
|
||||||
|
@ -23,14 +27,7 @@ class GlStarrersScreen extends StatelessWidget {
|
||||||
for (var v in res.data) GitlabStarrer.fromJson(v),
|
for (var v in res.data) GitlabStarrer.fromJson(v),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GitlabStarrer, int>(
|
|
||||||
title: AppBarTitle('Members'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (page) => _query(context, page),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return UserItem(
|
return UserItem(
|
||||||
avatarUrl: v.user.avatarUrl,
|
avatarUrl: v.user.avatarUrl,
|
||||||
|
|
|
@ -12,24 +12,21 @@ class GtCommitsScreen extends StatelessWidget {
|
||||||
// final String branch; // TODO:
|
// final String branch; // TODO:
|
||||||
GtCommitsScreen(this.owner, this.name);
|
GtCommitsScreen(this.owner, this.name);
|
||||||
|
|
||||||
Future<ListPayload<GiteaCommit, int>> _query(BuildContext context,
|
|
||||||
[int page = 1]) async {
|
|
||||||
final res = await context
|
|
||||||
.read<AuthModel>()
|
|
||||||
.fetchGiteaWithPage('/repos/$owner/$name/commits?page=$page&limit=20');
|
|
||||||
return ListPayload(
|
|
||||||
cursor: res.cursor,
|
|
||||||
hasMore: res.hasMore,
|
|
||||||
items: (res.data as List).map((v) => GiteaCommit.fromJson(v)).toList(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListStatefulScaffold<GiteaCommit, int>(
|
return ListStatefulScaffold<GiteaCommit, int>(
|
||||||
title: AppBarTitle('Commits'),
|
title: AppBarTitle('Commits'),
|
||||||
onRefresh: () => _query(context),
|
onLoadMore: (page) async {
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
page = page ?? 1;
|
||||||
|
final res = await context.read<AuthModel>().fetchGiteaWithPage(
|
||||||
|
'/repos/$owner/$name/commits?page=$page&limit=20');
|
||||||
|
return ListPayload(
|
||||||
|
cursor: res.cursor,
|
||||||
|
hasMore: res.hasMore,
|
||||||
|
items:
|
||||||
|
(res.data as List).map((v) => GiteaCommit.fromJson(v)).toList(),
|
||||||
|
);
|
||||||
|
},
|
||||||
itemBuilder: (c) {
|
itemBuilder: (c) {
|
||||||
return CommitItem(
|
return CommitItem(
|
||||||
author: c.author?.login ?? c.commit.author.name,
|
author: c.author?.login ?? c.commit.author.name,
|
||||||
|
|
|
@ -12,8 +12,13 @@ class GtIssuesScreen extends StatelessWidget {
|
||||||
final bool isPr;
|
final bool isPr;
|
||||||
GtIssuesScreen(this.owner, this.name, {this.isPr = false});
|
GtIssuesScreen(this.owner, this.name, {this.isPr = false});
|
||||||
|
|
||||||
Future<ListPayload<GiteaIssue, int>> _query(BuildContext context,
|
@override
|
||||||
[int page = 1]) async {
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GiteaIssue, int>(
|
||||||
|
title: AppBarTitle(isPr ? 'Pull Requests' : 'Issues'),
|
||||||
|
// TODO: create issue
|
||||||
|
onLoadMore: (page) async {
|
||||||
|
page = page ?? 1;
|
||||||
final type = isPr ? 'pulls' : 'issues';
|
final type = isPr ? 'pulls' : 'issues';
|
||||||
final res = await context.read<AuthModel>().fetchGiteaWithPage(
|
final res = await context.read<AuthModel>().fetchGiteaWithPage(
|
||||||
'/repos/$owner/$name/issues?state=open&page=$page&limit=20&type=$type');
|
'/repos/$owner/$name/issues?state=open&page=$page&limit=20&type=$type');
|
||||||
|
@ -22,15 +27,7 @@ class GtIssuesScreen extends StatelessWidget {
|
||||||
hasMore: res.hasMore,
|
hasMore: res.hasMore,
|
||||||
items: (res.data as List).map((v) => GiteaIssue.fromJson(v)).toList(),
|
items: (res.data as List).map((v) => GiteaIssue.fromJson(v)).toList(),
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GiteaIssue, int>(
|
|
||||||
title: AppBarTitle(isPr ? 'Pull Requests' : 'Issues'),
|
|
||||||
// TODO: create issue
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (p) => IssueItem(
|
itemBuilder: (p) => IssueItem(
|
||||||
author: p.user.login,
|
author: p.user.login,
|
||||||
avatarUrl: p.user.avatarUrl,
|
avatarUrl: p.user.avatarUrl,
|
||||||
|
|
|
@ -7,9 +7,13 @@ import 'package:git_touch/widgets/user_item.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class GtOrgsScreen extends StatelessWidget {
|
class GtOrgsScreen extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return ListStatefulScaffold<GiteaOrg, int>(
|
||||||
|
title: AppBarTitle('Organizations'),
|
||||||
|
onLoadMore: (page) async {
|
||||||
// final String branch; // TODO:
|
// final String branch; // TODO:
|
||||||
Future<ListPayload<GiteaOrg, int>> _query(BuildContext context,
|
page = page ?? 1;
|
||||||
[int page = 1]) async {
|
|
||||||
final res = await context
|
final res = await context
|
||||||
.read<AuthModel>()
|
.read<AuthModel>()
|
||||||
.fetchGiteaWithPage('/orgs?limit=20&page=$page');
|
.fetchGiteaWithPage('/orgs?limit=20&page=$page');
|
||||||
|
@ -19,14 +23,7 @@ class GtOrgsScreen extends StatelessWidget {
|
||||||
hasMore: (res.data as List).length == 20,
|
hasMore: (res.data as List).length == 20,
|
||||||
items: (res.data as List).map((v) => GiteaOrg.fromJson(v)).toList(),
|
items: (res.data as List).map((v) => GiteaOrg.fromJson(v)).toList(),
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ListStatefulScaffold<GiteaOrg, int>(
|
|
||||||
title: AppBarTitle('Organizations'),
|
|
||||||
onRefresh: () => _query(context),
|
|
||||||
onLoadMore: (cursor) => _query(context, cursor),
|
|
||||||
itemBuilder: (v) {
|
itemBuilder: (v) {
|
||||||
return UserItem(
|
return UserItem(
|
||||||
avatarUrl: v.avatarUrl,
|
avatarUrl: v.avatarUrl,
|
||||||
|
|
Loading…
Reference in New Issue