From eddcb1fc39929a912f1b57e8198ec2269d0ee9de Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Fri, 31 Jan 2020 16:40:20 +0800 Subject: [PATCH] refactor: add download url --- lib/models/gitea.dart | 1 + lib/models/gitea.g.dart | 6 +++++- lib/screens/gitea_object.dart | 1 + lib/screens/gitlab_tree.dart | 5 ++++- lib/screens/object.dart | 30 ++---------------------------- lib/widgets/blob_view.dart | 4 +--- lib/widgets/object_tree.dart | 17 ++++++++++++++++- 7 files changed, 30 insertions(+), 34 deletions(-) diff --git a/lib/models/gitea.dart b/lib/models/gitea.dart index ca5be31..b99bd17 100644 --- a/lib/models/gitea.dart +++ b/lib/models/gitea.dart @@ -38,6 +38,7 @@ class GiteaTree { String name; String path; int size; + String downloadUrl; GiteaTree(); factory GiteaTree.fromJson(Map json) => _$GiteaTreeFromJson(json); diff --git a/lib/models/gitea.g.dart b/lib/models/gitea.g.dart index 3269e2c..442b911 100644 --- a/lib/models/gitea.g.dart +++ b/lib/models/gitea.g.dart @@ -64,7 +64,8 @@ GiteaTree _$GiteaTreeFromJson(Map json) { ..type = json['type'] as String ..name = json['name'] as String ..path = json['path'] as String - ..size = json['size'] as int; + ..size = json['size'] as int + ..downloadUrl = json['download_url'] as String; } Map _$GiteaTreeToJson(GiteaTree instance) => { @@ -72,6 +73,7 @@ Map _$GiteaTreeToJson(GiteaTree instance) => { 'name': instance.name, 'path': instance.path, 'size': instance.size, + 'download_url': instance.downloadUrl, }; GiteaBlob _$GiteaBlobFromJson(Map json) { @@ -80,6 +82,7 @@ GiteaBlob _$GiteaBlobFromJson(Map json) { ..name = json['name'] as String ..path = json['path'] as String ..size = json['size'] as int + ..downloadUrl = json['download_url'] as String ..content = json['content'] as String; } @@ -88,5 +91,6 @@ Map _$GiteaBlobToJson(GiteaBlob instance) => { 'name': instance.name, 'path': instance.path, 'size': instance.size, + 'download_url': instance.downloadUrl, 'content': instance.content, }; diff --git a/lib/screens/gitea_object.dart b/lib/screens/gitea_object.dart index 8dd3828..b919e4f 100644 --- a/lib/screens/gitea_object.dart +++ b/lib/screens/gitea_object.dart @@ -61,6 +61,7 @@ class GiteaObjectScreen extends StatelessWidget { type: v.type, size: v.type == 'file' ? v.size : null, url: '/gitea/$owner/$name/blob?path=${v.path.urlencode}', + downloadUrl: v.downloadUrl, ), ]); } else { diff --git a/lib/screens/gitlab_tree.dart b/lib/screens/gitlab_tree.dart index 58812a9..3eee177 100644 --- a/lib/screens/gitlab_tree.dart +++ b/lib/screens/gitlab_tree.dart @@ -20,6 +20,7 @@ class GitlabTreeScreen extends StatelessWidget { @override Widget build(BuildContext context) { + final auth = Provider.of(context); return RefreshStatefulScaffold>( title: AppBarTitle(path ?? 'Files'), fetchData: () async { @@ -27,7 +28,7 @@ class GitlabTreeScreen extends StatelessWidget { if (path != null) { url += '?path=' + path; } - final res = await Provider.of(context).fetchGitlab(url); + final res = await auth.fetchGitlab(url); return (res as List).map((v) => GitlabTreeItem.fromJson(v)); }, bodyBuilder: (data, _) { @@ -36,6 +37,8 @@ class GitlabTreeScreen extends StatelessWidget { return ObjectTreeItem( type: item.type, name: item.name, + downloadUrl: + '${auth.activeAccount.domain}/api/v4/projects/$id/repository/files/${item.path.urlencode}/raw?ref=master', // TODO: url: (() { switch (item.type) { case 'tree': diff --git a/lib/screens/object.dart b/lib/screens/object.dart index 42a31ef..a020c49 100644 --- a/lib/screens/object.dart +++ b/lib/screens/object.dart @@ -58,37 +58,11 @@ class ObjectScreen extends StatelessWidget { return ObjectTree( items: items.map((v) { // if (item.type == 'commit') return null; - String url; - if ([ - // Docs - 'pdf', - 'docx', - 'doc', - 'pptx', - 'ppt', - 'xlsx', - 'xls', - // Fonts - 'ttf', - 'otf', - 'eot', - 'woff', - 'woff2' - ].contains(v.name.ext)) { - // Let system browser handle these files - // - // TODO: - // Unhandled Exception: PlatformException(Error, Error while launching - // https://github.com/flutter/flutter/issues/49162 - url = v.downloadUrl; - } else { - url = '/$owner/$name/blob/$ref?path=${v.path.urlencode}'; - } - return ObjectTreeItem( name: v.name, type: v.type, - url: url, + url: '/$owner/$name/blob/$ref?path=${v.path.urlencode}', + downloadUrl: v.downloadUrl, size: v.type == 'file' ? v.size : null, ); }), diff --git a/lib/widgets/blob_view.dart b/lib/widgets/blob_view.dart index 4426667..3548855 100644 --- a/lib/widgets/blob_view.dart +++ b/lib/widgets/blob_view.dart @@ -23,8 +23,6 @@ class BlobView extends StatelessWidget { this.networkUrl, }); - String get _language => name.ext ?? 'plaintext'; - @override Widget build(BuildContext context) { final codeProvider = Provider.of(context); @@ -58,7 +56,7 @@ class BlobView extends StatelessWidget { scrollDirection: Axis.horizontal, child: HighlightView( base64Text.base64ToUtf8, - language: _language, + language: name.ext ?? 'plaintext', theme: themeMap[theme.brightness == Brightness.dark ? codeProvider.themeDark : codeProvider.theme], diff --git a/lib/widgets/object_tree.dart b/lib/widgets/object_tree.dart index 27e4cc6..596ce35 100644 --- a/lib/widgets/object_tree.dart +++ b/lib/widgets/object_tree.dart @@ -7,12 +7,14 @@ import 'package:seti/seti.dart'; class ObjectTreeItem { final String url; + final String downloadUrl; final String name; final String type; final int size; ObjectTreeItem({ @required this.name, @required this.url, + @required this.downloadUrl, @required this.type, this.size, }); @@ -55,7 +57,20 @@ class ObjectTree extends StatelessWidget { leftWidget: _buildIcon(item), text: Text(item.name), rightWidget: item.size == null ? null : Text(filesize(item.size)), - url: item.url, + url: [ + // Let system browser handle these files + // + // TODO: + // Unhandled Exception: PlatformException(Error, Error while launching + // https://github.com/flutter/flutter/issues/49162 + + // Docs + 'pdf', 'docx', 'doc', 'pptx', 'ppt', 'xlsx', 'xls', + // Fonts + 'ttf', 'otf', 'eot', 'woff', 'woff2', + ].contains(item.name.ext) + ? item.downloadUrl + : item.url, hideRightChevron: item.size != null, ) ],