Files
workavia-mail-front/lib/features/labels/presentation/mixin/label_modal_mixin.dart
T
dab246 660c4f40e2 TF-4301 Address code review comments on label feature
- Make LabelModalMixin interactor getters non-nullable; remove force-unwraps at call sites
- Show positiveLabel and add semanticLabel in progressing button for accessibility
- Use timestamp-based label name in E2E scenario to prevent flakiness on reused accounts
- Guard labelAs action with isLabelAvailable check in SingleEmailController
- Don't pop back on label creation failure so users can retry without losing context
- Block modal dismissal while label creation request is in flight
- Null-guard email.id before toggling label in ThreadView::onCreateANewLabelAction
- Log stackTrace and rethrow in DialogRouter to distinguish errors from user cancel
2026-04-17 11:58:53 +07:00

57 lines
2.1 KiB
Dart

import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:labels/model/label.dart';
import 'package:tmail_ui_user/features/labels/domain/usecases/create_new_label_interactor.dart';
import 'package:tmail_ui_user/features/labels/domain/usecases/edit_label_interactor.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/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
mixin LabelModalMixin {
List<Label> get labels;
ImagePaths get imagePaths;
CreateNewLabelInteractor get createNewLabelInteractor;
EditLabelInteractor get editLabelInteractor;
Future<dynamic> openCreateNewLabelModal({
required AccountId accountId,
required VerifyNameInteractor verifyNameInteractor,
}) async {
return DialogRouter().openDialogModal(
child: CreateNewLabelModal(
key: const Key('create_new_label_modal'),
labels: labels,
accountId: accountId,
imagePaths: imagePaths,
verifyNameInteractor: verifyNameInteractor,
createNewLabelInteractor: createNewLabelInteractor,
editLabelInteractor: editLabelInteractor,
),
dialogLabel: 'create-new-label-modal',
);
}
Future<dynamic> openEditLabelModal({
required Label selectedLabel,
required AccountId accountId,
required VerifyNameInteractor verifyNameInteractor,
}) async {
return DialogRouter().openDialogModal(
child: CreateNewLabelModal(
key: const Key('edit_label_modal'),
labels: labels,
accountId: accountId,
imagePaths: imagePaths,
selectedLabel: selectedLabel,
actionType: LabelActionType.edit,
verifyNameInteractor: verifyNameInteractor,
createNewLabelInteractor: createNewLabelInteractor,
editLabelInteractor: editLabelInteractor,
),
dialogLabel: 'edit-label-modal',
);
}
}