From f45848331e32f392c6a6f61fd76296b73e32593d Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Sun, 31 Mar 2024 15:35:12 +0200 Subject: [PATCH 1/8] added bigger feedback dialog widget --- .../pages/more/feedback/feedbackDialog.dart | 79 +++++++++++++++++++ lib/view/pages/overhang.dart | 2 +- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/lib/view/pages/more/feedback/feedbackDialog.dart b/lib/view/pages/more/feedback/feedbackDialog.dart index 69c1746..9a1da1e 100644 --- a/lib/view/pages/more/feedback/feedbackDialog.dart +++ b/lib/view/pages/more/feedback/feedbackDialog.dart @@ -20,6 +20,84 @@ class _FeedbackDialogState extends State { @override Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Feedback'), + ), + body: Column( + mainAxisSize: MainAxisSize.max, + children: [ + const SizedBox(height: 5), + const Text('Feedback, Anregungen, Ideen, Fehler und Verbesserungen', textAlign: TextAlign.center), + const SizedBox(height: 15), + const Text('Bitte gib keine geheimen Daten wie z.B. Passwörter weiter.', textAlign: TextAlign.center, style: TextStyle(fontSize: 11)), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.all(10), + child: TextField( + controller: _feedbackInput, + autofocus: true, + decoration: const InputDecoration( + border: OutlineInputBorder(), + label: Text('Feedback und Verbesserungen') + ), + // style: TextStyle(), + // expands: true, + minLines: 4, + maxLines: 7, + ) + ), + Visibility( + visible: _error != null, + child: Text('Senden fehlgeschlagen: $_error', style: const TextStyle(color: Colors.red)), + ), + Padding( + padding: const EdgeInsets.only(right: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + AddFeedback( + AddFeedbackParams( + user: AccountData().getUserSecret(), + feedback: _feedbackInput.text, + appVersion: int.parse((await PackageInfo.fromPlatform()).buildNumber) + ) + ).run().then((value) { + Navigator.of(context).pop(); + InfoDialog.show(context, 'Danke für dein Feedback!'); + }).catchError((error, trace) { + setState(() { + _error = error.toString(); + }); + }); + }, + child: const Text('Senden'), + ) + ] + ) + ) + + ], + ), + ); + + /* + return Scaffold( + appBar: AppBar( + title: const Text('Raumplan'), + ), + body: PhotoView( + imageProvider: Image.asset('assets/img/raumplan.jpg').image, + minScale: 0.5, + maxScale: 2.0, + backgroundDecoration: BoxDecoration(color: Theme.of(context).colorScheme.background), + ), + ); + */ + + /* return AlertDialog( title: const Text('Feedback'), @@ -74,5 +152,6 @@ class _FeedbackDialogState extends State { ) ], ); + */ } } diff --git a/lib/view/pages/overhang.dart b/lib/view/pages/overhang.dart index 020207e..4ed82c0 100644 --- a/lib/view/pages/overhang.dart +++ b/lib/view/pages/overhang.dart @@ -74,7 +74,7 @@ class Overhang extends StatelessWidget { title: const Text('Du hast eine Idee?'), subtitle: const Text('Fehler und Verbessungsvorschläge'), trailing: const Icon(Icons.arrow_right), - onTap: () => showDialog(context: context, barrierDismissible: false, builder: (context) => const FeedbackDialog()), + onTap: () => pushScreen(context, withNavBar: false, screen: const FeedbackDialog()), ), ], ), From ea329d8d64bc8ca1ff9f4859f2568bc2be629979 Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Sun, 31 Mar 2024 21:02:47 +0200 Subject: [PATCH 2/8] 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'), From 07b32f1e32fb5df0eed9057ef6ba47d42eb3a91a Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Mon, 1 Apr 2024 12:57:27 +0200 Subject: [PATCH 3/8] added option to attach image to feedback --- .../pages/more/feedback/feedbackDialog.dart | 177 ++++++++---------- 1 file changed, 77 insertions(+), 100 deletions(-) diff --git a/lib/view/pages/more/feedback/feedbackDialog.dart b/lib/view/pages/more/feedback/feedbackDialog.dart index e37e858..3f63e26 100644 --- a/lib/view/pages/more/feedback/feedbackDialog.dart +++ b/lib/view/pages/more/feedback/feedbackDialog.dart @@ -6,10 +6,13 @@ 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 'package:provider/provider.dart'; +import 'package:badges/badges.dart' as badges; import '../../../../api/mhsl/server/feedback/addFeedback.dart'; import '../../../../api/mhsl/server/feedback/addFeedbackParams.dart'; import '../../../../model/accountData.dart'; +import '../../../../storage/base/settingsProvider.dart'; import '../../../../widget/filePick.dart'; import '../../../../widget/infoDialog.dart'; @@ -26,6 +29,18 @@ class _FeedbackDialogState extends State { final TextEditingController _feedbackInput = TextEditingController(); Uint8List? _image; String? _error; + bool _textFieldEmpty = false; + + @override + void initState() { + super.initState(); + _feedbackInput.addListener(() { + setState(() { + _textFieldEmpty = _feedbackInput.text.isEmpty; + _error = null; + }); + }); + } @override Widget build(BuildContext context) { @@ -46,53 +61,85 @@ class _FeedbackDialogState extends State { child: TextField( controller: _feedbackInput, autofocus: true, - decoration: const InputDecoration( - border: OutlineInputBorder(), - label: Text('Feedback und Verbesserungen'), + decoration: InputDecoration( + border: const OutlineInputBorder(), + label: const Text('Feedback und Verbesserungen'), + errorText: _textFieldEmpty ? 'Bitte gib eine Beschreibung an' : null, ), - // 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, + const SizedBox(height: 10), + if(_image != null) Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + badges.Badge( + badgeContent: const Icon(Icons.close_outlined, size: 17), + badgeStyle: const badges.BadgeStyle( + padding: EdgeInsets.all(2), + ), + child: 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, + ), + ), + onTap: () async { + setState(() { + _image = null; + }); + }, + ), + ], + ), + Padding( + padding: const EdgeInsets.all(5), + child: Visibility( + visible: _error != null, + child: Visibility( + visible: Provider.of(context, listen: false).val().devToolsEnabled, + replacement: const Text('Senden fehlgeschlagen, bitte überprüfe die Internetverbindung.', textAlign: TextAlign.center, style: TextStyle(color: Colors.red)), + child: Text('Senden fehlgeschlagen: \n $_error', textAlign: TextAlign.center, style: const TextStyle(color: Colors.red)), ), ), - 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, 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), + Visibility( + visible: _image == null, + child: 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 { + if(_feedbackInput.text.isEmpty){ + setState(() { + _textFieldEmpty = true; + }); + return; + } context.loaderOverlay.show(); AddFeedback( AddFeedbackParams( @@ -122,75 +169,5 @@ class _FeedbackDialogState extends State { ), ); - /* - return Scaffold( - appBar: AppBar( - title: const Text('Raumplan'), - ), - body: PhotoView( - imageProvider: Image.asset('assets/img/raumplan.jpg').image, - minScale: 0.5, - maxScale: 2.0, - backgroundDecoration: BoxDecoration(color: Theme.of(context).colorScheme.background), - ), - ); - */ - - /* - return AlertDialog( - - title: const Text('Feedback'), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Text('Feedback, Anregungen, Ideen, Fehler und Verbesserungen'), - const SizedBox(height: 10), - const Text('Bitte gib keine geheimen Daten wie z.B. Passwörter weiter.', style: TextStyle(fontSize: 10)), - const SizedBox(height: 10), - TextField( - controller: _feedbackInput, - autofocus: true, - decoration: const InputDecoration( - border: OutlineInputBorder(), - label: Text('Feedback und Verbesserungen') - ), - // style: TextStyle(), - // expands: true, - minLines: 3, - maxLines: 5, - ), - Visibility( - visible: _error != null, - child: Text('Senden fehlgeschlagen: $_error', style: const TextStyle(color: Colors.red)) - ) - ], - ), - actions: [ - TextButton(onPressed: () => Navigator.of(context).pop(), child: const Text('Abbrechen')), - TextButton( - onPressed: () async { - AddFeedback( - AddFeedbackParams( - user: AccountData().getUserSecret(), - feedback: _feedbackInput.text, - appVersion: int.parse((await PackageInfo.fromPlatform()).buildNumber) - ) - ) - .run() - .then((value) { - Navigator.of(context).pop(); - InfoDialog.show(context, 'Danke für dein Feedback!'); - }) - .catchError((error, trace) { - setState(() { - _error = error.toString(); - }); - }); - }, - child: const Text('Senden'), - ) - ], - ); - */ } } From 6c2c305f1c9981c6dee8a402b70c9ccf621295b2 Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Mon, 1 Apr 2024 14:18:23 +0200 Subject: [PATCH 4/8] old cache gets deleted --- lib/app.dart | 3 +++ lib/model/dataCleaner.dart | 15 +++++++++++++++ lib/widget/debug/cacheView.dart | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 lib/model/dataCleaner.dart diff --git a/lib/app.dart b/lib/app.dart index 07d46cb..9bff71b 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -14,6 +14,7 @@ import 'api/mhsl/server/userIndex/update/updateUserindex.dart'; import 'model/breakers/Breaker.dart'; import 'model/breakers/BreakerProps.dart'; import 'model/chatList/chatListProps.dart'; +import 'model/dataCleaner.dart'; import 'model/timetable/timetableProps.dart'; import 'notification/notificationController.dart'; import 'notification/notificationTasks.dart'; @@ -87,6 +88,8 @@ class _AppState extends State with WidgetsBindingObserver { FirebaseMessaging.onMessageOpenedApp.listen((message) => NotificationController.onAppOpenedByNotification(message, context)); FirebaseMessaging.instance.getInitialMessage().then((message) => message == null ? null : NotificationController.onAppOpenedByNotification(message, context)); + DataCleaner.cleanOldCache(); + super.initState(); } diff --git a/lib/model/dataCleaner.dart b/lib/model/dataCleaner.dart new file mode 100644 index 0000000..5e6a3ce --- /dev/null +++ b/lib/model/dataCleaner.dart @@ -0,0 +1,15 @@ +import 'package:localstore/localstore.dart'; + +import '../widget/debug/cacheView.dart'; + +class DataCleaner { + static void cleanOldCache() async { + var cacheData = await Localstore.instance.collection(CacheView.collection).get(); + cacheData?.forEach((key, value) async { + DateTime lastUpdate = DateTime.fromMillisecondsSinceEpoch(value['lastupdate']); + if(DateTime.now().subtract(const Duration(days: 200)).isAfter(lastUpdate)) { + await Localstore.instance.collection(CacheView.collection).doc(key.split('/').last).delete(); + } + }); + } +} \ No newline at end of file diff --git a/lib/widget/debug/cacheView.dart b/lib/widget/debug/cacheView.dart index c639645..caa34aa 100644 --- a/lib/widget/debug/cacheView.dart +++ b/lib/widget/debug/cacheView.dart @@ -11,7 +11,7 @@ import '../../../widget/placeholderView.dart'; import 'jsonViewer.dart'; class CacheView extends StatefulWidget { - final collection = 'MarianumMobile'; + static String collection = 'MarianumMobile'; const CacheView({super.key}); @override @@ -34,7 +34,7 @@ class _CacheViewState extends State { @override void initState() { - files = Localstore.instance.collection(widget.collection).get(); + files = Localstore.instance.collection(CacheView.collection).get(); super.initState(); } From 42574583edf76709ba4bbd65ade95b87bd8d314d Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Tue, 2 Apr 2024 14:32:37 +0200 Subject: [PATCH 5/8] added unfocus when tapping on background image --- lib/view/pages/talk/chatView.dart | 57 +++++++++++++++++-------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/lib/view/pages/talk/chatView.dart b/lib/view/pages/talk/chatView.dart index 4931187..e57aa36 100644 --- a/lib/view/pages/talk/chatView.dart +++ b/lib/view/pages/talk/chatView.dart @@ -108,33 +108,38 @@ class _ChatViewState extends State { ), ), ), - body: Container( - decoration: BoxDecoration( - image: DecorationImage( - image: const AssetImage('assets/background/chat.png'), - scale: 1.5, - opacity: 1, - repeat: ImageRepeat.repeat, - invertColors: AppTheme.isDarkMode(context) - ) - ), - child: data.primaryLoading() ? const LoadingSpinner() : Column( - children: [ - Expanded( - child: ListView( - reverse: true, - controller: _listController, - children: messages.reversed.toList(), + body: GestureDetector( + onTap: () { + FocusScope.of(context).requestFocus(FocusNode()); + }, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: const AssetImage('assets/background/chat.png'), + scale: 1.5, + opacity: 1, + repeat: ImageRepeat.repeat, + invertColors: AppTheme.isDarkMode(context) + ) + ), + child: data.primaryLoading() ? const LoadingSpinner() : Column( + children: [ + Expanded( + child: ListView( + reverse: true, + controller: _listController, + children: messages.reversed.toList(), + ), ), - ), - Container( - color: Theme.of(context).colorScheme.background, - child: TalkNavigator.isSecondaryVisible(context) - ? ChatTextfield(widget.room.token) - : SafeArea(child: ChatTextfield(widget.room.token) - ), - ) - ], + Container( + color: Theme.of(context).colorScheme.background, + child: TalkNavigator.isSecondaryVisible(context) + ? ChatTextfield(widget.room.token) + : SafeArea(child: ChatTextfield(widget.room.token) + ), + ) + ], + ), ), ), ); From 339d402422cc906d4fe5c0b4404ccd7c7616f944 Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Tue, 2 Apr 2024 14:41:36 +0200 Subject: [PATCH 6/8] added unfocus when tapping outside textfield --- lib/view/pages/talk/chatView.dart | 57 +++++++++---------- .../pages/talk/components/chatTextfield.dart | 3 + 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/lib/view/pages/talk/chatView.dart b/lib/view/pages/talk/chatView.dart index e57aa36..1797b3a 100644 --- a/lib/view/pages/talk/chatView.dart +++ b/lib/view/pages/talk/chatView.dart @@ -108,38 +108,33 @@ class _ChatViewState extends State { ), ), ), - body: GestureDetector( - onTap: () { - FocusScope.of(context).requestFocus(FocusNode()); - }, - child: Container( - decoration: BoxDecoration( - image: DecorationImage( - image: const AssetImage('assets/background/chat.png'), - scale: 1.5, - opacity: 1, - repeat: ImageRepeat.repeat, - invertColors: AppTheme.isDarkMode(context) - ) - ), - child: data.primaryLoading() ? const LoadingSpinner() : Column( - children: [ - Expanded( - child: ListView( - reverse: true, - controller: _listController, - children: messages.reversed.toList(), - ), + body: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: const AssetImage('assets/background/chat.png'), + scale: 1.5, + opacity: 1, + repeat: ImageRepeat.repeat, + invertColors: AppTheme.isDarkMode(context) + ) + ), + child: data.primaryLoading() ? const LoadingSpinner() : Column( + children: [ + Expanded( + child: ListView( + reverse: true, + controller: _listController, + children: messages.reversed.toList(), ), - Container( - color: Theme.of(context).colorScheme.background, - child: TalkNavigator.isSecondaryVisible(context) - ? ChatTextfield(widget.room.token) - : SafeArea(child: ChatTextfield(widget.room.token) - ), - ) - ], - ), + ), + Container( + color: Theme.of(context).colorScheme.background, + child: TalkNavigator.isSecondaryVisible(context) + ? ChatTextfield(widget.room.token) + : SafeArea(child: ChatTextfield(widget.room.token) + ), + ) + ], ), ), ); diff --git a/lib/view/pages/talk/components/chatTextfield.dart b/lib/view/pages/talk/components/chatTextfield.dart index 1ec6b68..885a9b1 100644 --- a/lib/view/pages/talk/components/chatTextfield.dart +++ b/lib/view/pages/talk/components/chatTextfield.dart @@ -156,6 +156,9 @@ class _ChatTextfieldState extends State { } setDraft(text); }, + onTapOutside: (PointerDownEvent event) { + FocusScope.of(context).requestFocus(FocusNode()); + }, ), ), const SizedBox(width: 15), From 21411e1517598c55c2ef966c24e3fc45179ee8e3 Mon Sep 17 00:00:00 2001 From: Pupsi28 Date: Tue, 2 Apr 2024 15:03:37 +0200 Subject: [PATCH 7/8] added unfocus at textfields for custon events and feedback --- lib/view/pages/more/feedback/feedbackDialog.dart | 3 +++ .../pages/timetable/customTimetableEventEditDialog.dart | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/lib/view/pages/more/feedback/feedbackDialog.dart b/lib/view/pages/more/feedback/feedbackDialog.dart index 3f63e26..fb3a478 100644 --- a/lib/view/pages/more/feedback/feedbackDialog.dart +++ b/lib/view/pages/more/feedback/feedbackDialog.dart @@ -68,6 +68,9 @@ class _FeedbackDialogState extends State { ), minLines: 4, maxLines: 7, + onTapOutside: (PointerDownEvent event) { + FocusScope.of(context).requestFocus(FocusNode()); + }, ), ), const SizedBox(height: 10), diff --git a/lib/view/pages/timetable/customTimetableEventEditDialog.dart b/lib/view/pages/timetable/customTimetableEventEditDialog.dart index 02844f3..7808e66 100644 --- a/lib/view/pages/timetable/customTimetableEventEditDialog.dart +++ b/lib/view/pages/timetable/customTimetableEventEditDialog.dart @@ -67,6 +67,9 @@ class _AddCustomTimetableEventDialogState extends State Date: Tue, 2 Apr 2024 16:45:43 +0200 Subject: [PATCH 8/8] resolved pr comments --- .../pages/more/feedback/feedbackDialog.dart | 5 ++-- lib/view/pages/talk/chatView.dart | 14 +++++------ .../pages/talk/components/chatTextfield.dart | 5 ++-- .../customTimetableEventEditDialog.dart | 9 +++----- lib/widget/focusBehaviour.dart | 7 ++++++ lib/widget/quickMenu.dart | 23 ------------------- 6 files changed, 21 insertions(+), 42 deletions(-) create mode 100644 lib/widget/focusBehaviour.dart delete mode 100644 lib/widget/quickMenu.dart diff --git a/lib/view/pages/more/feedback/feedbackDialog.dart b/lib/view/pages/more/feedback/feedbackDialog.dart index fb3a478..2e0a3e7 100644 --- a/lib/view/pages/more/feedback/feedbackDialog.dart +++ b/lib/view/pages/more/feedback/feedbackDialog.dart @@ -14,6 +14,7 @@ import '../../../../api/mhsl/server/feedback/addFeedbackParams.dart'; import '../../../../model/accountData.dart'; import '../../../../storage/base/settingsProvider.dart'; import '../../../../widget/filePick.dart'; +import '../../../../widget/focusBehaviour.dart'; import '../../../../widget/infoDialog.dart'; class FeedbackDialog extends StatefulWidget { @@ -68,9 +69,7 @@ class _FeedbackDialogState extends State { ), minLines: 4, maxLines: 7, - onTapOutside: (PointerDownEvent event) { - FocusScope.of(context).requestFocus(FocusNode()); - }, + onTapOutside: (PointerDownEvent event) => FocusBehaviour.textFieldTapOutside(context), ), ), const SizedBox(height: 10), diff --git a/lib/view/pages/talk/chatView.dart b/lib/view/pages/talk/chatView.dart index 1797b3a..92fe293 100644 --- a/lib/view/pages/talk/chatView.dart +++ b/lib/view/pages/talk/chatView.dart @@ -110,13 +110,13 @@ class _ChatViewState extends State { ), body: Container( decoration: BoxDecoration( - image: DecorationImage( - image: const AssetImage('assets/background/chat.png'), - scale: 1.5, - opacity: 1, - repeat: ImageRepeat.repeat, - invertColors: AppTheme.isDarkMode(context) - ) + image: DecorationImage( + image: const AssetImage('assets/background/chat.png'), + scale: 1.5, + opacity: 1, + repeat: ImageRepeat.repeat, + invertColors: AppTheme.isDarkMode(context), + ) ), child: data.primaryLoading() ? const LoadingSpinner() : Column( children: [ diff --git a/lib/view/pages/talk/components/chatTextfield.dart b/lib/view/pages/talk/components/chatTextfield.dart index 885a9b1..5513d8a 100644 --- a/lib/view/pages/talk/components/chatTextfield.dart +++ b/lib/view/pages/talk/components/chatTextfield.dart @@ -14,6 +14,7 @@ import '../../../../api/marianumcloud/webdav/webdavApi.dart'; import '../../../../model/chatList/chatProps.dart'; import '../../../../storage/base/settingsProvider.dart'; import '../../../../widget/filePick.dart'; +import '../../../../widget/focusBehaviour.dart'; import '../../files/fileUploadDialog.dart'; class ChatTextfield extends StatefulWidget { @@ -156,9 +157,7 @@ class _ChatTextfieldState extends State { } setDraft(text); }, - onTapOutside: (PointerDownEvent event) { - FocusScope.of(context).requestFocus(FocusNode()); - }, + onTapOutside: (PointerDownEvent event) => FocusBehaviour.textFieldTapOutside(context), ), ), const SizedBox(width: 15), diff --git a/lib/view/pages/timetable/customTimetableEventEditDialog.dart b/lib/view/pages/timetable/customTimetableEventEditDialog.dart index 7808e66..f08aafd 100644 --- a/lib/view/pages/timetable/customTimetableEventEditDialog.dart +++ b/lib/view/pages/timetable/customTimetableEventEditDialog.dart @@ -15,6 +15,7 @@ import '../../../api/mhsl/customTimetableEvent/update/updateCustomTimetableEvent import '../../../api/mhsl/customTimetableEvent/update/updateCustomTimetableEventParams.dart'; import '../../../model/accountData.dart'; import '../../../model/timetable/timetableProps.dart'; +import '../../../widget/focusBehaviour.dart'; import '../../../widget/infoDialog.dart'; import 'customTimetableColors.dart'; @@ -67,9 +68,7 @@ class _AddCustomTimetableEventDialogState extends State FocusBehaviour.textFieldTapOutside(context), ), ), ListTile( @@ -81,9 +80,7 @@ class _AddCustomTimetableEventDialogState extends State FocusBehaviour.textFieldTapOutside(context), ), ), const Divider(), diff --git a/lib/widget/focusBehaviour.dart b/lib/widget/focusBehaviour.dart new file mode 100644 index 0000000..fe5a52b --- /dev/null +++ b/lib/widget/focusBehaviour.dart @@ -0,0 +1,7 @@ +import 'package:flutter/cupertino.dart'; + +class FocusBehaviour { + static void textFieldTapOutside(BuildContext context) { + FocusScope.of(context).requestFocus(FocusNode()); + } +} \ No newline at end of file diff --git a/lib/widget/quickMenu.dart b/lib/widget/quickMenu.dart deleted file mode 100644 index 0c39968..0000000 --- a/lib/widget/quickMenu.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:flutter/material.dart'; - -class QuickMenu { - static void quickMenu(BuildContext context, BuildContext widgetContext, List> items) { - final RenderBox overlay = Overlay.of(context).context.findRenderObject() as RenderBox; - - final RenderBox widgetRenderBox = widgetContext.findRenderObject() as RenderBox; - final Offset position = widgetRenderBox.localToGlobal(Offset.zero); - - showMenu( - context: context, - position: RelativeRect.fromRect( - Rect.fromPoints( - position, - position.translate(0, 0), - ), - Offset.zero & overlay.size, - ), - items: items, - ); - } - -} \ No newline at end of file