diff --git a/lib/models/gitee.dart b/lib/models/gitee.dart index f08ed41..13a97ce 100644 --- a/lib/models/gitee.dart +++ b/lib/models/gitee.dart @@ -50,6 +50,7 @@ class GiteeRepo { String homepage; int openIssuesCount; bool pullRequestsEnabled; + String defaultBranch; GiteeRepo(); factory GiteeRepo.fromJson(Map json) => _$GiteeRepoFromJson(json); @@ -102,3 +103,14 @@ class GiteeCommitAuthor { factory GiteeCommitAuthor.fromJson(Map json) => _$GiteeCommitAuthorFromJson(json); } + +@JsonSerializable(fieldRename: FieldRename.snake) +class GiteeTreeItem { + String path; + String type; + String sha; + int size; + GiteeTreeItem(); + factory GiteeTreeItem.fromJson(Map json) => + _$GiteeTreeItemFromJson(json); +} diff --git a/lib/models/gitee.g.dart b/lib/models/gitee.g.dart index 16b5eb1..c76a802 100644 --- a/lib/models/gitee.g.dart +++ b/lib/models/gitee.g.dart @@ -78,7 +78,8 @@ GiteeRepo _$GiteeRepoFromJson(Map json) { ..license = json['license'] as String ..homepage = json['homepage'] as String ..openIssuesCount = json['open_issues_count'] as int - ..pullRequestsEnabled = json['pull_requests_enabled'] as bool; + ..pullRequestsEnabled = json['pull_requests_enabled'] as bool + ..defaultBranch = json['default_branch'] as String; } Map _$GiteeRepoToJson(GiteeRepo instance) => { @@ -98,6 +99,7 @@ Map _$GiteeRepoToJson(GiteeRepo instance) => { 'homepage': instance.homepage, 'open_issues_count': instance.openIssuesCount, 'pull_requests_enabled': instance.pullRequestsEnabled, + 'default_branch': instance.defaultBranch, }; GiteeRepoOwner _$GiteeRepoOwnerFromJson(Map json) { @@ -173,3 +175,19 @@ Map _$GiteeCommitAuthorToJson(GiteeCommitAuthor instance) => 'email': instance.email, 'date': instance.date?.toIso8601String(), }; + +GiteeTreeItem _$GiteeTreeItemFromJson(Map json) { + return GiteeTreeItem() + ..path = json['path'] as String + ..type = json['type'] as String + ..sha = json['sha'] as String + ..size = json['size'] as int; +} + +Map _$GiteeTreeItemToJson(GiteeTreeItem instance) => + { + 'path': instance.path, + 'type': instance.type, + 'sha': instance.sha, + 'size': instance.size, + }; diff --git a/lib/router.dart b/lib/router.dart index 5b21326..92e829a 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -9,6 +9,7 @@ import 'package:git_touch/screens/code_theme.dart'; import 'package:git_touch/screens/ge_commits.dart'; import 'package:git_touch/screens/ge_repo.dart'; import 'package:git_touch/screens/ge_repos.dart'; +import 'package:git_touch/screens/ge_tree.dart'; import 'package:git_touch/screens/ge_user.dart'; import 'package:git_touch/screens/ge_users.dart'; import 'package:git_touch/screens/gh_commits.dart'; @@ -386,6 +387,7 @@ class GiteeRouter { GiteeRouter.watchers, GiteeRouter.forks, GiteeRouter.commits, + GiteeRouter.tree, ]; static final user = RouterScreen('/:login', (context, p) { final login = p['login'].first; @@ -422,4 +424,11 @@ class GiteeRouter { '/:owner/:name/commits', (_, p) => GeCommitsScreen(p['owner'].first, p['name'].first), ); + static final tree = RouterScreen( + '/:owner/:name/tree/:sha', + (context, parameters) { + return GeTreeScreen(parameters['owner'].first, parameters['name'].first, + parameters['sha'].first); + }, + ); } diff --git a/lib/screens/ge_repo.dart b/lib/screens/ge_repo.dart index aa36e98..236f221 100644 --- a/lib/screens/ge_repo.dart +++ b/lib/screens/ge_repo.dart @@ -73,7 +73,7 @@ class GeRepoScreen extends StatelessWidget { leftIconData: Octicons.code, text: Text('Code'), rightWidget: Text(p.license ?? ''), - url: '/gitee/$owner/$name/blob', + url: '/gitee/$owner/$name/tree/${p.defaultBranch}', ), TableViewItem( leftIconData: Octicons.issue_opened, diff --git a/lib/screens/ge_tree.dart b/lib/screens/ge_tree.dart new file mode 100644 index 0000000..3fb97a3 --- /dev/null +++ b/lib/screens/ge_tree.dart @@ -0,0 +1,56 @@ +import 'package:flutter/cupertino.dart'; +import 'package:git_touch/models/gitee.dart'; +import 'package:git_touch/scaffolds/refresh_stateful.dart'; +import 'package:git_touch/utils/utils.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/object_tree.dart'; +import 'package:flutter/material.dart'; +import 'package:git_touch/models/auth.dart'; +import 'package:provider/provider.dart'; + +class GeTreeScreen extends StatelessWidget { + final String owner; + final String name; + final String sha; + GeTreeScreen(this.owner, this.name, this.sha); + + @override + Widget build(BuildContext context) { + return RefreshStatefulScaffold>( + title: AppBarTitle('Files'), + fetch: () async { + final res = await context + .read() + .fetchGitee('/repos/$owner/$name/git/trees/$sha'); + final items = [for (var v in res['tree']) GiteeTreeItem.fromJson(v)]; + items.sort((a, b) { + return sortByKey('tree', a.type, b.type); + }); + return items; + }, + bodyBuilder: (data, _) { + return ObjectTree( + items: [ + for (var item in data) + ObjectTreeItem( + type: item.type, + name: item.path, + size: item.size, + downloadUrl: '', // TODO: + url: (() { + switch (item.type) { + case 'tree': + return '/gitee/$owner/$name/tree/${item.sha}'; + case 'blob': + return '/gitee/$owner/$name/blob/${item.sha}'; + default: + return null; + } + })(), + ) + ], + ); + }, + ); + } +}