diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index b81584db0..df62bc5d4 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -6,6 +6,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:model/email/prefix_email_address.dart'; +import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/prefix_recipient_state.dart'; @@ -18,6 +19,7 @@ import 'package:tmail_ui_user/features/composer/presentation/widgets/insert_imag import 'package:tmail_ui_user/features/composer/presentation/widgets/web/desktop_app_bar_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/attachment_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/bottom_bar_composer_widget.dart'; +import 'package:tmail_ui_user/features/composer/presentation/widgets/web/drop_zone_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart'; @@ -336,29 +338,42 @@ class ComposerView extends GetWidget { Expanded( child: Padding( padding: ComposerStyle.desktopEditorPadding, - child: Obx(() => WebEditorView( - editorController: controller.richTextWebController.editorController, - arguments: controller.composerArguments.value, - contentViewState: controller.emailContentsViewState.value, - currentWebContent: controller.textEditorWeb, - onInitial: controller.handleInitHtmlEditorWeb, - onChangeContent: controller.onChangeTextEditorWeb, - onFocus: controller.handleOnFocusHtmlEditorWeb, - onUnFocus: controller.handleOnUnFocusHtmlEditorWeb, - onMouseDown: controller.handleOnMouseDownHtmlEditorWeb, - onEditorSettings: controller.richTextWebController.onEditorSettingsChange, - onImageUploadSuccessAction: (fileUpload) => controller.handleImageUploadSuccess(context, fileUpload), - onImageUploadFailureAction: (fileUpload, base64Str, uploadError) { - return controller.handleImageUploadFailure( - context: context, - uploadError: uploadError, - fileUpload: fileUpload, - base64Str: base64Str, - ); - }, - width: constraints.maxWidth, - height: constraints.maxHeight, - )), + child: Obx(() { + return Stack( + children: [ + WebEditorView( + editorController: controller.richTextWebController.editorController, + arguments: controller.composerArguments.value, + contentViewState: controller.emailContentsViewState.value, + currentWebContent: controller.textEditorWeb, + onInitial: controller.handleInitHtmlEditorWeb, + onChangeContent: controller.onChangeTextEditorWeb, + onFocus: controller.handleOnFocusHtmlEditorWeb, + onUnFocus: controller.handleOnUnFocusHtmlEditorWeb, + onMouseDown: controller.handleOnMouseDownHtmlEditorWeb, + onEditorSettings: controller.richTextWebController.onEditorSettingsChange, + onImageUploadSuccessAction: (fileUpload) => controller.handleImageUploadSuccess(context, fileUpload), + onImageUploadFailureAction: (fileUpload, base64Str, uploadError) { + return controller.handleImageUploadFailure( + context: context, + uploadError: uploadError, + fileUpload: fileUpload, + base64Str: base64Str, + ); + }, + width: constraints.maxWidth, + height: constraints.maxHeight, + ), + if (controller.mailboxDashBoardController.isDraggableAppActive) + PointerInterceptor( + child: DropZoneWidget( + width: constraints.maxWidth, + height: constraints.maxHeight, + ) + ) + ], + ); + }), ), ), Obx(() { diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 393f91bc1..5c3dea131 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -278,7 +278,15 @@ class EmailView extends GetWidget { if (attachments.isNotEmpty) { return EmailAttachmentsWidget( attachments: attachments, - onDownloadAttachmentActionCallback: (context, attachment) { + onDragStarted: () { + log('EmailView::_buildEmailMessage:onDragStarted:'); + controller.mailboxDashBoardController.enableDraggableApp(); + }, + onDragEnd: (details) { + log('EmailView::_buildEmailMessage:onDragEnd:'); + controller.mailboxDashBoardController.disableDraggableApp(); + }, + downloadAttachmentAction: (attachment) { if (PlatformInfo.isWeb) { controller.downloadAttachmentForWeb(context, attachment); } else { diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 133c9a94c..ecfc30faf 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -72,6 +72,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/refresh_action_view_event.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; @@ -194,6 +195,7 @@ class MailboxDashBoardController extends ReloadableController { final searchMailboxActivated = RxBool(false); final listSendingEmails = RxList(); final refreshingMailboxState = Rx>(Right(UIState.idle)); + final draggableAppState = Rxn(); Session? sessionCurrent; Map mapDefaultMailboxIdByRole = {}; @@ -2104,6 +2106,16 @@ class MailboxDashBoardController extends ReloadableController { openMailboxAction(inboxPresentation); } + + bool get isDraggableAppActive => draggableAppState.value == DraggableAppState.active; + + void enableDraggableApp() { + draggableAppState.value = DraggableAppState.active; + } + + void disableDraggableApp() { + draggableAppState.value = DraggableAppState.inActive; + } @override void onClose() { diff --git a/lib/features/mailbox_dashboard/presentation/model/draggable_app_state.dart b/lib/features/mailbox_dashboard/presentation/model/draggable_app_state.dart new file mode 100644 index 000000000..adab8f3de --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/model/draggable_app_state.dart @@ -0,0 +1,5 @@ + +enum DraggableAppState { + active, + inActive +} \ No newline at end of file