diff --git a/assets/images/ic_arrow_up_outline.svg b/assets/images/ic_arrow_up_outline.svg index cf2ed6fc4..2aca27c07 100644 --- a/assets/images/ic_arrow_up_outline.svg +++ b/assets/images/ic_arrow_up_outline.svg @@ -1,3 +1,8 @@ - - + + + + + + + diff --git a/lib/features/thread/presentation/styles/scroll_to_top_button_widget_styles.dart b/lib/features/thread/presentation/styles/scroll_to_top_button_widget_styles.dart index 2cb2e7663..024550c4f 100644 --- a/lib/features/thread/presentation/styles/scroll_to_top_button_widget_styles.dart +++ b/lib/features/thread/presentation/styles/scroll_to_top_button_widget_styles.dart @@ -1,12 +1,12 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; class ScrollToTopButtonWidgetStyles { static const double defaultLimitIndicator = 50.0; static const double defaultElevation = 5.0; static const Color defaultColor = AppColor.colorLabelCancelButton; - static const double defaultButtonRadius = 44.0; - static const double buttonPadding = 16.0; + static const double defaultButtonRadius = 32.0; + static const double buttonPadding = 8.0; static const double iconWidth = 28.0; static const double iconHeight = 28.0; } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index ca96898a5..097153402 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -1096,4 +1096,10 @@ class ThreadController extends BaseController with EmailActionController { return true; } } + + void scrollToTop() { + if (listEmailController.hasClients) { + listEmailController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.fastOutSlowIn); + } + } } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 6f2958c27..bd52df9fa 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -162,19 +162,22 @@ class ThreadView extends GetWidget floatingActionButton: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ - ScrollToTopButtonWidget( - scrollController: controller.listEmailController, - onTap: () => controller.scrollToTop(), - responsiveUtils: _responsiveUtils, - icon: SvgPicture.asset( - _imagePaths.icArrowUpOutline, - width: ScrollToTopButtonWidgetStyles.iconWidth, - height: ScrollToTopButtonWidgetStyles.iconHeight, - fit: BoxFit.fill, - colorFilter: Colors.white.asFilter(), + Container( + padding: const EdgeInsetsDirectional.only(end: 4.0), + child: ScrollToTopButtonWidget( + scrollController: controller.listEmailController, + onTap: controller.scrollToTop, + responsiveUtils: _responsiveUtils, + icon: SvgPicture.asset( + _imagePaths.icArrowUpOutline, + width: ScrollToTopButtonWidgetStyles.iconWidth, + height: ScrollToTopButtonWidgetStyles.iconHeight, + fit: BoxFit.fill, + colorFilter: Colors.white.asFilter(), + ), ), ), - const SizedBox(height: 12), + const SizedBox(height: 24), _buildFloatingButtonCompose(context), ], ), diff --git a/lib/features/thread/presentation/widgets/scroll_to_top_button_widget.dart b/lib/features/thread/presentation/widgets/scroll_to_top_button_widget.dart index d340c9cb8..ce3ae7581 100644 --- a/lib/features/thread/presentation/widgets/scroll_to_top_button_widget.dart +++ b/lib/features/thread/presentation/widgets/scroll_to_top_button_widget.dart @@ -6,10 +6,10 @@ class ScrollToTopButtonWidget extends StatefulWidget { final ScrollController scrollController; final GestureTapCallback onTap; final ResponsiveUtils responsiveUtils; - final double? limitIndicator; - final double? elevation; - final Color? colorButton; - final double? buttonRadius; + final double limitIndicator; + final double elevation; + final Color colorButton; + final double buttonRadius; final Widget? icon; const ScrollToTopButtonWidget({ @@ -34,32 +34,29 @@ class _ScrollToTopButtonWidgetState extends State { @override void initState() { super.initState(); - _handleScroll(); + widget.scrollController.addListener(_handleScroll); } @override void dispose() { - widget.scrollController.removeListener(() {}); + widget.scrollController.removeListener(_handleScroll); super.dispose(); } void _handleScroll() { - ScrollController scrollController = widget.scrollController; - scrollController.addListener(() { - if (scrollController.position.pixels > widget.limitIndicator!) { - if (mounted) { - setState(() { - _isVisible = true; - }); - } - } else if (scrollController.position.pixels <= widget.limitIndicator!) { - if (mounted) { - setState(() { - _isVisible = false; - }); - } + if (widget.scrollController.position.pixels > widget.limitIndicator) { + if (mounted) { + setState(() { + _isVisible = true; + }); } - }); + } else if (widget.scrollController.position.pixels <= widget.limitIndicator) { + if (mounted) { + setState(() { + _isVisible = false; + }); + } + } } @override @@ -76,11 +73,11 @@ class _ScrollToTopButtonWidgetState extends State { elevation: widget.elevation, shape: const CircleBorder(), child: InkWell( - borderRadius: BorderRadius.circular(widget.buttonRadius!), + borderRadius: BorderRadius.all(Radius.circular(widget.buttonRadius)), onTap: widget.onTap, child: Ink( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(widget.buttonRadius!), + borderRadius: BorderRadius.all(Radius.circular(widget.buttonRadius)), color: widget.colorButton, ), padding: const EdgeInsets.all(ScrollToTopButtonWidgetStyles.buttonPadding),