TF-4233 Fix the response success check to use key presence instead of value nullness.

This commit is contained in:
dab246
2026-01-23 12:06:55 +07:00
committed by Dat H. Pham
parent 6551750bd2
commit 69c3d32e3c
10 changed files with 49 additions and 29 deletions
@@ -5,6 +5,8 @@ import 'package:flutter/material.dart';
class ModalListActionButtonWidget extends StatelessWidget {
final String positiveLabel;
final String negativeLabel;
final Key? positiveKey;
final Key? negativeKey;
final VoidCallback onNegativeAction;
final VoidCallback onPositiveAction;
final EdgeInsetsGeometry? padding;
@@ -18,6 +20,8 @@ class ModalListActionButtonWidget extends StatelessWidget {
required this.onNegativeAction,
this.isPositiveActionEnabled = true,
this.padding,
this.positiveKey,
this.negativeKey,
});
@override
@@ -26,6 +30,7 @@ class ModalListActionButtonWidget extends StatelessWidget {
constraints: const BoxConstraints(minWidth: 67),
height: 48,
child: ConfirmDialogButton(
key: negativeKey,
label: negativeLabel,
onTapAction: onNegativeAction,
),
@@ -35,6 +40,7 @@ class ModalListActionButtonWidget extends StatelessWidget {
constraints: const BoxConstraints(minWidth: 153),
height: 48,
child: ConfirmDialogButton(
key: positiveKey,
label: positiveLabel,
backgroundColor: isPositiveActionEnabled
? AppColor.primaryMain
@@ -1,8 +1,8 @@
import 'package:core/presentation/views/text/text_field_builder.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/base/widget/label_input_field_builder.dart';
import 'package:tmail_ui_user/features/labels/presentation/models/label_action_type.dart';
import 'package:tmail_ui_user/features/labels/presentation/widgets/create_new_label_modal.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import '../../base/core_robot.dart';
@@ -16,7 +16,11 @@ class CreateLabelModalRobot extends CoreRobot {
.enterText(name);
}
Future<void> tapSaveButton() async {
await $(CreateNewLabelModal).$(AppLocalizations().save).tap();
Future<void> tapPositiveActionButton(LabelActionType actionType) async {
if (actionType == LabelActionType.create) {
await $(CreateNewLabelModal).$(#create_label_button_action).tap();
} else {
await $(CreateNewLabelModal).$(#save_label_button_action).tap();
}
}
}
@@ -1,5 +1,6 @@
import 'package:core/utils/platform_info.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tmail_ui_user/features/labels/presentation/models/label_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import '../../base/base_test_scenario.dart';
@@ -40,7 +41,7 @@ class EditATagScenario extends BaseTestScenario
const newLabelName = 'New edit tag 1';
await createLabelModalRobot.enterNewLabelName(newLabelName);
await createLabelModalRobot.tapSaveButton();
await createLabelModalRobot.tapPositiveActionButton(LabelActionType.edit);
await _expectLabelWithNewNameUpdated(newLabelName);
}
@@ -47,10 +47,11 @@ class LabelApi with HandleSetErrorMixin {
SetLabelResponse.deserialize,
);
final labelCreated = response?.created?[generateCreateId];
final labelIdsCreated = response?.created?.keys ?? <Id>[];
if (labelCreated != null) {
final newLabelCreated = labelCreated.copyWith(
if (labelIdsCreated.contains(generateCreateId)) {
final labelCreated = response?.created?[generateCreateId];
final newLabelCreated = labelCreated!.copyWith(
displayName: labelData.displayName,
color: labelData.color,
);
@@ -83,9 +84,9 @@ class LabelApi with HandleSetErrorMixin {
SetLabelResponse.deserialize,
);
final labelUpdated = response?.updated?[labelId];
final labelIdsUpdated = response?.updated?.keys ?? <Id>[];
if (labelUpdated != null) {
if (labelIdsUpdated.contains(labelId)) {
final newLabelUpdated = newLabel.copyWith(
id: labelId,
keyword: labelRequest.labelKeyword,
@@ -48,7 +48,7 @@ extension HandleLabelActionTypeExtension on LabelController {
labels: labels,
selectedLabel: label,
actionType: LabelActionType.edit,
onCreateNewLabelCallback: (newLabel) =>
onLabelActionCallback: (newLabel) =>
editLabel(
accountId: accountId,
selectedLabel: label,
@@ -89,7 +89,7 @@ class LabelController extends BaseController with LabelContextMenuMixin {
await DialogRouter().openDialogModal(
child: CreateNewLabelModal(
labels: labels,
onCreateNewLabelCallback: (label) => _createNewLabel(accountId, label),
onLabelActionCallback: (label) => _createNewLabel(accountId, label),
),
dialogLabel: 'create-new-label-modal',
);
@@ -12,6 +12,8 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
mixin LabelContextMenuMixin on PopupContextMenuActionMixin {
static const _labelActions = [LabelActionType.edit];
Future<void> _openLabelPopupMenuAction(
BuildContext context,
ImagePaths imagePaths,
@@ -19,9 +21,7 @@ mixin LabelContextMenuMixin on PopupContextMenuActionMixin {
RelativeRect position,
OnLabelActionTypeCallback onLabelActionTypeCallback,
) async {
final listLabelAction = [LabelActionType.edit];
final popupMenuItems = listLabelAction
final popupMenuItems = _labelActions
.map((actionType) => _buildLabelPopupMenuItem(
label,
actionType,
@@ -89,9 +89,7 @@ mixin LabelContextMenuMixin on PopupContextMenuActionMixin {
Label label,
OnLabelActionTypeCallback onLabelActionTypeCallback,
) async {
final listLabelAction = [LabelActionType.edit];
final contextMenuActions = listLabelAction
final contextMenuActions = _labelActions
.map((actionType) => _buildLabelContextMenuItem(
actionType,
AppLocalizations.of(context),
@@ -43,6 +43,15 @@ enum LabelActionType {
}
}
Key getModalPositiveActionKey() {
switch (this) {
case LabelActionType.create:
return const Key('create_label_button_action');
case LabelActionType.edit:
return const Key('save_label_button_action');
}
}
String getContextMenuIcon(ImagePaths imagePaths) {
switch (this) {
case LabelActionType.create:
@@ -25,18 +25,18 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/v
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
typedef OnCreateNewLabelCallback = Function(Label label);
typedef OnLabelActionCallback = Function(Label label);
class CreateNewLabelModal extends StatefulWidget {
final List<Label> labels;
final LabelActionType actionType;
final OnCreateNewLabelCallback onCreateNewLabelCallback;
final OnLabelActionCallback onLabelActionCallback;
final Label? selectedLabel;
const CreateNewLabelModal({
super.key,
required this.labels,
required this.onCreateNewLabelCallback,
required this.onLabelActionCallback,
this.actionType = LabelActionType.create,
this.selectedLabel,
});
@@ -182,6 +182,7 @@ class _CreateNewLabelModalState extends State<CreateNewLabelModal> {
isPositiveActionEnabled: value,
onPositiveAction: _onCreateNewLabel,
onNegativeAction: _onCloseModal,
positiveKey: widget.actionType.getModalPositiveActionKey(),
);
},
),
@@ -338,7 +339,7 @@ class _CreateNewLabelModalState extends State<CreateNewLabelModal> {
? HexColor(_selectedColor!.toHexTriplet())
: null,
);
widget.onCreateNewLabelCallback(newLabel);
widget.onLabelActionCallback(newLabel);
popBack();
}
@@ -16,19 +16,19 @@ extension HandleLabelActionTypeExtension on MailboxDashBoardController {
if (PlatformInfo.isWeb) {
isPopupMenuOpened.value = true;
}
return labelController
.openLabelMenuAction(
try {
await labelController.openLabelMenuAction(
context,
imagePaths,
label,
position: position,
_onPerformLabelActionType,
)
.whenComplete(() {
);
} finally {
if (PlatformInfo.isWeb) {
isPopupMenuOpened.value = false;
}
});
}
}
void _onPerformLabelActionType(Label label, LabelActionType actionType) {