feat(gitea): blob screen

This commit is contained in:
Rongjian Zhang 2020-01-30 15:04:29 +08:00
parent f604d467dc
commit 9d6985c391
6 changed files with 121 additions and 1 deletions

View File

@ -7,6 +7,7 @@ import 'package:git_touch/models/theme.dart';
import 'package:git_touch/screens/about.dart';
import 'package:git_touch/screens/code_theme.dart';
import 'package:git_touch/screens/commits.dart';
import 'package:git_touch/screens/gitea_object.dart';
import 'package:git_touch/screens/gitea_repo.dart';
import 'package:git_touch/screens/gitea_user.dart';
import 'package:git_touch/screens/gitlab_blob.dart';
@ -78,6 +79,7 @@ void main() async {
gitlabCommitsRouter,
giteaUserRouter,
giteaRepoRouter,
giteaObjectRouter,
loginRouter,
settingsRouter,
userRouter,

View File

@ -31,3 +31,21 @@ class GiteaRepository {
factory GiteaRepository.fromJson(Map<String, dynamic> json) =>
_$GiteaRepositoryFromJson(json);
}
@JsonSerializable(fieldRename: FieldRename.snake)
class GiteaTree {
String type;
String name;
String path;
GiteaTree();
factory GiteaTree.fromJson(Map<String, dynamic> json) =>
_$GiteaTreeFromJson(json);
}
@JsonSerializable(fieldRename: FieldRename.snake)
class GiteaBlob extends GiteaTree {
String content;
GiteaBlob();
factory GiteaBlob.fromJson(Map<String, dynamic> json) =>
_$GiteaBlobFromJson(json);
}

View File

@ -58,3 +58,31 @@ Map<String, dynamic> _$GiteaRepositoryToJson(GiteaRepository instance) =>
'open_issues_count': instance.openIssuesCount,
'open_pr_counter': instance.openPrCounter,
};
GiteaTree _$GiteaTreeFromJson(Map<String, dynamic> json) {
return GiteaTree()
..type = json['type'] as String
..name = json['name'] as String
..path = json['path'] as String;
}
Map<String, dynamic> _$GiteaTreeToJson(GiteaTree instance) => <String, dynamic>{
'type': instance.type,
'name': instance.name,
'path': instance.path,
};
GiteaBlob _$GiteaBlobFromJson(Map<String, dynamic> json) {
return GiteaBlob()
..type = json['type'] as String
..name = json['name'] as String
..path = json['path'] as String
..content = json['content'] as String;
}
Map<String, dynamic> _$GiteaBlobToJson(GiteaBlob instance) => <String, dynamic>{
'type': instance.type,
'name': instance.name,
'path': instance.path,
'content': instance.content,
};

View File

@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'package:git_touch/models/auth.dart';
import 'package:git_touch/models/gitea.dart';
import 'package:git_touch/models/theme.dart';
import 'package:git_touch/scaffolds/refresh_stateful.dart';
import 'package:git_touch/utils/utils.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:git_touch/widgets/object_tree.dart';
import 'package:provider/provider.dart';
final giteaObjectRouter = RouterScreen(
'/gitea/:owner/:name/blob',
(context, params) => GiteaObjectScreen(
params['owner'].first,
params['name'].first,
path: params['path']?.first?.urldecode,
),
);
class GiteaObjectScreen extends StatelessWidget {
final String owner;
final String name;
final String path;
GiteaObjectScreen(this.owner, this.name, {this.path});
@override
Widget build(BuildContext context) {
return RefreshStatefulScaffold(
title: AppBarTitle(path ?? 'Files'),
fetchData: () async {
final suffix = path == null ? '' : '/$path';
final res = await Provider.of<AuthModel>(context)
.fetchGitea('/repos/$owner/$name/contents$suffix');
return res;
},
actionBuilder: (p, _) {
if (p is List) {
return null;
} else {
final theme = Provider.of<ThemeModel>(context);
return ActionEntry(
iconData: Icons.settings,
onTap: () {
theme.push(context, '/choose-code-theme');
},
);
}
},
bodyBuilder: (p, _) {
if (p is List) {
return ObjectTree(
items: p.map((t) {
final v = GiteaTree.fromJson(t);
return ObjectTreeItem(
name: v.name,
type: v.type,
url: '/gitea/$owner/$name/blob?path=${v.path.urlencode}',
);
}),
);
} else {
final v = GiteaBlob.fromJson(p);
return BlobView(v.name, base64Text: v.content);
}
},
);
}
}

View File

@ -74,7 +74,7 @@ class GiteaRepoScreen extends StatelessWidget {
leftIconData: Octicons.code,
text: Text('Code'),
rightWidget: Text(filesize(p.size * 1000)),
url: '/gitea/blob',
url: '/gitea/$owner/$name/blob',
),
TableViewItem(
leftIconData: Octicons.issue_opened,

View File

@ -22,8 +22,10 @@ class ObjectTree extends StatelessWidget {
Widget _buildIcon(ObjectTreeItem item) {
switch (item.type) {
case 'blob':
case 'file': // Gitea
return SetiIcon(item.name, size: 36);
case 'tree':
case 'dir': // Gitea
return Icon(
Octicons.file_directory,
color: PrimerColors.blue300,