From 8f93a343aee5b95cc869008cd269e9998104ffc3 Mon Sep 17 00:00:00 2001 From: pouria Date: Thu, 30 Jan 2025 15:40:27 +0330 Subject: [PATCH] fix multiple submit issue. now show CircularProgressIndicator instead of TextButton when submiting --- feedback/example/lib/main.dart | 3 +- feedback/lib/src/better_feedback.dart | 3 ++ feedback/lib/src/feedback_bottom_sheet.dart | 7 ++++ .../src/feedback_builder/string_feedback.dart | 33 ++++++++++++------- feedback/lib/src/feedback_widget.dart | 8 +++++ feedback/test/feedback_test.dart | 2 +- 6 files changed, 43 insertions(+), 13 deletions(-) diff --git a/feedback/example/lib/main.dart b/feedback/example/lib/main.dart index 0f0fda02..18a2eb80 100644 --- a/feedback/example/lib/main.dart +++ b/feedback/example/lib/main.dart @@ -36,7 +36,8 @@ class _MyAppState extends State { // If custom feedback is not enabled, supply null and the default text // feedback form will be used. feedbackBuilder: _useCustomFeedback - ? (context, onSubmit, scrollController) => CustomFeedbackForm( + ? (context, onSubmit, scrollController, showLoading) => + CustomFeedbackForm( onSubmit: onSubmit, scrollController: scrollController, ) diff --git a/feedback/lib/src/better_feedback.dart b/feedback/lib/src/better_feedback.dart index 9657add6..fedc25dc 100644 --- a/feedback/lib/src/better_feedback.dart +++ b/feedback/lib/src/better_feedback.dart @@ -17,6 +17,8 @@ typedef OnSubmit = Future Function( Map? extras, }); +typedef ShowLoading = bool; + /// A function that returns a Widget that prompts the user for feedback and /// calls [OnSubmit] when the user wants to submit their feedback. /// @@ -31,6 +33,7 @@ typedef FeedbackBuilder = Widget Function( BuildContext, OnSubmit, ScrollController?, + ShowLoading, ); /// A drag handle to be placed at the top of a draggable feedback sheet. diff --git a/feedback/lib/src/feedback_bottom_sheet.dart b/feedback/lib/src/feedback_bottom_sheet.dart index 8a09c097..18495242 100644 --- a/feedback/lib/src/feedback_bottom_sheet.dart +++ b/feedback/lib/src/feedback_bottom_sheet.dart @@ -12,11 +12,13 @@ class FeedbackBottomSheet extends StatelessWidget { required this.feedbackBuilder, required this.onSubmit, required this.sheetProgress, + required this.showLoading, }); final FeedbackBuilder feedbackBuilder; final OnSubmit onSubmit; final ValueNotifier sheetProgress; + final bool showLoading; @override Widget build(BuildContext context) { @@ -26,6 +28,7 @@ class FeedbackBottomSheet extends StatelessWidget { feedbackBuilder: feedbackBuilder, onSubmit: onSubmit, sheetProgress: sheetProgress, + showLoading: showLoading, ), ); } @@ -45,6 +48,7 @@ class FeedbackBottomSheet extends StatelessWidget { context, onSubmit, null, + showLoading, ), ); }, @@ -60,11 +64,13 @@ class _DraggableFeedbackSheet extends StatefulWidget { required this.feedbackBuilder, required this.onSubmit, required this.sheetProgress, + required this.showLoading, }); final FeedbackBuilder feedbackBuilder; final OnSubmit onSubmit; final ValueNotifier sheetProgress; + final bool showLoading; @override State<_DraggableFeedbackSheet> createState() => @@ -138,6 +144,7 @@ class _DraggableFeedbackSheetState extends State<_DraggableFeedbackSheet> { context, widget.onSubmit, scrollController, + widget.showLoading, ), ); }, diff --git a/feedback/lib/src/feedback_builder/string_feedback.dart b/feedback/lib/src/feedback_builder/string_feedback.dart index 78c9ea2b..d8d4744a 100644 --- a/feedback/lib/src/feedback_builder/string_feedback.dart +++ b/feedback/lib/src/feedback_builder/string_feedback.dart @@ -8,8 +8,13 @@ Widget simpleFeedbackBuilder( BuildContext context, OnSubmit onSubmit, ScrollController? scrollController, + bool showLoading, ) => - StringFeedback(onSubmit: onSubmit, scrollController: scrollController); + StringFeedback( + onSubmit: onSubmit, + scrollController: scrollController, + showLoading: showLoading, + ); /// A form that prompts the user for feedback with a single text field. /// This is the default feedback widget used by [BetterFeedback]. @@ -20,11 +25,15 @@ class StringFeedback extends StatefulWidget { super.key, required this.onSubmit, required this.scrollController, + required this.showLoading, }); /// Should be called when the user taps the submit button. final OnSubmit onSubmit; + /// show CircularProgressIndicator when Submiting + final bool showLoading; + /// A scroll controller that expands the sheet when it's attached to a /// scrollable widget and that widget is scrolled. /// @@ -88,16 +97,18 @@ class _StringFeedbackState extends State { ], ), ), - TextButton( - key: const Key('submit_feedback_button'), - child: Text( - FeedbackLocalizations.of(context).submitButtonText, - style: TextStyle( - color: FeedbackTheme.of(context).activeFeedbackModeColor, - ), - ), - onPressed: () => widget.onSubmit(controller.text), - ), + widget.showLoading + ? CircularProgressIndicator() + : TextButton( + key: const Key('submit_feedback_button'), + child: Text( + FeedbackLocalizations.of(context).submitButtonText, + style: TextStyle( + color: FeedbackTheme.of(context).activeFeedbackModeColor, + ), + ), + onPressed: () => widget.onSubmit(controller.text), + ), const SizedBox(height: 8), ], ); diff --git a/feedback/lib/src/feedback_widget.dart b/feedback/lib/src/feedback_widget.dart index f22acedb..ebcde89d 100644 --- a/feedback/lib/src/feedback_widget.dart +++ b/feedback/lib/src/feedback_widget.dart @@ -51,6 +51,7 @@ class FeedbackWidgetState extends State with SingleTickerProviderStateMixin { // Padding to put around the interactive screenshot preview. final double padding = 8; + bool showLoading = false; // We use a ValueNotifier instead of just a double and `SetState` because // rebuilding the feedback sheet mid-drag cancels the drag. @@ -263,10 +264,14 @@ class FeedbackWidgetState extends State child: FeedbackBottomSheet( key: const Key('feedback_bottom_sheet'), feedbackBuilder: widget.feedbackBuilder, + showLoading: showLoading, onSubmit: ( String feedback, { Map? extras, }) async { + setState(() { + showLoading = true; + }); await _sendFeedback( context, BetterFeedback.of(context).onFeedback!, @@ -275,6 +280,9 @@ class FeedbackWidgetState extends State widget.pixelRatio, extras: extras, ); + setState(() { + showLoading = false; + }); painterController.clear(); }, sheetProgress: sheetProgress, diff --git a/feedback/test/feedback_test.dart b/feedback/test/feedback_test.dart index d55e950a..b87702e3 100644 --- a/feedback/test/feedback_test.dart +++ b/feedback/test/feedback_test.dart @@ -224,7 +224,7 @@ void main() { submittedFeedback = feedback; }, ), - feedbackBuilder: (context, onSubmit, controller) { + feedbackBuilder: (context, onSubmit, controller, showLoading) { return SingleChildScrollView( controller: controller, child: TextButton(