diff --git a/lib/features/composer/presentation/view/mobile/mobile_editor_view.dart b/lib/features/composer/presentation/view/mobile/mobile_editor_view.dart new file mode 100644 index 000000000..cd340e8c8 --- /dev/null +++ b/lib/features/composer/presentation/view/mobile/mobile_editor_view.dart @@ -0,0 +1,122 @@ +import 'package:core/presentation/extensions/html_extension.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:flutter/material.dart'; +import 'package:model/email/email_action_type.dart'; +import 'package:tmail_ui_user/features/base/widget/cupertino_loading_widget.dart'; +import 'package:tmail_ui_user/features/composer/presentation/view/editor_view_mixin.dart'; +import 'package:tmail_ui_user/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart'; +import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/transform_html_email_content_state.dart'; +import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; + +class MobileEditorView extends StatelessWidget with EditorViewMixin { + + final ComposerArguments? arguments; + final Either? contentViewState; + final OnCreatedEditorAction onCreatedEditorAction; + + const MobileEditorView({ + super.key, + required this.onCreatedEditorAction, + this.arguments, + this.contentViewState, + }); + + @override + Widget build(BuildContext context) { + if (arguments == null) { + return const SizedBox.shrink(); + } + + switch (arguments!.emailActionType) { + case EmailActionType.compose: + case EmailActionType.composeFromEmailAddress: + case EmailActionType.composeFromFileShared: + return MobileEditorWidget( + content: HtmlExtension.editorStartTags, + direction: AppUtils.getCurrentDirection(context), + onCreatedEditorAction: onCreatedEditorAction + ); + case EmailActionType.editDraft: + case EmailActionType.editSendingEmail: + case EmailActionType.composeFromContentShared: + case EmailActionType.reopenComposerBrowser: + if (contentViewState == null) { + return const SizedBox.shrink(); + } + return contentViewState!.fold( + (failure) => MobileEditorWidget( + content: HtmlExtension.editorStartTags, + direction: AppUtils.getCurrentDirection(context), + onCreatedEditorAction: onCreatedEditorAction + ), + (success) { + if (success is GetEmailContentLoading) { + return const CupertinoLoadingWidget(padding: EdgeInsets.all(16.0)); + } else { + var newContent = success is GetEmailContentSuccess + ? success.htmlEmailContent + : HtmlExtension.editorStartTags; + if (newContent.isEmpty) { + newContent = HtmlExtension.editorStartTags; + } + return MobileEditorWidget( + content: newContent, + direction: AppUtils.getCurrentDirection(context), + onCreatedEditorAction: onCreatedEditorAction + ); + } + } + ); + case EmailActionType.reply: + case EmailActionType.replyAll: + case EmailActionType.forward: + if (contentViewState == null) { + return const SizedBox.shrink(); + } + return contentViewState!.fold( + (failure) { + final emailContentQuoted = getEmailContentQuotedAsHtml( + context: context, + emailContent: '', + emailActionType: arguments!.emailActionType, + presentationEmail: arguments!.presentationEmail! + ); + return MobileEditorWidget( + content: emailContentQuoted, + direction: AppUtils.getCurrentDirection(context), + onCreatedEditorAction: onCreatedEditorAction + ); + }, + (success) { + if (success is TransformHtmlEmailContentLoading) { + return const CupertinoLoadingWidget(padding: EdgeInsets.all(16.0)); + } else { + final emailContentQuoted = getEmailContentQuotedAsHtml( + context: context, + emailContent: success is TransformHtmlEmailContentSuccess + ? success.htmlContent + : '', + emailActionType: arguments!.emailActionType, + presentationEmail: arguments!.presentationEmail! + ); + return MobileEditorWidget( + content: emailContentQuoted, + direction: AppUtils.getCurrentDirection(context), + onCreatedEditorAction: onCreatedEditorAction + ); + } + } + ); + default: + return MobileEditorWidget( + content: HtmlExtension.editorStartTags, + direction: AppUtils.getCurrentDirection(context), + onCreatedEditorAction: onCreatedEditorAction + ); + } + } +} \ No newline at end of file diff --git a/lib/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart b/lib/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart new file mode 100644 index 000000000..7d0c589fb --- /dev/null +++ b/lib/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart @@ -0,0 +1,32 @@ + +import 'package:core/presentation/utils/html_transformer/html_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:rich_text_composer/rich_text_composer.dart'; + +typedef OnCreatedEditorAction = Function(BuildContext context, HtmlEditorApi editorApi, String content); + +class MobileEditorWidget extends StatelessWidget { + + final String content; + final TextDirection direction; + final OnCreatedEditorAction onCreatedEditorAction; + + const MobileEditorWidget({ + super.key, + required this.content, + required this.direction, + required this.onCreatedEditorAction, + }); + + @override + Widget build(BuildContext context) { + return HtmlEditor( + key: const Key('mobile_editor'), + minHeight: 550, + addDefaultSelectionMenuItems: false, + initialContent: content, + customStyleCss: HtmlUtils.customCssStyleHtmlEditor(direction: direction), + onCreated: (editorApi) => onCreatedEditorAction.call(context, editorApi, content) + ); + } +}