diff --git a/lib/models/bitbucket.dart b/lib/models/bitbucket.dart index 30abf0f..6624009 100644 --- a/lib/models/bitbucket.dart +++ b/lib/models/bitbucket.dart @@ -74,3 +74,23 @@ class BbTree { BbTree(); factory BbTree.fromJson(Map json) => _$BbTreeFromJson(json); } + +@JsonSerializable(fieldRename: FieldRename.snake) +class BbCommit { + String message; + DateTime date; + String hash; + BbCommitAuthor author; + BbCommit(); + factory BbCommit.fromJson(Map json) => + _$BbCommitFromJson(json); +} + +@JsonSerializable(fieldRename: FieldRename.snake) +class BbCommitAuthor { + String raw; + BbRepoOwner user; + BbCommitAuthor(); + factory BbCommitAuthor.fromJson(Map json) => + _$BbCommitAuthorFromJson(json); +} diff --git a/lib/models/bitbucket.g.dart b/lib/models/bitbucket.g.dart index 3db960f..13fc0f2 100644 --- a/lib/models/bitbucket.g.dart +++ b/lib/models/bitbucket.g.dart @@ -132,3 +132,35 @@ Map _$BbTreeToJson(BbTree instance) => { 'size': instance.size, 'links': instance.links, }; + +BbCommit _$BbCommitFromJson(Map json) { + return BbCommit() + ..message = json['message'] as String + ..date = + json['date'] == null ? null : DateTime.parse(json['date'] as String) + ..hash = json['hash'] as String + ..author = json['author'] == null + ? null + : BbCommitAuthor.fromJson(json['author'] as Map); +} + +Map _$BbCommitToJson(BbCommit instance) => { + 'message': instance.message, + 'date': instance.date?.toIso8601String(), + 'hash': instance.hash, + 'author': instance.author, + }; + +BbCommitAuthor _$BbCommitAuthorFromJson(Map json) { + return BbCommitAuthor() + ..raw = json['raw'] as String + ..user = json['user'] == null + ? null + : BbRepoOwner.fromJson(json['user'] as Map); +} + +Map _$BbCommitAuthorToJson(BbCommitAuthor instance) => + { + 'raw': instance.raw, + 'user': instance.user, + }; diff --git a/lib/router.dart b/lib/router.dart index fab77f4..8750cd6 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -1,4 +1,5 @@ import 'package:fluro/fluro.dart'; +import 'package:git_touch/screens/bb_commits.dart'; import 'package:git_touch/screens/bb_object.dart'; import 'package:git_touch/screens/bb_repo.dart'; import 'package:git_touch/screens/bb_user.dart'; @@ -242,6 +243,7 @@ class BitbucketRouter { BitbucketRouter.user, BitbucketRouter.repo, BitbucketRouter.object, + BitbucketRouter.commits, ]; static final user = RouterScreen( '/:login', @@ -261,4 +263,8 @@ class BitbucketRouter { path: params['path']?.first, ), ); + static final commits = RouterScreen( + '/:owner/:name/commits/:ref', + (_, p) => + BbCommitsScreen(p['owner'].first, p['name'].first, p['ref'].first)); } diff --git a/lib/screens/bb_commits.dart b/lib/screens/bb_commits.dart new file mode 100644 index 0000000..6c213af --- /dev/null +++ b/lib/screens/bb_commits.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/models/auth.dart'; +import 'package:git_touch/models/bitbucket.dart'; +import 'package:git_touch/scaffolds/list_stateful.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/commit_item.dart'; +import 'package:git_touch/widgets/user_item.dart'; +import 'package:provider/provider.dart'; +import 'package:timeago/timeago.dart' as timeago; + +class BbCommitsScreen extends StatelessWidget { + final String owner; + final String name; + final String ref; + BbCommitsScreen(this.owner, this.name, this.ref); + + Future> _query(BuildContext context, + [String nextUrl]) async { + final auth = Provider.of(context); + final res = await auth + .fetchBbWithPage(nextUrl ?? '/repositories/$owner/$name/commits/$ref'); + return ListPayload( + cursor: res.cursor, + hasMore: res.hasMore, + items: [ + for (var v in res.data) BbCommit.fromJson(v), + ], + ); + } + + @override + Widget build(BuildContext context) { + return ListStatefulScaffold( + title: AppBarTitle('Commits'), + onRefresh: () => _query(context), + onLoadMore: (page) => _query(context, page), + itemBuilder: (v) { + return CommitItem( + url: '/bitbucket/$owner/$name/commits/$ref', + avatarUrl: v.author.user?.avatarUrl, + author: v.author.raw.replaceFirst(RegExp(r' <.*>'), ''), + createdAt: v.date, + message: v.message, + ); + }, + ); + } +} diff --git a/lib/screens/bb_repo.dart b/lib/screens/bb_repo.dart index 62abe27..813d439 100644 --- a/lib/screens/bb_repo.dart +++ b/lib/screens/bb_repo.dart @@ -60,7 +60,7 @@ class BbRepoScreen extends StatelessWidget { TableViewItem( leftIconData: Octicons.history, text: Text('Commits'), - url: '/bitbucket/$owner/$name/commits', + url: '/bitbucket/$owner/$name/commits/${p.mainbranch.name}', ), ], ),