From 14c6944481018fd0dce513d93332d454ebbbe1e4 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Fri, 31 Jan 2020 17:55:12 +0800 Subject: [PATCH] improvement(github): avoid fetch images data again --- lib/screens/object.dart | 19 +++++++++++++++++-- lib/widgets/blob_view.dart | 10 +++++++++- lib/widgets/object_tree.dart | 4 ++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/screens/object.dart b/lib/screens/object.dart index 0dd5d5a..faaa254 100644 --- a/lib/screens/object.dart +++ b/lib/screens/object.dart @@ -16,6 +16,7 @@ final objectRouter = RouterScreen('/:owner/:name/blob/:ref', (context, params) { params['name'].first, params['ref'].first, path: params['path']?.first, + raw: params['raw']?.first, ); }); @@ -24,7 +25,8 @@ class ObjectScreen extends StatelessWidget { final String name; final String ref; final String path; - ObjectScreen(this.owner, this.name, this.ref, {this.path}); + final String raw; + ObjectScreen(this.owner, this.name, this.ref, {this.path, this.raw}); @override Widget build(BuildContext context) { @@ -32,6 +34,12 @@ class ObjectScreen extends StatelessWidget { // canRefresh: !_isImage, // TODO: title: AppBarTitle(path == null ? 'Files' : path), fetchData: () async { + // Do not request again for images + if (path != null && + raw != null && + ['png', 'jpg', 'jpeg', 'gif', 'webp'].contains(path.ext)) + return {'download_url': raw}; + final suffix = path == null ? '' : '/$path'; final res = await Provider.of(context) .getWithCredentials('/repos/$owner/$name/contents$suffix?ref=$ref'); @@ -54,10 +62,17 @@ class ObjectScreen extends StatelessWidget { return ObjectTree( items: items.map((v) { // if (item.type == 'commit') return null; + final uri = Uri( + path: '/$owner/$name/blob/$ref', + queryParameters: { + 'path': v.path, + ...(v.downloadUrl == null ? {} : {'raw': v.downloadUrl}), + }, + ).toString(); return ObjectTreeItem( name: v.name, type: v.type, - url: '/$owner/$name/blob/$ref?path=${v.path.urlencode}', + url: uri.toString(), 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 1f6dae7..d4a4e1e 100644 --- a/lib/widgets/blob_view.dart +++ b/lib/widgets/blob_view.dart @@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_highlight/theme_map.dart'; import 'package:git_touch/models/code.dart'; import 'package:git_touch/models/theme.dart'; +import 'package:git_touch/widgets/loading.dart'; import 'package:git_touch/widgets/markdown_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_highlight/flutter_highlight.dart'; @@ -38,7 +39,14 @@ class BlobView extends StatelessWidget { // backgroundDecoration: BoxDecoration(color: theme.palette.background), // ); return base64Text == null - ? Image.network(networkUrl) + ? Image.network( + networkUrl, + loadingBuilder: (_, child, p) { + if (p == null) return child; + // TODO: progress + return Loading(); + }, + ) : Image.memory(base64.decode(base64Text)); case 'md': case 'markdown': diff --git a/lib/widgets/object_tree.dart b/lib/widgets/object_tree.dart index 1402acc..47519a6 100644 --- a/lib/widgets/object_tree.dart +++ b/lib/widgets/object_tree.dart @@ -26,10 +26,10 @@ class ObjectTree extends StatelessWidget { Widget _buildIcon(ObjectTreeItem item) { switch (item.type) { - case 'blob': // github gql + case 'blob': // github gql, gitlab case 'file': // github rest, gitea return SetiIcon(item.name, size: 36); - case 'tree': // github gql + case 'tree': // github gql, gitlab case 'dir': // github rest, gitea return Icon( Octicons.file_directory,