From ea329d8d64bc8ca1ff9f4859f2568bc2be629979 Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Sun, 31 Mar 2024 21:02:47 +0200 Subject: [PATCH] added option to attach image to feedback --- .../server/feedback/addFeedbackParams.dart | 2 + .../server/feedback/addFeedbackParams.g.dart | 2 + .../pages/more/feedback/feedbackDialog.dart | 47 +++++++++++++++++-- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lib/api/mhsl/server/feedback/addFeedbackParams.dart b/lib/api/mhsl/server/feedback/addFeedbackParams.dart index 4f3e8b0..3ed0c55 100644 --- a/lib/api/mhsl/server/feedback/addFeedbackParams.dart +++ b/lib/api/mhsl/server/feedback/addFeedbackParams.dart @@ -6,12 +6,14 @@ part 'addFeedbackParams.g.dart'; class AddFeedbackParams { String user; String feedback; + String? screenshot; int appVersion; AddFeedbackParams({ required this.user, required this.feedback, + this.screenshot, required this.appVersion, }); diff --git a/lib/api/mhsl/server/feedback/addFeedbackParams.g.dart b/lib/api/mhsl/server/feedback/addFeedbackParams.g.dart index 47f2105..f401495 100644 --- a/lib/api/mhsl/server/feedback/addFeedbackParams.g.dart +++ b/lib/api/mhsl/server/feedback/addFeedbackParams.g.dart @@ -10,6 +10,7 @@ AddFeedbackParams _$AddFeedbackParamsFromJson(Map json) => AddFeedbackParams( user: json['user'] as String, feedback: json['feedback'] as String, + screenshot: json['screenshot'] as String?, appVersion: json['appVersion'] as int, ); @@ -17,5 +18,6 @@ Map _$AddFeedbackParamsToJson(AddFeedbackParams instance) => { 'user': instance.user, 'feedback': instance.feedback, + 'screenshot': instance.screenshot, 'appVersion': instance.appVersion, }; diff --git a/lib/view/pages/more/feedback/feedbackDialog.dart b/lib/view/pages/more/feedback/feedbackDialog.dart index 9a1da1e..e37e858 100644 --- a/lib/view/pages/more/feedback/feedbackDialog.dart +++ b/lib/view/pages/more/feedback/feedbackDialog.dart @@ -1,10 +1,16 @@ +import 'dart:convert'; +import 'dart:typed_data'; + import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:loader_overlay/loader_overlay.dart'; import 'package:package_info/package_info.dart'; import '../../../../api/mhsl/server/feedback/addFeedback.dart'; import '../../../../api/mhsl/server/feedback/addFeedbackParams.dart'; import '../../../../model/accountData.dart'; +import '../../../../widget/filePick.dart'; import '../../../../widget/infoDialog.dart'; class FeedbackDialog extends StatefulWidget { @@ -15,7 +21,10 @@ class FeedbackDialog extends StatefulWidget { } class _FeedbackDialogState extends State { + final ImagePicker picker = ImagePicker(); + final TextEditingController _feedbackInput = TextEditingController(); + Uint8List? _image; String? _error; @override @@ -39,38 +48,68 @@ class _FeedbackDialogState extends State { autofocus: true, decoration: const InputDecoration( border: OutlineInputBorder(), - label: Text('Feedback und Verbesserungen') + label: Text('Feedback und Verbesserungen'), ), // style: TextStyle(), // expands: true, minLines: 4, maxLines: 7, - ) + ), + ), + if(_image != null) Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(5)), + border: Border.all( + width: 3, + color: Theme.of(context).primaryColor, + ), + ), + height: 150, + child: Image( + image: Image.memory(_image!).image, + fit: BoxFit.contain, + ), ), Visibility( visible: _error != null, child: Text('Senden fehlgeschlagen: $_error', style: const TextStyle(color: Colors.red)), ), Padding( - padding: const EdgeInsets.only(right: 20), + padding: const EdgeInsets.only(right: 20, left: 10), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ + IconButton( + onPressed: () async { + context.loaderOverlay.show(); + var imageData = await (await FilePick.galleryPick())?.readAsBytes(); + context.loaderOverlay.hide(); + setState(() { + _image = imageData; + }); + }, + icon: const Icon(Icons.attach_file_outlined), + ), + const Expanded(child: SizedBox.shrink()), TextButton( onPressed: () async { + context.loaderOverlay.show(); AddFeedback( AddFeedbackParams( user: AccountData().getUserSecret(), feedback: _feedbackInput.text, - appVersion: int.parse((await PackageInfo.fromPlatform()).buildNumber) + screenshot: _image != null ? base64Encode(_image!) : null, + appVersion: int.parse((await PackageInfo.fromPlatform()).buildNumber), ) ).run().then((value) { Navigator.of(context).pop(); InfoDialog.show(context, 'Danke für dein Feedback!'); + context.loaderOverlay.hide(); }).catchError((error, trace) { setState(() { _error = error.toString(); }); + context.loaderOverlay.hide(); }); }, child: const Text('Senden'),