TF-2667 Add cancel button in progress send message dialog
This commit is contained in:
@@ -7,6 +7,7 @@ import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:desktop_drop/desktop_drop.dart';
|
||||
import 'package:device_info_plus/device_info_plus.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:dropdown_button2/dropdown_button2.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:filesize/filesize.dart';
|
||||
@@ -29,6 +30,7 @@ import 'package:super_tag_editor/tag_editor.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/base/state/base_ui_state.dart';
|
||||
import 'package:tmail_ui_user/features/base/state/button_state.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/exceptions/compose_email_exception.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/state/download_image_as_base64_state.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/state/generate_email_state.dart';
|
||||
@@ -802,12 +804,17 @@ class ComposerController extends BaseController with DragDropFileMixin {
|
||||
}
|
||||
|
||||
final emailContent = await _getContentInEditor();
|
||||
|
||||
final resultState = await _showSendingMessageDialog(emailContent: emailContent);
|
||||
|
||||
final cancelToken = CancelToken();
|
||||
final resultState = await _showSendingMessageDialog(
|
||||
emailContent: emailContent,
|
||||
cancelToken: cancelToken
|
||||
);
|
||||
log('ComposerController::_handleSendMessages: resultState = $resultState');
|
||||
if (resultState is SendEmailSuccess) {
|
||||
_sendButtonState = ButtonState.enabled;
|
||||
_closeComposerAction(result: resultState);
|
||||
} else if (resultState is SendEmailFailure && resultState.exception is SendingEmailCanceledException) {
|
||||
_sendButtonState = ButtonState.enabled;
|
||||
} else if ((resultState is SendEmailFailure || resultState is GenerateEmailFailure) && context.mounted) {
|
||||
_showConfirmDialogWhenSendMessageFailure(
|
||||
context: context,
|
||||
@@ -818,7 +825,10 @@ class ComposerController extends BaseController with DragDropFileMixin {
|
||||
}
|
||||
}
|
||||
|
||||
Future<dynamic> _showSendingMessageDialog({required String emailContent}) {
|
||||
Future<dynamic> _showSendingMessageDialog({
|
||||
required String emailContent,
|
||||
CancelToken? cancelToken
|
||||
}) {
|
||||
return Get.dialog(
|
||||
PointerInterceptor(
|
||||
child: SendingMessageDialogView(
|
||||
@@ -847,13 +857,19 @@ class ComposerController extends BaseController with DragDropFileMixin {
|
||||
references: composerArguments.value!.references,
|
||||
emailSendingQueue: composerArguments.value!.sendingEmail
|
||||
),
|
||||
createNewAndSendEmailInteractor: _createNewAndSendEmailInteractor
|
||||
createNewAndSendEmailInteractor: _createNewAndSendEmailInteractor,
|
||||
onCancelSendingEmailAction: _handleCancelSendingMessage,
|
||||
cancelToken: cancelToken,
|
||||
),
|
||||
),
|
||||
barrierColor: AppColor.colorDefaultCupertinoActionSheet,
|
||||
);
|
||||
}
|
||||
|
||||
void _handleCancelSendingMessage({CancelToken? cancelToken}) {
|
||||
cancelToken?.cancel([SendingEmailCanceledException()]);
|
||||
}
|
||||
|
||||
void _showConfirmDialogWhenSendMessageFailure({
|
||||
required BuildContext context,
|
||||
required FeatureFailure failure
|
||||
|
||||
@@ -5,26 +5,36 @@ import 'package:core/presentation/extensions/capitalize_extension.dart';
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:core/presentation/views/button/tmail_button_widget.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:dartz/dartz.dart' as dartz;
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/exceptions/compose_email_exception.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/state/generate_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/composer/presentation/model/create_email_request.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';
|
||||
|
||||
typedef OnCancelSendingEmailAction = Function({CancelToken? cancelToken});
|
||||
|
||||
class SendingMessageDialogView extends StatefulWidget {
|
||||
|
||||
final CreateEmailRequest createEmailRequest;
|
||||
final CreateNewAndSendEmailInteractor createNewAndSendEmailInteractor;
|
||||
final OnCancelSendingEmailAction? onCancelSendingEmailAction;
|
||||
final CancelToken? cancelToken;
|
||||
|
||||
const SendingMessageDialogView({
|
||||
super.key,
|
||||
required this.createEmailRequest,
|
||||
required this.createNewAndSendEmailInteractor,
|
||||
this.onCancelSendingEmailAction,
|
||||
this.cancelToken,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -40,7 +50,10 @@ class _SendingMessageDialogViewState extends State<SendingMessageDialogView> {
|
||||
void initState() {
|
||||
super.initState();
|
||||
_streamSubscription = widget.createNewAndSendEmailInteractor
|
||||
.execute(widget.createEmailRequest)
|
||||
.execute(
|
||||
createEmailRequest: widget.createEmailRequest,
|
||||
cancelToken: widget.cancelToken
|
||||
)
|
||||
.listen(
|
||||
_handleDataStream,
|
||||
onError: _handleErrorStream
|
||||
@@ -66,7 +79,11 @@ class _SendingMessageDialogViewState extends State<SendingMessageDialogView> {
|
||||
|
||||
void _handleErrorStream(Object error, StackTrace stackTrace) {
|
||||
logError('_SendingMessageDialogViewState::_handleErrorStream: Exception = $error');
|
||||
popBack(result: SendEmailFailure(exception: error));
|
||||
if (error is UnknownError && error.message is List<SendingEmailCanceledException>) {
|
||||
popBack(result: SendEmailFailure(exception: SendingEmailCanceledException()));
|
||||
} else {
|
||||
popBack(result: SendEmailFailure(exception: error));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -142,6 +159,14 @@ class _SendingMessageDialogViewState extends State<SendingMessageDialogView> {
|
||||
fontSize: 14
|
||||
),
|
||||
);
|
||||
} else if (success is CancelSendingEmail) {
|
||||
return Text(
|
||||
'${AppLocalizations.of(context).canceling}...',
|
||||
style: Theme.of(context).textTheme.labelSmall?.copyWith(
|
||||
color: AppColor.labelColor,
|
||||
fontSize: 14
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return Text(
|
||||
'${AppLocalizations.of(context).sendingMessage}...',
|
||||
@@ -167,7 +192,7 @@ class _SendingMessageDialogViewState extends State<SendingMessageDialogView> {
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsetsDirectional.only(start: 16, end: 16, top: 4, bottom: 24),
|
||||
padding: const EdgeInsetsDirectional.only(start: 16, end: 16, top: 4, bottom: 16),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
@@ -188,7 +213,24 @@ class _SendingMessageDialogViewState extends State<SendingMessageDialogView> {
|
||||
)
|
||||
],
|
||||
),
|
||||
)
|
||||
),
|
||||
if (widget.onCancelSendingEmailAction != null)
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerEnd,
|
||||
child: TMailButtonWidget.fromText(
|
||||
text: AppLocalizations.of(context).cancel,
|
||||
textStyle: Theme.of(context).textTheme.labelSmall?.copyWith(
|
||||
color: Colors.black87,
|
||||
fontSize: 15
|
||||
),
|
||||
padding: const EdgeInsetsDirectional.symmetric(horizontal: 20, vertical: 8),
|
||||
margin: const EdgeInsetsDirectional.only(start: 12, end: 12, bottom: 16),
|
||||
onTapActionCallback: () {
|
||||
_viewStateNotifier.value = dartz.Right<Failure, Success>(CancelSendingEmail());
|
||||
widget.onCancelSendingEmailAction!(cancelToken: widget.cancelToken);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user