TF-3479 Add OpenAndCloseComposerExtension to handle open & close composer

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-02-12 12:07:07 +07:00
committed by Dat H. Pham
parent fc37b5f647
commit 78d40f7be5
14 changed files with 167 additions and 136 deletions
@@ -0,0 +1,116 @@
import 'package:back_button_interceptor/back_button_interceptor.dart';
import 'package:core/utils/platform_info.dart';
import 'package:dartz/dartz.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart';
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/composer_arguments_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
extension OpenAndCloseComposerExtension on MailboxDashBoardController {
void openComposer(ComposerArguments arguments) {
final argumentsWithIdentity = arguments.withIdentity(
identities: List.from(listIdentities),
selectedIdentityId: arguments.selectedIdentityId,
);
if (PlatformInfo.isWeb) {
_openComposerOnWeb(argumentsWithIdentity);
} else {
_openComposerOnMobile(argumentsWithIdentity);
}
}
void _openComposerOnWeb(ComposerArguments composerArguments) {
composerManager.addComposer(composerArguments);
if (!twakeAppManager.hasComposer) {
twakeAppManager.setHasComposer(true);
}
}
Future<void> _openComposerOnMobile(ComposerArguments arguments) async {
BackButtonInterceptor.removeByName(AppRoutes.dashboard);
bool isTabletPlatform = currentContext != null
&& !responsiveUtils.isScreenWithShortestSide(currentContext!);
dynamic result;
if (isTabletPlatform) {
if (PlatformInfo.isIOS) {
dispatchEmailUIAction(HideEmailContentViewAction());
}
result = await Get.to(
() => const ComposerView(),
binding: ComposerBindings(),
opaque: false,
arguments: arguments,
);
if (PlatformInfo.isIOS) {
await Future.delayed(
const Duration(milliseconds: 200),
() => dispatchEmailUIAction(ShowEmailContentViewAction()),
);
}
} else {
result = await push(AppRoutes.composer, arguments: arguments);
}
BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard);
_handleResultAfterCloseComposer(result);
}
void closeComposer({
dynamic result,
bool closeOverlays = false,
String? composerId,
}) {
if (PlatformInfo.isWeb) {
if (closeOverlays) {
popBack();
}
closeComposerOnWeb(composerId: composerId, result: result);
} else {
popBack(result: result, closeOverlays: closeOverlays);
}
}
Future<void> closeComposerOnWeb({
required String? composerId,
dynamic result,
}) async {
if (composerId != null) {
composerManager.removeComposer(composerId);
}
if (!composerManager.hasComposer) {
twakeAppManager.setHasComposer(false);
}
_handleResultAfterCloseComposer(result);
await removeComposerCacheOnWeb();
}
void _handleResultAfterCloseComposer(dynamic result) {
if (result is SendingEmailArguments) {
handleSendEmailAction(result);
} else if (result is SendEmailSuccess ||
result is SaveEmailAsDraftsSuccess ||
result is UpdateEmailDraftsSuccess) {
consumeState(Stream.value(Right(result)));
} else if (validateSendingEmailFailedWhenNetworkIsLostOnMobile(result)) {
storeSendingEmailInCaseOfSendingFailureInMobile(result);
}
}
}