diff --git a/lib/models/gitee.dart b/lib/models/gitee.dart index 13a97ce9..98e21d27 100644 --- a/lib/models/gitee.dart +++ b/lib/models/gitee.dart @@ -114,3 +114,11 @@ class GiteeTreeItem { factory GiteeTreeItem.fromJson(Map json) => _$GiteeTreeItemFromJson(json); } + +@JsonSerializable(fieldRename: FieldRename.snake) +class GiteeBlob { + String content; + GiteeBlob(); + factory GiteeBlob.fromJson(Map json) => + _$GiteeBlobFromJson(json); +} diff --git a/lib/models/gitee.g.dart b/lib/models/gitee.g.dart index c76a802c..e19e0fda 100644 --- a/lib/models/gitee.g.dart +++ b/lib/models/gitee.g.dart @@ -191,3 +191,11 @@ Map _$GiteeTreeItemToJson(GiteeTreeItem instance) => 'sha': instance.sha, 'size': instance.size, }; + +GiteeBlob _$GiteeBlobFromJson(Map json) { + return GiteeBlob()..content = json['content'] as String; +} + +Map _$GiteeBlobToJson(GiteeBlob instance) => { + 'content': instance.content, + }; diff --git a/lib/router.dart b/lib/router.dart index 92e829a5..3f6df73c 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -6,6 +6,7 @@ import 'package:git_touch/screens/bb_issues.dart'; import 'package:git_touch/screens/bb_pulls.dart'; import 'package:git_touch/screens/bb_user.dart'; import 'package:git_touch/screens/code_theme.dart'; +import 'package:git_touch/screens/ge_blob.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'; @@ -388,6 +389,7 @@ class GiteeRouter { GiteeRouter.forks, GiteeRouter.commits, GiteeRouter.tree, + GiteeRouter.blob, ]; static final user = RouterScreen('/:login', (context, p) { final login = p['login'].first; @@ -431,4 +433,15 @@ class GiteeRouter { parameters['sha'].first); }, ); + static final blob = RouterScreen( + '/:owner/:name/blob/:sha', + (context, parameters) { + return GeBlobScreen( + parameters['owner'].first, + parameters['name'].first, + parameters['sha'].first, + parameters['path'].first, + ); + }, + ); } diff --git a/lib/screens/ge_blob.dart b/lib/screens/ge_blob.dart new file mode 100644 index 00000000..1f901784 --- /dev/null +++ b/lib/screens/ge_blob.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/models/auth.dart'; +import 'package:git_touch/models/gitee.dart'; +import 'package:git_touch/scaffolds/refresh_stateful.dart'; +import 'package:git_touch/widgets/action_entry.dart'; +import 'package:git_touch/widgets/app_bar_title.dart'; +import 'package:git_touch/widgets/blob_view.dart'; +import 'package:provider/provider.dart'; + +class GeBlobScreen extends StatelessWidget { + final String owner; + final String name; + final String sha; + final String path; + GeBlobScreen(this.owner, this.name, this.sha, this.path); + + @override + Widget build(BuildContext context) { + return RefreshStatefulScaffold( + title: AppBarTitle('File'), + fetch: () async { + final auth = context.read(); + final res = await auth.fetchGitee('/repos/$owner/$name/git/blobs/$sha'); + return GiteeBlob.fromJson(res).content; + }, + action: ActionEntry(iconData: Icons.settings, url: '/choose-code-theme'), + bodyBuilder: (content, _) { + return BlobView(path, base64Text: content); + }, + ); + } +} diff --git a/lib/screens/ge_tree.dart b/lib/screens/ge_tree.dart index 3fb97a36..84d32f7b 100644 --- a/lib/screens/ge_tree.dart +++ b/lib/screens/ge_tree.dart @@ -40,9 +40,9 @@ class GeTreeScreen extends StatelessWidget { url: (() { switch (item.type) { case 'tree': - return '/gitee/$owner/$name/tree/${item.sha}'; + return '/gitee/$owner/$name/tree/${item.sha}?path=${item.path.urlencode}'; case 'blob': - return '/gitee/$owner/$name/blob/${item.sha}'; + return '/gitee/$owner/$name/blob/${item.sha}?path=${item.path.urlencode}'; default: return null; }