diff --git a/lib/model/qiniu_content.dart b/lib/model/qiniu_content.dart new file mode 100644 index 0000000..4585398 --- /dev/null +++ b/lib/model/qiniu_content.dart @@ -0,0 +1,46 @@ +import 'package:flutter_picgo/components/manage_item.dart'; + +class QiniuContent { + FileContentType type; + /// FILE 时为空, DIR时不能为空 + String url; + String key; + String hash; + int fsize; + String mimeType; + int putTime; + String md5; + int status; + + QiniuContent( + {this.type, + this.key, + this.hash, + this.fsize, + this.mimeType, + this.putTime, + this.md5, + this.status}); + + QiniuContent.fromJson(Map json) { + key = json['key']; + hash = json['hash']; + fsize = json['fsize']; + mimeType = json['mimeType']; + putTime = json['putTime']; + md5 = json['md5']; + status = json['status']; + } + + Map toJson() { + final Map data = new Map(); + data['key'] = this.key; + data['hash'] = this.hash; + data['fsize'] = this.fsize; + data['mimeType'] = this.mimeType; + data['putTime'] = this.putTime; + data['md5'] = this.md5; + data['status'] = this.status; + return data; + } +} diff --git a/lib/views/manage_page/qiniu_page/qiniu_repo_page.dart b/lib/views/manage_page/qiniu_page/qiniu_repo_page.dart index d8bde9f..3b165ea 100644 --- a/lib/views/manage_page/qiniu_page/qiniu_repo_page.dart +++ b/lib/views/manage_page/qiniu_page/qiniu_repo_page.dart @@ -1,6 +1,13 @@ +import 'package:fluro/fluro.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_picgo/components/manage_item.dart'; +import 'package:flutter_picgo/model/qiniu_content.dart'; +import 'package:flutter_picgo/routers/application.dart'; +import 'package:flutter_picgo/routers/routers.dart'; import 'package:flutter_picgo/views/manage_page/base_loading_page_state.dart'; import 'package:flutter_picgo/views/manage_page/qiniu_page/qiniu_repo_page_presenter.dart'; +import 'package:toast/toast.dart'; +import 'package:url_launcher/url_launcher.dart'; class QiniuRepoPage extends StatefulWidget { final String prefix; @@ -12,6 +19,7 @@ class _QiniuRepoPageState extends BaseLoadingPageState implements QiniuRepoPageContract { String errorMsg; String _prefix; + List contents = []; QiniuRepoPagePresenter _presenter; _QiniuRepoPageState(this._prefix) { @@ -21,7 +29,7 @@ class _QiniuRepoPageState extends BaseLoadingPageState @override void initState() { super.initState(); - _presenter.doLoadContents(); + _presenter.doLoadContents(this._prefix); } @override @@ -77,6 +85,74 @@ class _QiniuRepoPageState extends BaseLoadingPageState @override Widget buildSuccess() { - return Center(); + return ListView.builder( + itemCount: contents.length, + itemBuilder: (context, index) { + return ManageItem( + Key('$index'), + contents[index].url, + contents[index].key, + '${contents[index].fsize ?? 0}k', + contents[index].type, + onTap: () { + if (contents[index].type == FileContentType.DIR) { + Application.router.navigateTo(context, + '${Routes.settingPbQiniuRepo}?path=${Uri.encodeComponent(contents[index].key)}', + transition: TransitionType.cupertino); + } else { + launch(contents[index].url); + } + }, + confirmDismiss: (direction) async { + if (contents[index].type == FileContentType.DIR) { + Toast.show('暂不支持删除文件夹', context); + return false; + } + bool result = await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text('确定删除吗'), + content: Text('删除后无法恢复'), + actions: [ + FlatButton( + child: Text('确定'), + onPressed: () { + Navigator.pop(context, true); + }), + ], + ); + }); + if (!(result ?? false)) { + return false; + } + return false; + + // var del = await _presenter.doDeleteContents( + // _path, _prePath, contents[index].name, contents[index].sha); + // return del; + }, + ); + }); + } + + @override + void loadError(String msg) { + Toast.show(msg, context); + } + + @override + void loadSuccess(List data) { + if (data != null && data.length > 0) { + setState(() { + this.state = LoadState.SUCCESS; + this.contents.clear(); + this.contents.addAll(data); + }); + } else { + setState(() { + this.state = LoadState.EMTPY; + }); + } } } diff --git a/lib/views/manage_page/qiniu_page/qiniu_repo_page_presenter.dart b/lib/views/manage_page/qiniu_page/qiniu_repo_page_presenter.dart index a15175d..ef3a015 100644 --- a/lib/views/manage_page/qiniu_page/qiniu_repo_page_presenter.dart +++ b/lib/views/manage_page/qiniu_page/qiniu_repo_page_presenter.dart @@ -1,33 +1,63 @@ import 'dart:convert'; import 'package:flutter_picgo/api/qiniu_api.dart'; +import 'package:flutter_picgo/components/manage_item.dart'; import 'package:flutter_picgo/model/qiniu_config.dart'; +import 'package:flutter_picgo/model/qiniu_content.dart'; import 'package:flutter_picgo/resources/pb_type_keys.dart'; import 'package:flutter_picgo/utils/image_upload.dart'; import 'package:flutter_picgo/utils/strings.dart'; +import 'package:path/path.dart' as pathlib; -abstract class QiniuRepoPageContract {} +abstract class QiniuRepoPageContract { + void loadSuccess(List data); + + void loadError(String msg); +} class QiniuRepoPagePresenter { QiniuRepoPageContract _view; QiniuRepoPagePresenter(this._view); - doLoadContents() async { + doLoadContents(String prefix) async { try { String configStr = await ImageUploadUtils.getPBConfig(PBTypeKeys.qiniu); QiniuConfig config = QiniuConfig.fromJson(json.decode(configStr)); + print(configStr); if (isBlank(config.accessKey) || isBlank(config.secretKey)) { + _view.loadError('读取配置文件错误'); return; } var result = await QiniuApi.list({ 'bucket': config.bucket, - 'prefix': '', + 'prefix': prefix == '/' ? '' : prefix, 'delimiter': Uri.decodeComponent('/'), }, config.accessKey, config.secretKey); - print(json.encode(result)); + List data = (result['items'] as List).map((e) { + print(e); + QiniuContent c = QiniuContent.fromJson(e); + c.type = FileContentType.FILE; + c.url = pathlib.joinAll([ + config.url, + prefix == '/' ? '' : prefix, + c.key, + ]); + return c; + }).toList(); + if (result['commonPrefixes'] != null) { + (result['commonPrefixes'] as List).forEach((element) { + QiniuContent c = QiniuContent(); + c.type = FileContentType.DIR; + c.url = element; + c.key = element; + data.add(c); + }); + } + _view.loadSuccess(data); } catch (e) { print(e); + _view.loadError('$e'); } } }