From 3ed868c35d33320a56ca17d149c195777f267ce6 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 9 Jun 2023 16:13:33 +0700 Subject: [PATCH] TF-1915 Update state action of sending email item (cherry picked from commit b23e3389432ec4e385da0d08b79f1727405f0503) --- lib/features/base/state/button_state.dart | 14 ++++++ .../local_notification_manager.dart | 2 +- .../list_sending_email_extension.dart | 2 + .../model/sending_email_action_type.dart | 17 ++++--- .../sending_queue_controller.dart | 9 ++-- .../presentation/sending_queue_view.dart | 40 ++++++++------- .../widgets/app_bar_sending_queue_widget.dart | 6 +-- .../bottom_bar_sending_queue_widget.dart | 50 ++++++++++++------- .../widgets/sending_email_tile_widget.dart | 2 +- 9 files changed, 87 insertions(+), 55 deletions(-) create mode 100644 lib/features/base/state/button_state.dart diff --git a/lib/features/base/state/button_state.dart b/lib/features/base/state/button_state.dart new file mode 100644 index 000000000..dabb01f27 --- /dev/null +++ b/lib/features/base/state/button_state.dart @@ -0,0 +1,14 @@ + +enum ButtonState { + enabled, + disabled; + + double get opacity { + switch(this) { + case ButtonState.enabled: + return 1.0; + case ButtonState.disabled: + return 0.4; + } + } +} \ No newline at end of file diff --git a/lib/features/push_notification/presentation/notification/local_notification_manager.dart b/lib/features/push_notification/presentation/notification/local_notification_manager.dart index 0d90031e9..c137a4d88 100644 --- a/lib/features/push_notification/presentation/notification/local_notification_manager.dart +++ b/lib/features/push_notification/presentation/notification/local_notification_manager.dart @@ -156,7 +156,7 @@ class LocalNotificationManager { id.hashCode, title, message, - LocalNotificationConfig.instance.generateNotificationDetails(), + LocalNotificationConfig.instance.generateNotificationDetails(styleInformation: const DefaultStyleInformation(true, true)), payload: payload ); } diff --git a/lib/features/sending_queue/presentation/extensions/list_sending_email_extension.dart b/lib/features/sending_queue/presentation/extensions/list_sending_email_extension.dart index 32643c7e0..74c199ae3 100644 --- a/lib/features/sending_queue/presentation/extensions/list_sending_email_extension.dart +++ b/lib/features/sending_queue/presentation/extensions/list_sending_email_extension.dart @@ -18,4 +18,6 @@ extension ListSendingEmailExtension on List { List listSelected() => where((sendingEmail) => sendingEmail.isSelected).toList(); bool isAllNotReadySendingState() => every((sendingEmail) => !sendingEmail.isReady); + + bool isAllNotDeliveringSendingState() => every((sendingEmail) => !sendingEmail.isDelivering); } \ No newline at end of file diff --git a/lib/features/sending_queue/presentation/model/sending_email_action_type.dart b/lib/features/sending_queue/presentation/model/sending_email_action_type.dart index 13685c7e8..f57181039 100644 --- a/lib/features/sending_queue/presentation/model/sending_email_action_type.dart +++ b/lib/features/sending_queue/presentation/model/sending_email_action_type.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/base/state/button_state.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; enum SendingEmailActionType { @@ -30,25 +31,25 @@ enum SendingEmailActionType { } } - Color getButtonIconColor() { + Color getButtonIconColor(ButtonState buttonState) { switch(this) { case SendingEmailActionType.delete: - return AppColor.colorDeletePermanentlyButton; + return AppColor.colorDeletePermanentlyButton.withOpacity(buttonState.opacity); case SendingEmailActionType.edit: - return AppColor.primaryColor; + return AppColor.primaryColor.withOpacity(buttonState.opacity); case SendingEmailActionType.create: - return Colors.transparent; + return Colors.transparent.withOpacity(buttonState.opacity); } } - Color getButtonTitleColor() { + Color getButtonTitleColor(ButtonState buttonState) { switch(this) { case SendingEmailActionType.delete: - return AppColor.colorDeletePermanentlyButton; + return AppColor.colorDeletePermanentlyButton.withOpacity(buttonState.opacity); case SendingEmailActionType.edit: - return AppColor.primaryColor; + return AppColor.primaryColor.withOpacity(buttonState.opacity); case SendingEmailActionType.create: - return Colors.transparent; + return Colors.transparent.withOpacity(buttonState.opacity); } } } \ No newline at end of file diff --git a/lib/features/sending_queue/presentation/sending_queue_controller.dart b/lib/features/sending_queue/presentation/sending_queue_controller.dart index 69091d41f..0a75e8461 100644 --- a/lib/features/sending_queue/presentation/sending_queue_controller.dart +++ b/lib/features/sending_queue/presentation/sending_queue_controller.dart @@ -38,7 +38,6 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi final _appToast = getBinding(); final listSendingEmailController = ScrollController(); - final listSendingEmailSelected = [].obs; final selectionState = Rx(SelectMode.INACTIVE); @@ -73,8 +72,6 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi selectionState.value = newListSendingEmail.isAllUnSelected() ? SelectMode.INACTIVE : SelectMode.ACTIVE; - - listSendingEmailSelected.value = newListSendingEmail.listSelected(); } void toggleSelectionSendingEmail(SendingEmail sendingEmail) { @@ -84,12 +81,12 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi selectionState.value = newListSendingEmail.isAllUnSelected() ? SelectMode.INACTIVE : SelectMode.ACTIVE; - - listSendingEmailSelected.value = newListSendingEmail.listSelected(); } bool get isAllUnSelected => dashboardController!.listSendingEmails.isAllUnSelected(); + bool get isConnectedNetwork => _networkConnectionController?.isNetworkConnectionAvailable() == true; + void _refreshSendingQueue({bool needToReopen = false}) { dashboardController!.getAllSendingEmails(needToReopen: needToReopen); } @@ -114,7 +111,7 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi _deleteSendingEmailAction(context, listSendingEmails); break; case SendingEmailActionType.edit: - if (_networkConnectionController?.isNetworkConnectionAvailable() == false) { + if (!isConnectedNetwork) { _editSendingEmailAction(listSendingEmails.first); } break; diff --git a/lib/features/sending_queue/presentation/sending_queue_view.dart b/lib/features/sending_queue/presentation/sending_queue_view.dart index 302e31747..f84acd67c 100644 --- a/lib/features/sending_queue/presentation/sending_queue_view.dart +++ b/lib/features/sending_queue/presentation/sending_queue_view.dart @@ -1,6 +1,5 @@ import 'package:core/presentation/extensions/color_extension.dart'; -import 'package:core/utils/app_logger.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart'; @@ -26,7 +25,7 @@ class SendingQueueView extends GetWidget with AppLoaderM children: [ Obx(() { return AppBarSendingQueueWidget( - listSendingEmails: controller.listSendingEmailSelected, + listSendingEmailSelected: controller.dashboardController!.listSendingEmails.listSelected(), onOpenMailboxMenu: controller.openMailboxMenu, onBackAction: controller.disableSelectionMode, selectMode: controller.selectionState.value, @@ -46,7 +45,8 @@ class SendingQueueView extends GetWidget with AppLoaderM return const SizedBox.shrink(); } else { return BottomBarSendingQueueWidget( - listSendingEmails: controller.listSendingEmailSelected, + listSendingEmailSelected: controller.dashboardController!.listSendingEmails.listSelected(), + isConnectedNetwork: controller.isConnectedNetwork, onHandleSendingEmailActionType: (actionType, listSendingEmails) => controller.handleSendingEmailActionType(context, actionType, listSendingEmails), ); } @@ -60,22 +60,24 @@ class SendingQueueView extends GetWidget with AppLoaderM Widget _buildListSendingEmails(BuildContext context) { return Obx(() { - if (controller.dashboardController!.listSendingEmails.isNotEmpty) { - return LayoutBuilder(builder: (context, constraints) { - log('SendingQueueView::_buildListSendingEmails(): MAX_WIDTH: ${constraints.maxWidth}'); - return ListView.builder( - controller: controller.listSendingEmailController, - itemCount: controller.dashboardController!.listSendingEmails.length, - itemBuilder: (context, index) { - return Obx(() => SendingEmailTileWidget( - sendingEmail: controller.dashboardController!.listSendingEmails[index], - selectMode: controller.selectionState.value, - onLongPressAction: controller.handleOnLongPressAction, - onSelectLeadingAction: controller.toggleSelectionSendingEmail, - onTapAction: (actionType, listSendingEmails) => controller.handleSendingEmailActionType(context, actionType, [listSendingEmails]))); - } - ); - }); + final listSendingEmails = controller.dashboardController!.listSendingEmails; + if (listSendingEmails.isNotEmpty) { + return ListView.builder( + controller: controller.listSendingEmailController, + itemCount: listSendingEmails.length, + itemBuilder: (context, index) { + return SendingEmailTileWidget( + sendingEmail: listSendingEmails[index], + selectMode: controller.selectionState.value, + onLongPressAction: controller.handleOnLongPressAction, + onSelectLeadingAction: controller.toggleSelectionSendingEmail, + onTapAction: (actionType, sendingEmail) { + if (!controller.isConnectedNetwork && sendingEmail.isReady) { + controller.handleSendingEmailActionType(context, actionType, [sendingEmail]); + } + }); + } + ); } else { return const SizedBox.shrink(); } diff --git a/lib/features/sending_queue/presentation/widgets/app_bar_sending_queue_widget.dart b/lib/features/sending_queue/presentation/widgets/app_bar_sending_queue_widget.dart index fa4dcbc5c..d78098b00 100644 --- a/lib/features/sending_queue/presentation/widgets/app_bar_sending_queue_widget.dart +++ b/lib/features/sending_queue/presentation/widgets/app_bar_sending_queue_widget.dart @@ -18,11 +18,11 @@ class AppBarSendingQueueWidget extends StatelessWidget { final VoidCallback? onBackAction; final VoidCallback? onOpenMailboxMenu; final SelectMode selectMode; - final List listSendingEmails; + final List listSendingEmailSelected; const AppBarSendingQueueWidget({ super.key, - required this.listSendingEmails, + required this.listSendingEmailSelected, this.onBackAction, this.onOpenMailboxMenu, this.selectMode = SelectMode.INACTIVE @@ -71,7 +71,7 @@ class AppBarSendingQueueWidget extends StatelessWidget { ), const SizedBox(width: 8), Text( - listSendingEmails.length.toString(), + listSendingEmailSelected.length.toString(), maxLines: 1, overflow: CommonTextStyle.defaultTextOverFlow, softWrap: CommonTextStyle.defaultSoftWrap, diff --git a/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart b/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart index c9704977d..d170b62c8 100644 --- a/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart +++ b/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart @@ -4,6 +4,7 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/views/button/button_builder.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/state/button_state.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/extensions/list_sending_email_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart'; @@ -12,13 +13,15 @@ typedef OnHandleSendingEmailActionType = void Function(SendingEmailActionType, L class BottomBarSendingQueueWidget extends StatelessWidget { - final List listSendingEmails; + final List listSendingEmailSelected; final OnHandleSendingEmailActionType? onHandleSendingEmailActionType; + final bool isConnectedNetwork; const BottomBarSendingQueueWidget({ super.key, - required this.listSendingEmails, + required this.listSendingEmailSelected, this.onHandleSendingEmailActionType, + this.isConnectedNetwork = true }); @override @@ -36,27 +39,40 @@ class BottomBarSendingQueueWidget extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - if (!listSendingEmails.isAllSelected() || listSendingEmails.length < 2) - Expanded(child: (ButtonBuilder(imagePaths.icEdit) - ..key(Key(SendingEmailActionType.edit.getButtonKey())) - ..iconColor(SendingEmailActionType.edit.getButtonIconColor()) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.edit.getButtonTitleColor())) - ..onPressActionClick(() => onHandleSendingEmailActionType?.call(SendingEmailActionType.edit, listSendingEmails)) - ..text(SendingEmailActionType.edit.getButtonTitle(context), isVertical: true) - ).build()), - Expanded(child: (ButtonBuilder(imagePaths.icDeleteComposer) - ..key(Key(SendingEmailActionType.delete.getButtonKey())) - ..iconColor(SendingEmailActionType.delete.getButtonIconColor()) + Expanded(child: (ButtonBuilder(imagePaths.icEdit) + ..key(Key(SendingEmailActionType.edit.getButtonKey())) + ..iconColor(SendingEmailActionType.edit.getButtonIconColor(_isEditable ? ButtonState.enabled : ButtonState.disabled)) ..padding(const EdgeInsets.all(8)) ..radiusSplash(8) - ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.delete.getButtonTitleColor())) - ..onPressActionClick(() => onHandleSendingEmailActionType?.call(SendingEmailActionType.delete, listSendingEmails)) + ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.edit.getButtonTitleColor(_isEditable ? ButtonState.enabled : ButtonState.disabled))) + ..onPressActionClick(() { + if (_isEditable) { + onHandleSendingEmailActionType?.call(SendingEmailActionType.edit, listSendingEmailSelected); + } + }) + ..text(SendingEmailActionType.edit.getButtonTitle(context), isVertical: true) + ).build()), + Expanded(child: (ButtonBuilder(imagePaths.icDeleteComposer) + ..key(Key(SendingEmailActionType.delete.getButtonKey())) + ..iconColor(SendingEmailActionType.delete.getButtonIconColor(_isCanBeDeleted ? ButtonState.enabled : ButtonState.disabled)) + ..padding(const EdgeInsets.all(8)) + ..radiusSplash(8) + ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.delete.getButtonTitleColor(_isCanBeDeleted ? ButtonState.enabled : ButtonState.disabled))) + ..onPressActionClick(() { + if (_isCanBeDeleted) { + onHandleSendingEmailActionType?.call(SendingEmailActionType.delete, listSendingEmailSelected); + } + }) ..text(SendingEmailActionType.delete.getButtonTitle(context), isVertical: true) ).build()) ], ), ); } + + bool get _isEditable => !isConnectedNetwork && + listSendingEmailSelected.length == 1 && + listSendingEmailSelected.first.isReady; + + bool get _isCanBeDeleted => listSendingEmailSelected.isAllNotDeliveringSendingState(); } \ No newline at end of file diff --git a/lib/features/sending_queue/presentation/widgets/sending_email_tile_widget.dart b/lib/features/sending_queue/presentation/widgets/sending_email_tile_widget.dart index a79aa165f..75050956f 100644 --- a/lib/features/sending_queue/presentation/widgets/sending_email_tile_widget.dart +++ b/lib/features/sending_queue/presentation/widgets/sending_email_tile_widget.dart @@ -45,7 +45,7 @@ class SendingEmailTileWidget extends StatelessWidget { return Material( color: Colors.transparent, child: InkWell( - onTap: () => onTapAction?.call(SendingEmailActionType.edit ,sendingEmail), + onTap: () => onTapAction?.call(SendingEmailActionType.edit, sendingEmail), onLongPress: () => onLongPressAction?.call(sendingEmail), child: Column( crossAxisAlignment: CrossAxisAlignment.start,