From 1a53a26f397839e5e6e69d1acbe83ff263a78937 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Sat, 2 May 2020 08:51:34 +0200 Subject: [PATCH] Can upload a new logo for the group --- lib/helpers/groups_helper.dart | 11 ++++++ lib/models/api_request.dart | 4 +++ lib/ui/screens/group_settings_screen.dart | 41 +++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/lib/helpers/groups_helper.dart b/lib/helpers/groups_helper.dart index 7a6227a..2f65e26 100644 --- a/lib/helpers/groups_helper.dart +++ b/lib/helpers/groups_helper.dart @@ -1,3 +1,5 @@ +import 'dart:typed_data'; + import 'package:comunic/lists/groups_list.dart'; import 'package:comunic/models/advanced_group_info.dart'; import 'package:comunic/models/api_request.dart'; @@ -226,6 +228,15 @@ class GroupsHelper { .execWithThrow(); } + /// Upload a new logo + /// + /// Throws in case of failure + static Future uploadNewLogo(int groupID, Uint8List bytes) async => + await APIRequest(uri: "groups/upload_logo", needLogin: true) + .addInt("id", groupID) + .addBytesFile("logo", BytesFile("logo.png", bytes)) + .execWithFilesAndThrow(); + /// Turn an API entry into a group object Group _getGroupFromAPI(Map map) { return Group( diff --git a/lib/models/api_request.dart b/lib/models/api_request.dart index 275d626..e095b13 100644 --- a/lib/models/api_request.dart +++ b/lib/models/api_request.dart @@ -71,4 +71,8 @@ class APIRequest { /// Execute the request with files Future execWithFiles() async => APIHelper().execWithFiles(this); + + /// Execute the request with files to send & throws in case of failure + Future execWithFilesAndThrow() async => + (await execWithFiles()).assertOk(); } diff --git a/lib/ui/screens/group_settings_screen.dart b/lib/ui/screens/group_settings_screen.dart index 3af5a5f..9119774 100644 --- a/lib/ui/screens/group_settings_screen.dart +++ b/lib/ui/screens/group_settings_screen.dart @@ -1,3 +1,5 @@ +import 'dart:typed_data'; + import 'package:comunic/helpers/groups_helper.dart'; import 'package:comunic/models/advanced_group_info.dart'; import 'package:comunic/models/group.dart'; @@ -5,9 +7,11 @@ import 'package:comunic/ui/dialogs/multi_choices_dialog.dart'; import 'package:comunic/ui/dialogs/virtual_directory_dialog.dart'; import 'package:comunic/ui/widgets/async_screen_widget.dart'; import 'package:comunic/ui/widgets/comunic_back_button_widget.dart'; +import 'package:comunic/ui/widgets/group_icon_widget.dart'; import 'package:comunic/ui/widgets/safe_state.dart'; import 'package:comunic/ui/widgets/settings/multi_choices_settings_tile.dart'; import 'package:comunic/ui/widgets/settings/text_settings_edit_tile.dart'; +import 'package:comunic/utils/files_utils.dart'; import 'package:comunic/utils/input_utils.dart'; import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/ui_utils.dart'; @@ -75,6 +79,7 @@ class _GroupSettingsScreenState extends SafeState { sections: [ _buildGeneralSection(), _buildAccessRestrictions(), + _buildGroupLogoArea() ], ); } @@ -233,4 +238,40 @@ class _GroupSettingsScreenState extends SafeState { }), ], ); + + Widget _buildGroupLogoArea() { + return SettingsSection( + title: tr("Group logo"), + tiles: [ + // Current logo + SettingsTile( + title: tr("Current logo"), + leading: GroupIcon(group: _groupSettings), + ), + + // Upload a new logo + SettingsTile( + title: tr("Upload a new logo"), + onTap: _uploadNewLogo, + ), + ], + ); + } + + // Upload a new logo for the group + void _uploadNewLogo() async { + try { + final logo = await pickImage(context); + final bytes = logo.readAsBytesSync(); + await _doUploadLogo(bytes); + } catch (e, stack) { + print("Could not upload new logo! $e\n$stack"); + showSimpleSnack(context, tr("Could not upload new logo!")); + } + } + + Future _doUploadLogo(Uint8List bytes) async { + await GroupsHelper.uploadNewLogo(_groupSettings.id, bytes); + _key.currentState.refresh(); + } }