Files
workavia-mail-front/lib/main/utils/toast_manager.dart
T
2025-06-13 09:39:54 +07:00

234 lines
12 KiB
Dart

import 'dart:io';
import 'package:core/domain/exceptions/file_exception.dart';
import 'package:core/domain/exceptions/web_session_exception.dart';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart';
import 'package:jmap_dart_client/jmap/core/error/method/exception/error_method_response_exception.dart';
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/state/parse_email_by_blob_id_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/preview_email_from_eml_file_state.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_error.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/clear_mailbox_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/add_recipient_in_forwarding_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_recipient_in_forwarding_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_local_copy_in_forwarding_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/export_trace_log_state.dart';
import 'package:tmail_ui_user/features/starting_page/domain/state/sign_in_twake_workplace_state.dart';
import 'package:tmail_ui_user/features/starting_page/domain/state/sign_up_twake_workplace_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
import 'package:tmail_ui_user/main/error/error_method_response_exception_extension.dart';
import 'package:tmail_ui_user/main/exceptions/permission_exception.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class ToastManager {
final AppToast appToast;
ToastManager(this.appToast);
String? getMessageByException(BuildContext context, dynamic exception) {
if (exception is CanNotFoundBaseUrl) {
return AppLocalizations.of(context).requiredUrl;
} else if (exception is CanNotFoundUserName) {
return AppLocalizations.of(context).requiredEmail;
} else if (exception is CanNotFoundPassword) {
return AppLocalizations.of(context).requiredPassword;
} else if (exception is CanNotFoundOIDCLinks) {
return AppLocalizations.of(context).ssoNotAvailable;
} else if (exception is CanNotFindToken) {
return AppLocalizations.of(context).canNotGetToken;
} else if (exception is ConnectionTimeout || exception is BadGateway || exception is SocketError) {
return AppLocalizations.of(context).wrongUrlMessage;
} else if (exception is BadCredentialsException) {
return AppLocalizations.of(context).badCredentials;
} else if (exception is ConnectionError) {
return AppLocalizations.of(context).connectionError;
} else if (exception is UnknownError && exception.message != null) {
return '[${exception.code ?? ''}] ${exception.message}';
} else if (exception is NotFoundSessionException) {
return AppLocalizations.of(context).notFoundSession;
} else if (exception is NoNetworkError) {
return AppLocalizations.of(context).youAreOffline;
} else if (exception is HandshakeException) {
return AppLocalizations.of(context).handshakeException(exception.osError?.message ?? '');
} else {
try {
return AppLocalizations.of(context).unexpectedError(exception.message);
} catch(_) {
return AppLocalizations.of(context).unexpectedError(exception.toString());
}
}
}
void showMessageFailure(FeatureFailure failure) {
if (currentContext == null || currentOverlayContext == null) {
logError('ToastManager::showMessageFailure: Context is null');
return;
}
String? message;
final exception = failure.exception;
if (failure is GetSessionFailure) {
message = getMessageByException(currentContext!, failure.exception)
?? AppLocalizations.of(currentContext!).unknownError;
} else if (failure is EmptySpamFolderFailure ||
(failure is ClearMailboxFailure && failure.mailboxRole == PresentationMailbox.roleSpam)) {
if (exception is SetError) {
message = exception.description?.trim().isNotEmpty == true
? exception.description
: AppLocalizations.of(currentContext!).emptySpamFolderFailed;
} else if (exception is ErrorMethodResponseException) {
message = exception.errorMessage.isNotEmpty
? exception.errorMessage
: AppLocalizations.of(currentContext!).emptySpamFolderFailed;
} else if (exception is MethodLevelErrors) {
message = exception.message != null
? exception.message.toString()
: AppLocalizations.of(currentContext!).emptySpamFolderFailed;
} else {
message = AppLocalizations.of(currentContext!).emptySpamFolderFailed;
}
} else if (failure is EmptyTrashFolderFailure ||
(failure is ClearMailboxFailure && failure.mailboxRole == PresentationMailbox.roleTrash)) {
if (exception is SetError) {
message = exception.description?.trim().isNotEmpty == true
? exception.description
: AppLocalizations.of(currentContext!).emptyTrashFolderFailed;
} else if (exception is MethodLevelErrors) {
message = exception.message != null
? exception.message.toString()
: AppLocalizations.of(currentContext!).emptyTrashFolderFailed;
} else if (exception is ErrorMethodResponseException) {
message = exception.errorMessage.isNotEmpty
? exception.errorMessage
: AppLocalizations.of(currentContext!).emptyTrashFolderFailed;
} else {
message = AppLocalizations.of(currentContext!).emptyTrashFolderFailed;
}
} else if (failure is MoveMultipleEmailToMailboxFailure
&& failure.emailActionType == EmailActionType.moveToSpam
&& failure.moveAction == MoveAction.moving) {
message = AppLocalizations.of(currentContext!).markAsSpamFailed;
} else if (failure is SignInTwakeWorkplaceFailure) {
final exception = failure.exception;
if (exception is PlatformException && exception.message?.isNotEmpty == true) {
message = exception.message;
} else {
message = AppLocalizations.of(currentContext!).sigInSaasFailed;
}
} else if (failure is SignUpTwakeWorkplaceFailure) {
final exception = failure.exception;
if (exception is PlatformException && exception.message?.isNotEmpty == true) {
message = exception.message;
} else {
message = AppLocalizations.of(currentContext!).createTwakeIdFailed;
}
} else if (failure is ParseEmailByBlobIdFailure) {
message = AppLocalizations.of(currentContext!).parseEmailByBlobIdFailed;
} else if (failure is PreviewEmailFromEmlFileFailure) {
if (failure.exception is CannotOpenNewWindowException) {
message = AppLocalizations.of(currentContext!).cannotOpenNewWindow;
} else {
message = AppLocalizations.of(currentContext!).previewEmailFromEMLFileFailed;
}
} else if (failure is ExportTraceLogFailure) {
if (failure.exception is NotGrantedPermissionStorageException) {
message = AppLocalizations.of(currentContext!).youNeedToGrantFilesPermissionToExportFile;
} else if (failure.exception is NotFoundFileInFolderException) {
message = AppLocalizations.of(currentContext!).noLogsHaveBeenRecordedYet;
} else {
message = AppLocalizations.of(currentContext!).exportTraceLogFailed;
}
} else if (failure is AddRecipientsInForwardingFailure) {
final exception = failure.exception;
if (exception is SetMethodException && exception.mapErrors.isNotEmpty) {
final firstError = exception.mapErrors.values.first;
message = '[${firstError.type.value}] ${firstError.description}';
} else if (exception is ErrorMethodResponseException &&
exception.errorResponse is ErrorMethodResponse) {
final errorResponse = exception.errorResponse as ErrorMethodResponse;
message = '[${errorResponse.type.value}] ${errorResponse.description}';
} else if (exception is MethodLevelErrors) {
message = '[${exception.type.value}] ${exception.message}';
} else {
message = AppLocalizations.of(currentContext!).addRecipientsFailed;
}
} else if (failure is EditLocalCopyInForwardingFailure) {
final exception = failure.exception;
if (exception is SetMethodException && exception.mapErrors.isNotEmpty) {
final firstError = exception.mapErrors.values.first;
message = '[${firstError.type.value}] ${firstError.description}';
} else if (exception is ErrorMethodResponseException &&
exception.errorResponse is ErrorMethodResponse) {
final errorResponse = exception.errorResponse as ErrorMethodResponse;
message = '[${errorResponse.type.value}] ${errorResponse.description}';
} else if (exception is MethodLevelErrors) {
message = '[${exception.type.value}] ${exception.message}';
} else {
message = AppLocalizations.of(currentContext!).editLocalCopyInForwardFailed;
}
} else if (failure is DeleteRecipientInForwardingFailure) {
final exception = failure.exception;
if (exception is SetMethodException && exception.mapErrors.isNotEmpty) {
final firstError = exception.mapErrors.values.first;
message = '[${firstError.type.value}] ${firstError.description}';
} else if (exception is ErrorMethodResponseException &&
exception.errorResponse is ErrorMethodResponse) {
final errorResponse = exception.errorResponse as ErrorMethodResponse;
message = '[${errorResponse.type.value}] ${errorResponse.description}';
} else if (exception is MethodLevelErrors) {
message = '[${exception.type.value}] ${exception.message}';
} else {
message = AppLocalizations.of(currentContext!).deleteRecipientsFailed;
}
} else if (failure is CreateNewRuleFilterFailure) {
message = AppLocalizations.of(currentContext!).createFilterRuleFailed;
}
if (message?.isNotEmpty == true) {
appToast.showToastErrorMessage(currentOverlayContext!, message!);
}
}
void showMessageSuccess(Success success) {
if (currentContext == null || currentOverlayContext == null) {
logError('ToastManager::showMessageSuccess: Context is null');
return;
}
String? message;
if (success is ClearMailboxSuccess ||
success is EmptySpamFolderSuccess ||
success is EmptyTrashFolderSuccess) {
message = AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success;
} else if (success is ExportTraceLogSuccess) {
message = AppLocalizations.of(currentContext!).exportTraceLogSuccess(success.savePath);
} else if (success is CreateNewRuleFilterSuccess) {
message = AppLocalizations.of(currentContext!).newFilterWasCreated;
}
if (message?.isNotEmpty == true) {
appToast.showToastSuccessMessage(currentOverlayContext!, message!);
}
}
}