TF-1915 Update state action of sending email item

(cherry picked from commit b23e3389432ec4e385da0d08b79f1727405f0503)
This commit is contained in:
dab246
2023-06-09 16:13:33 +07:00
committed by Dat Vu
parent 6aa87ff012
commit 3ed868c35d
9 changed files with 87 additions and 55 deletions
+14
View File
@@ -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;
}
}
}
@@ -156,7 +156,7 @@ class LocalNotificationManager {
id.hashCode,
title,
message,
LocalNotificationConfig.instance.generateNotificationDetails(),
LocalNotificationConfig.instance.generateNotificationDetails(styleInformation: const DefaultStyleInformation(true, true)),
payload: payload
);
}
@@ -18,4 +18,6 @@ extension ListSendingEmailExtension on List<SendingEmail> {
List<SendingEmail> listSelected() => where((sendingEmail) => sendingEmail.isSelected).toList();
bool isAllNotReadySendingState() => every((sendingEmail) => !sendingEmail.isReady);
bool isAllNotDeliveringSendingState() => every((sendingEmail) => !sendingEmail.isDelivering);
}
@@ -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);
}
}
}
@@ -38,7 +38,6 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
final _appToast = getBinding<AppToast>();
final listSendingEmailController = ScrollController();
final listSendingEmailSelected = <SendingEmail>[].obs;
final selectionState = Rx<SelectMode>(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;
@@ -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<SendingQueueController> 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<SendingQueueController> 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<SendingQueueController> 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();
}
@@ -18,11 +18,11 @@ class AppBarSendingQueueWidget extends StatelessWidget {
final VoidCallback? onBackAction;
final VoidCallback? onOpenMailboxMenu;
final SelectMode selectMode;
final List<SendingEmail> listSendingEmails;
final List<SendingEmail> 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,
@@ -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<SendingEmail> listSendingEmails;
final List<SendingEmail> 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();
}
@@ -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,