TF-2116 Create MobileEditor view

(cherry picked from commit c78992dbeb0c7261821fbc607308af2bb4dcc779)
This commit is contained in:
dab246
2023-09-07 09:46:14 +07:00
committed by Dat H. Pham
parent 6bd922dcad
commit f7772e0ba7
2 changed files with 154 additions and 0 deletions
@@ -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<Failure, Success>? 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
);
}
}
}
@@ -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)
);
}
}