TF-2948 Apply new identity view for web
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -1,5 +1,3 @@
|
|||||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9445 9.50154C10.3931 9.53217 9.9709 10.004 10.0015 10.5555L10.5015 19.5555C10.5322 20.1069 11.004 20.5291 11.5555 20.4985C12.1069 20.4678 12.5291 19.996 12.4985 19.4445L11.9985 10.4445C11.9678 9.8931 11.496 9.4709 10.9445 9.50154Z" fill="#B8C1CC"/>
|
<path d="M7.58333 18H13.4167C14.5673 18 15.5 17.0673 15.5 15.9167V6.33333H5.5V15.9167C5.5 17.0673 6.43274 18 7.58333 18ZM4.875 5.5C4.75994 5.5 4.66667 5.40673 4.66667 5.29167V4.66667C4.66667 4.20643 5.03976 3.83333 5.5 3.83333L7.80634 3.83327C8.09452 3.33514 8.63312 3 9.25 3H11.75C12.3669 3 12.9055 3.33514 13.1937 3.83327L15.5 3.83333C15.9602 3.83333 16.3333 4.20643 16.3333 4.66667V5.29167C16.3333 5.40673 16.2401 5.5 16.125 5.5H4.875Z" fill="#007AFF"/>
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.0555 9.50154C17.6069 9.53217 18.0291 10.004 17.9985 10.5555L17.4985 19.5555C17.4678 20.1069 16.996 20.5291 16.4445 20.4985C15.8931 20.4678 15.4709 19.996 15.5015 19.4445L16.0015 10.4445C16.0322 9.8931 16.504 9.4709 17.0555 9.50154Z" fill="#B8C1CC"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.5 5C2.94772 5 2.5 5.44772 2.5 6C2.5 6.55228 2.94772 7 3.5 7H4.59608L5.89361 19.8226C5.96744 20.5523 6.02861 21.157 6.11753 21.6489C6.21021 22.1618 6.345 22.629 6.60612 23.0628C7.01335 23.7394 7.61173 24.2803 8.32586 24.6173C8.78375 24.8334 9.2622 24.9205 9.78174 24.9611C10.2802 25 10.8879 25 11.6214 25H16.3786C17.1121 25 17.7198 25 18.2183 24.9611C18.7378 24.9205 19.2163 24.8334 19.6741 24.6173C20.3883 24.2803 20.9866 23.7394 21.3939 23.0628C21.655 22.629 21.7898 22.1618 21.8825 21.6489C21.9714 21.157 22.0326 20.5523 22.1064 19.8226L23.4039 7H24.5C25.0523 7 25.5 6.55228 25.5 6C25.5 5.44772 25.0523 5 24.5 5H18.3885C17.9338 2.99601 16.1416 1.5 14 1.5C11.8584 1.5 10.0662 2.99601 9.61151 5H3.5ZM7.87953 19.5826C7.95827 20.3607 8.01227 20.8873 8.08564 21.2932C8.15682 21.687 8.234 21.8891 8.31965 22.0314C8.52327 22.3697 8.82246 22.6401 9.17952 22.8087C9.32971 22.8796 9.53854 22.936 9.9375 22.9672C10.3488 22.9993 10.8781 23 11.6602 23H16.3398C17.1219 23 17.6512 22.9993 18.0625 22.9672C18.4615 22.936 18.6703 22.8796 18.8205 22.8087C19.1775 22.6401 19.4767 22.3697 19.6804 22.0314C19.766 21.8891 19.8432 21.687 19.9144 21.2932C19.9877 20.8873 20.0417 20.3607 20.1205 19.5826L21.3937 7H6.6063L7.87953 19.5826ZM14 3.5C12.9748 3.5 12.0938 4.11705 11.708 5H16.292C15.9062 4.11705 15.0252 3.5 14 3.5Z" fill="#B8C1CC"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 560 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M9 0.700195C13.584 0.700195 17.2998 4.41604 17.2998 9C17.2998 13.584 13.584 17.2998 9 17.2998C4.41604 17.2998 0.700195 13.584 0.700195 9C0.700195 4.41604 4.41604 0.700195 9 0.700195Z" stroke="#86888B" stroke-width="1.4"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 334 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="0.7" y="0.7" width="16.6" height="16.6" rx="8.3" stroke="#007AFF" stroke-width="1.4"/>
|
||||||
|
<rect x="4" y="4" width="10" height="10" rx="5" fill="#007AFF"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 264 B |
@@ -69,6 +69,7 @@ export 'presentation/views/button/icon_button_web.dart';
|
|||||||
export 'presentation/views/button/tmail_button_widget.dart';
|
export 'presentation/views/button/tmail_button_widget.dart';
|
||||||
export 'presentation/views/image/avatar_builder.dart';
|
export 'presentation/views/image/avatar_builder.dart';
|
||||||
export 'presentation/views/list/sliver_grid_delegate_fixed_height.dart';
|
export 'presentation/views/list/sliver_grid_delegate_fixed_height.dart';
|
||||||
|
export 'presentation/views/list/no_stretch_scroll_behavior.dart';
|
||||||
export 'presentation/views/image/icon_builder.dart';
|
export 'presentation/views/image/icon_builder.dart';
|
||||||
export 'presentation/views/context_menu/context_menu_action_builder.dart';
|
export 'presentation/views/context_menu/context_menu_action_builder.dart';
|
||||||
export 'presentation/views/context_menu/context_menu_builder.dart';
|
export 'presentation/views/context_menu/context_menu_builder.dart';
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ class ConstantsUI {
|
|||||||
static const String fontApp = 'Inter';
|
static const String fontApp = 'Inter';
|
||||||
static const double htmlContentMaxHeight = 22000.0;
|
static const double htmlContentMaxHeight = 22000.0;
|
||||||
static const double composerHtmlContentMaxHeight = 20000.0;
|
static const double composerHtmlContentMaxHeight = 20000.0;
|
||||||
|
static const double htmlContentMinWidth = 300;
|
||||||
static const double htmlContentMinHeight = 150;
|
static const double htmlContentMinHeight = 150;
|
||||||
static const double htmlContentOffsetHeight = 30.0;
|
static const double htmlContentOffsetHeight = 30.0;
|
||||||
}
|
}
|
||||||
@@ -232,6 +232,8 @@ class ImagePaths {
|
|||||||
String get icRefreshQuotas => _getImagePath('ic_refresh_quotas.svg');
|
String get icRefreshQuotas => _getImagePath('ic_refresh_quotas.svg');
|
||||||
String get icCreateFilter => _getImagePath('ic_create_filter.svg');
|
String get icCreateFilter => _getImagePath('ic_create_filter.svg');
|
||||||
String get icArrowBack => _getImagePath('ic_arrow_back.svg');
|
String get icArrowBack => _getImagePath('ic_arrow_back.svg');
|
||||||
|
String get icRadio => _getImagePath('ic_radio.svg');
|
||||||
|
String get icRadioSelected => _getImagePath('ic_radio_selected.svg');
|
||||||
|
|
||||||
String get icTwakeWorkplace => _getIconPath('icon_twp.png');
|
String get icTwakeWorkplace => _getIconPath('icon_twp.png');
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,16 @@ class TransformConfiguration {
|
|||||||
const RemoveMaxWidthInImageStyleTransformer(),
|
const RemoveMaxWidthInImageStyleTransformer(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
factory TransformConfiguration.forSignatureIdentity() => TransformConfiguration.create(
|
||||||
|
customDomTransformers: [
|
||||||
|
const RemoveScriptTransformer(),
|
||||||
|
const BlockQuotedTransformer(),
|
||||||
|
const BlockCodeTransformer(),
|
||||||
|
SanitizeHyperLinkTagInHtmlTransformer(useTooltip: PlatformInfo.isWeb),
|
||||||
|
const ImageTransformer(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
/// Provides easy access to a standard configuration that does not block external images.
|
/// Provides easy access to a standard configuration that does not block external images.
|
||||||
static TransformConfiguration standardConfiguration = TransformConfiguration(
|
static TransformConfiguration standardConfiguration = TransformConfiguration(
|
||||||
standardDomTransformers,
|
standardDomTransformers,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:math' as math;
|
import 'dart:math' as math;
|
||||||
|
|
||||||
|
import 'package:core/presentation/constants/constants_ui.dart';
|
||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
import 'package:core/presentation/utils/shims/dart_ui.dart' as ui;
|
import 'package:core/presentation/utils/shims/dart_ui.dart' as ui;
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
@@ -9,6 +10,7 @@ import 'package:core/utils/html/html_interaction.dart';
|
|||||||
import 'package:core/utils/html/html_template.dart';
|
import 'package:core/utils/html/html_template.dart';
|
||||||
import 'package:core/utils/html/html_utils.dart';
|
import 'package:core/utils/html/html_utils.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:universal_html/html.dart' as html;
|
import 'package:universal_html/html.dart' as html;
|
||||||
|
|
||||||
typedef OnClickHyperLinkAction = Function(Uri?);
|
typedef OnClickHyperLinkAction = Function(Uri?);
|
||||||
@@ -34,6 +36,13 @@ class HtmlContentViewerOnWeb extends StatefulWidget {
|
|||||||
final bool keepWidthWhileLoading;
|
final bool keepWidthWhileLoading;
|
||||||
final ScrollController? scrollController;
|
final ScrollController? scrollController;
|
||||||
final bool enableQuoteToggle;
|
final bool enableQuoteToggle;
|
||||||
|
final bool disableScrolling;
|
||||||
|
final bool keepAlive;
|
||||||
|
final double htmlContentMinHeight;
|
||||||
|
final double htmlContentMinWidth;
|
||||||
|
final double offsetHtmlContentHeight;
|
||||||
|
final double? viewMaxHeight;
|
||||||
|
final bool autoAdjustHeight;
|
||||||
|
|
||||||
const HtmlContentViewerOnWeb({
|
const HtmlContentViewerOnWeb({
|
||||||
Key? key,
|
Key? key,
|
||||||
@@ -49,15 +58,21 @@ class HtmlContentViewerOnWeb extends StatefulWidget {
|
|||||||
this.contentPadding,
|
this.contentPadding,
|
||||||
this.scrollController,
|
this.scrollController,
|
||||||
this.enableQuoteToggle = false,
|
this.enableQuoteToggle = false,
|
||||||
|
this.keepAlive = false,
|
||||||
|
this.disableScrolling = false,
|
||||||
|
this.autoAdjustHeight = false,
|
||||||
|
this.htmlContentMinHeight = ConstantsUI.htmlContentMinHeight,
|
||||||
|
this.htmlContentMinWidth = ConstantsUI.htmlContentMinWidth,
|
||||||
|
this.offsetHtmlContentHeight = ConstantsUI.htmlContentOffsetHeight,
|
||||||
|
this.viewMaxHeight,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<HtmlContentViewerOnWeb> createState() => _HtmlContentViewerOnWebState();
|
State<HtmlContentViewerOnWeb> createState() => _HtmlContentViewerOnWebState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
|
||||||
|
with AutomaticKeepAliveClientMixin {
|
||||||
static const double _minWidth = 300;
|
|
||||||
/// The view ID for the IFrameElement. Must be unique.
|
/// The view ID for the IFrameElement. Must be unique.
|
||||||
late String _createdViewId;
|
late String _createdViewId;
|
||||||
/// The actual height of the content view, used to automatically set the height
|
/// The actual height of the content view, used to automatically set the height
|
||||||
@@ -68,7 +83,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
Future<bool>? _webInit;
|
Future<bool>? _webInit;
|
||||||
String? _htmlData;
|
String? _htmlData;
|
||||||
bool _isLoading = true;
|
bool _isLoading = true;
|
||||||
double minHeight = 100;
|
late double minHeight;
|
||||||
late final StreamSubscription<html.MessageEvent> _onMessageSubscription;
|
late final StreamSubscription<html.MessageEvent> _onMessageSubscription;
|
||||||
bool _iframeLoaded = false;
|
bool _iframeLoaded = false;
|
||||||
static const String iframeOnLoadMessage = 'iframeHasBeenLoaded';
|
static const String iframeOnLoadMessage = 'iframeHasBeenLoaded';
|
||||||
@@ -80,7 +95,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
super.initState();
|
super.initState();
|
||||||
_actualHeight = widget.heightContent;
|
_actualHeight = widget.heightContent;
|
||||||
_actualWidth = widget.widthContent;
|
_actualWidth = widget.widthContent;
|
||||||
_createdViewId = _getRandString(10);
|
minHeight = widget.htmlContentMinHeight;
|
||||||
_setUpWeb();
|
_setUpWeb();
|
||||||
_onMessageSubscription = html.window.onMessage.listen(_handleMessageEvent);
|
_onMessageSubscription = html.window.onMessage.listen(_handleMessageEvent);
|
||||||
}
|
}
|
||||||
@@ -119,6 +134,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
|
|
||||||
bool _isScrollChangedEventTriggered(String? type) {
|
bool _isScrollChangedEventTriggered(String? type) {
|
||||||
return widget.scrollController != null &&
|
return widget.scrollController != null &&
|
||||||
|
widget.scrollController?.hasClients == true &&
|
||||||
type?.contains('toDart: $onScrollChangedEvent') == true;
|
type?.contains('toDart: $onScrollChangedEvent') == true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,8 +160,13 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
void _handleContentHeightEvent(dynamic height) {
|
void _handleContentHeightEvent(dynamic height) {
|
||||||
final docHeight = height ?? _actualHeight;
|
final docHeight = height ?? _actualHeight;
|
||||||
if (docHeight != null && mounted) {
|
if (docHeight != null && mounted) {
|
||||||
final scrollHeightWithBuffer = docHeight + 30.0;
|
final scrollHeightWithBuffer = docHeight + widget.offsetHtmlContentHeight;
|
||||||
if (scrollHeightWithBuffer > minHeight) {
|
log('$runtimeType::_handleContentHeightEvent: ScrollHeightWithBuffer = $scrollHeightWithBuffer');
|
||||||
|
bool isHeightChanged = widget.autoAdjustHeight
|
||||||
|
? scrollHeightWithBuffer >= minHeight
|
||||||
|
: scrollHeightWithBuffer > minHeight;
|
||||||
|
|
||||||
|
if (isHeightChanged) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_actualHeight = scrollHeightWithBuffer;
|
_actualHeight = scrollHeightWithBuffer;
|
||||||
_isLoading = false;
|
_isLoading = false;
|
||||||
@@ -166,7 +187,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
void _handleContentWidthEvent(dynamic width) {
|
void _handleContentWidthEvent(dynamic width) {
|
||||||
final docWidth = width ?? _actualWidth;
|
final docWidth = width ?? _actualWidth;
|
||||||
if (docWidth != null && mounted &&
|
if (docWidth != null && mounted &&
|
||||||
docWidth > _minWidth &&
|
docWidth > widget.htmlContentMinWidth &&
|
||||||
widget.allowResizeToDocumentSize) {
|
widget.allowResizeToDocumentSize) {
|
||||||
setState(() => _actualWidth = docWidth);
|
setState(() => _actualWidth = docWidth);
|
||||||
}
|
}
|
||||||
@@ -196,7 +217,6 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
log('_HtmlContentViewerOnWebState::didUpdateWidget():Old-Direction: ${oldWidget.direction} | Current-Direction: ${widget.direction}');
|
log('_HtmlContentViewerOnWebState::didUpdateWidget():Old-Direction: ${oldWidget.direction} | Current-Direction: ${widget.direction}');
|
||||||
if (widget.contentHtml != oldWidget.contentHtml ||
|
if (widget.contentHtml != oldWidget.contentHtml ||
|
||||||
widget.direction != oldWidget.direction) {
|
widget.direction != oldWidget.direction) {
|
||||||
_createdViewId = _getRandString(10);
|
|
||||||
_setUpWeb();
|
_setUpWeb();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,10 +267,12 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resizeObserver = new ResizeObserver((entries) => {
|
${!widget.autoAdjustHeight ? '''
|
||||||
var height = document.body.scrollHeight;
|
const resizeObserver = new ResizeObserver((entries) => {
|
||||||
window.parent.postMessage(JSON.stringify({"view": "$_createdViewId", "type": "toDart: htmlHeight", "height": height}), "*");
|
var height = document.body.scrollHeight;
|
||||||
});
|
window.parent.postMessage(JSON.stringify({"view": "$_createdViewId", "type": "toDart: htmlHeight", "height": height}), "*");
|
||||||
|
});
|
||||||
|
''' : ''}
|
||||||
|
|
||||||
${widget.mailtoDelegate != null
|
${widget.mailtoDelegate != null
|
||||||
? '''
|
? '''
|
||||||
@@ -297,7 +319,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
'''
|
'''
|
||||||
: ''}
|
: ''}
|
||||||
|
|
||||||
resizeObserver.observe(document.body);
|
${!widget.autoAdjustHeight ? 'resizeObserver.observe(document.body);' : ''}
|
||||||
}
|
}
|
||||||
|
|
||||||
${widget.scrollController != null ? '''
|
${widget.scrollController != null ? '''
|
||||||
@@ -313,39 +335,30 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
</script>
|
</script>
|
||||||
''';
|
''';
|
||||||
|
|
||||||
const scriptsDisableZoom = '''
|
final processedContent = widget.enableQuoteToggle
|
||||||
<script type="text/javascript">
|
? HtmlUtils.addQuoteToggle(content)
|
||||||
document.addEventListener('wheel', function(e) {
|
: content;
|
||||||
e.ctrlKey && e.preventDefault();
|
|
||||||
}, {
|
final combinedCss = [
|
||||||
passive: false,
|
HtmlTemplate.tooltipLinkCss,
|
||||||
});
|
if (widget.enableQuoteToggle) HtmlUtils.quoteToggleStyle,
|
||||||
window.addEventListener('keydown', function(e) {
|
if (widget.disableScrolling) HtmlTemplate.disableScrollingStyleCSS,
|
||||||
if (event.metaKey || event.ctrlKey) {
|
].join();
|
||||||
switch (event.key) {
|
|
||||||
case '=':
|
final combinedScripts = [
|
||||||
case '-':
|
webViewActionScripts,
|
||||||
event.preventDefault();
|
HtmlInteraction.scriptsDisableZoom,
|
||||||
break;
|
HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage,
|
||||||
}
|
HtmlInteraction.generateNormalizeImageScript(widget.widthContent),
|
||||||
}
|
if (widget.enableQuoteToggle) HtmlUtils.quoteToggleScript,
|
||||||
});
|
].join();
|
||||||
</script>
|
|
||||||
''';
|
|
||||||
|
|
||||||
final htmlTemplate = HtmlUtils.generateHtmlDocument(
|
final htmlTemplate = HtmlUtils.generateHtmlDocument(
|
||||||
content: widget.enableQuoteToggle
|
content: processedContent,
|
||||||
? HtmlUtils.addQuoteToggle(content)
|
|
||||||
: content,
|
|
||||||
minHeight: minHeight,
|
minHeight: minHeight,
|
||||||
minWidth: _minWidth,
|
minWidth: widget.htmlContentMinWidth,
|
||||||
styleCSS: HtmlTemplate.tooltipLinkCss
|
styleCSS: combinedCss,
|
||||||
+ (widget.enableQuoteToggle ? HtmlUtils.quoteToggleStyle : ''),
|
javaScripts: combinedScripts,
|
||||||
javaScripts: webViewActionScripts
|
|
||||||
+ scriptsDisableZoom
|
|
||||||
+ HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage
|
|
||||||
+ HtmlInteraction.generateNormalizeImageScript(widget.widthContent)
|
|
||||||
+ (widget.enableQuoteToggle ? HtmlUtils.quoteToggleScript : ''),
|
|
||||||
direction: widget.direction,
|
direction: widget.direction,
|
||||||
contentPadding: widget.contentPadding,
|
contentPadding: widget.contentPadding,
|
||||||
useDefaultFont: widget.useDefaultFont,
|
useDefaultFont: widget.useDefaultFont,
|
||||||
@@ -355,6 +368,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _setUpWeb() {
|
void _setUpWeb() {
|
||||||
|
_createdViewId = _getRandString(10);
|
||||||
_htmlData = _generateHtmlDocument(widget.contentHtml);
|
_htmlData = _generateHtmlDocument(widget.contentHtml);
|
||||||
|
|
||||||
final iframe = html.IFrameElement()
|
final iframe = html.IFrameElement()
|
||||||
@@ -377,54 +391,76 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return LayoutBuilder(builder: (context, constraint) {
|
super.build(context);
|
||||||
minHeight = math.min(constraint.maxHeight, minHeight);
|
|
||||||
final child = Stack(
|
if (widget.autoAdjustHeight) {
|
||||||
children: [
|
return _buildHtmlElementView();
|
||||||
if (_htmlData?.isNotEmpty == false)
|
} else {
|
||||||
const SizedBox.shrink()
|
return LayoutBuilder(
|
||||||
else
|
builder: (_, constraint) {
|
||||||
FutureBuilder<bool>(
|
minHeight = math.min(constraint.maxHeight, minHeight);
|
||||||
future: _webInit,
|
return _buildHtmlElementView();
|
||||||
builder: (context, snapshot) {
|
},
|
||||||
if (snapshot.hasData) {
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildHtmlElementView() {
|
||||||
|
log('$runtimeType::_buildHtmlElementView: ActualHeight: $_actualHeight');
|
||||||
|
final child = Stack(
|
||||||
|
children: [
|
||||||
|
if (_htmlData?.trim().isNotEmpty == true)
|
||||||
|
FutureBuilder<bool>(
|
||||||
|
future: _webInit,
|
||||||
|
builder: (_, snapshot) {
|
||||||
|
if (snapshot.hasData) {
|
||||||
|
final htmlView = HtmlElementView(
|
||||||
|
key: ValueKey('$_htmlData-${widget.key}'),
|
||||||
|
viewType: _createdViewId,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (widget.viewMaxHeight != null) {
|
||||||
|
return Container(
|
||||||
|
height: _actualHeight,
|
||||||
|
width: _actualWidth,
|
||||||
|
color: Colors.greenAccent,
|
||||||
|
constraints: BoxConstraints(
|
||||||
|
maxHeight: widget.viewMaxHeight!,
|
||||||
|
),
|
||||||
|
child: htmlView,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
height: _actualHeight,
|
height: _actualHeight,
|
||||||
width: _actualWidth,
|
width: _actualWidth,
|
||||||
child: HtmlElementView(
|
child: htmlView,
|
||||||
key: ValueKey('$_htmlData-${widget.key}'),
|
|
||||||
viewType: _createdViewId,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if (_isLoading)
|
||||||
|
const Align(
|
||||||
|
alignment: Alignment.topCenter,
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
child: SizedBox(
|
||||||
|
width: 30,
|
||||||
|
height: 30,
|
||||||
|
child: CupertinoActivityIndicator(color: AppColor.colorLoading),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
if (_isLoading)
|
),
|
||||||
const Align(
|
],
|
||||||
alignment: Alignment.topCenter,
|
);
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.all(16),
|
|
||||||
child: SizedBox(
|
|
||||||
width: 30,
|
|
||||||
height: 30,
|
|
||||||
child: CupertinoActivityIndicator(
|
|
||||||
color: AppColor.colorLoading
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!widget.keepWidthWhileLoading) return child;
|
if (widget.keepWidthWhileLoading) {
|
||||||
|
return child;
|
||||||
return SizedBox(
|
} else {
|
||||||
width: _actualWidth,
|
return SizedBox(width: _actualWidth, child: child);
|
||||||
child: child,
|
}
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -433,4 +469,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
|
|||||||
_onMessageSubscription.cancel();
|
_onMessageSubscription.cancel();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool get wantKeepAlive => widget.keepAlive;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class NoStretchScrollBehavior extends ScrollBehavior {
|
||||||
|
@override
|
||||||
|
Widget buildOverscrollIndicator(
|
||||||
|
BuildContext context,
|
||||||
|
Widget child,
|
||||||
|
ScrollableDetails details,
|
||||||
|
) {
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -278,4 +278,24 @@ class HtmlInteraction {
|
|||||||
</script>
|
</script>
|
||||||
''';
|
''';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const scriptsDisableZoom = '''
|
||||||
|
<script type="text/javascript">
|
||||||
|
document.addEventListener('wheel', function(e) {
|
||||||
|
e.ctrlKey && e.preventDefault();
|
||||||
|
}, {
|
||||||
|
passive: false,
|
||||||
|
});
|
||||||
|
window.addEventListener('keydown', function(e) {
|
||||||
|
if (event.metaKey || event.ctrlKey) {
|
||||||
|
switch (event.key) {
|
||||||
|
case '=':
|
||||||
|
case '-':
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
''';
|
||||||
}
|
}
|
||||||
@@ -250,4 +250,16 @@ class HtmlTemplate {
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
''';
|
''';
|
||||||
|
|
||||||
|
static const String disableScrollingStyleCSS = '''
|
||||||
|
html, body {
|
||||||
|
overflow: hidden;
|
||||||
|
overscroll-behavior: none;
|
||||||
|
scrollbar-width: none; /* Firefox */
|
||||||
|
-ms-overflow-style: none; /* IE/Edge */
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
''';
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_ident
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
|
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
|
||||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/compose
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/composer_cache_repository.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/composer_cache_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_by_id_on_web_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_interactors_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
|
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart';
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_work
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart';
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import 'package:tmail_ui_user/features/identity_creator/domain/usecase/save_iden
|
|||||||
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart';
|
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
||||||
|
|
||||||
class IdentityCreatorBindings extends BaseBindings {
|
class IdentityCreatorBindings extends BaseBindings {
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/presentation/model/public_asset_arguments.dart';
|
import 'package:tmail_ui_user/features/public_asset/presentation/model/public_asset_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_bindings.dart';
|
import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_bindings.dart';
|
||||||
|
|||||||
+2
-2
@@ -99,8 +99,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart';
|
||||||
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart';
|
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart';
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
|
|
||||||
abstract class IdentityDataSource {
|
abstract class IdentityDataSource {
|
||||||
Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties});
|
Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties});
|
||||||
@@ -15,5 +16,5 @@ abstract class IdentityDataSource {
|
|||||||
|
|
||||||
Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest);
|
Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest);
|
||||||
|
|
||||||
Future<String> transformHtmlSignature(String signature);
|
Future<IdentitySignature> transformHtmlSignature(IdentitySignature identitySignature);
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,5 @@
|
|||||||
import 'package:core/presentation/utils/html_transformer/dom/block_code_transformers.dart';
|
|
||||||
import 'package:core/presentation/utils/html_transformer/dom/block_quoted_transformers.dart';
|
|
||||||
import 'package:core/presentation/utils/html_transformer/dom/image_transformers.dart';
|
|
||||||
import 'package:core/presentation/utils/html_transformer/dom/sanitize_hyper_link_tag_in_html_transformers.dart';
|
|
||||||
import 'package:core/presentation/utils/html_transformer/dom/script_transformers.dart';
|
|
||||||
import 'package:core/presentation/utils/html_transformer/html_transform.dart';
|
import 'package:core/presentation/utils/html_transformer/html_transform.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/transform_configuration.dart';
|
import 'package:core/presentation/utils/html_transformer/transform_configuration.dart';
|
||||||
import 'package:core/utils/platform_info.dart';
|
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
@@ -15,6 +9,7 @@ import 'package:tmail_ui_user/features/manage_account/data/network/identity_api.
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
||||||
|
|
||||||
class IdentityDataSourceImpl extends IdentityDataSource {
|
class IdentityDataSourceImpl extends IdentityDataSource {
|
||||||
@@ -58,18 +53,13 @@ class IdentityDataSourceImpl extends IdentityDataSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> transformHtmlSignature(String signature) {
|
Future<IdentitySignature> transformHtmlSignature(IdentitySignature identitySignature) {
|
||||||
return Future.sync(() async {
|
return Future.sync(() async {
|
||||||
final signatureUnescape = await _htmlTransform.transformToHtml(
|
final signatureUnescape = await _htmlTransform.transformToHtml(
|
||||||
htmlContent: signature,
|
htmlContent: identitySignature.signature,
|
||||||
transformConfiguration: TransformConfiguration.create(customDomTransformers: [
|
transformConfiguration: TransformConfiguration.forSignatureIdentity(),
|
||||||
const RemoveScriptTransformer(),
|
);
|
||||||
const BlockQuotedTransformer(),
|
return identitySignature.newSignature(signatureUnescape);
|
||||||
const BlockCodeTransformer(),
|
|
||||||
SanitizeHyperLinkTagInHtmlTransformer(useTooltip: PlatformInfo.isWeb),
|
|
||||||
const ImageTransformer(),
|
|
||||||
]));
|
|
||||||
return signatureUnescape;
|
|
||||||
}).catchError(_exceptionThrower.throwException);
|
}).catchError(_exceptionThrower.throwException);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ import 'package:tmail_ui_user/features/manage_account/data/datasource/identity_d
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
||||||
|
|
||||||
class IdentityRepositoryImpl extends IdentityRepository {
|
class IdentityRepositoryImpl extends IdentityRepository {
|
||||||
@@ -36,7 +37,7 @@ class IdentityRepositoryImpl extends IdentityRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> transformHtmlSignature(String signature) {
|
Future<IdentitySignature> transformHtmlSignature(IdentitySignature identitySignature) {
|
||||||
return _dataSource.transformHtmlSignature(signature);
|
return _dataSource.transformHtmlSignature(identitySignature);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
|
|
||||||
|
class IdentitySignature with EquatableMixin {
|
||||||
|
final IdentityId identityId;
|
||||||
|
final String signature;
|
||||||
|
|
||||||
|
IdentitySignature({required this.identityId, required this.signature});
|
||||||
|
|
||||||
|
IdentitySignature newSignature(String newSignature) {
|
||||||
|
return IdentitySignature(
|
||||||
|
identityId: identityId,
|
||||||
|
signature: newSignature
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [identityId, signature];
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
|
|
||||||
abstract class IdentityRepository {
|
abstract class IdentityRepository {
|
||||||
Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties});
|
Future<IdentitiesResponse> getAllIdentities(Session session, AccountId accountId, {Properties? properties});
|
||||||
@@ -15,5 +16,5 @@ abstract class IdentityRepository {
|
|||||||
|
|
||||||
Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest);
|
Future<bool> editIdentity(Session session, AccountId accountId, EditIdentityRequest editIdentityRequest);
|
||||||
|
|
||||||
Future<String> transformHtmlSignature(String signature);
|
Future<IdentitySignature> transformHtmlSignature(IdentitySignature identitySignature);
|
||||||
}
|
}
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
|
||||||
import 'package:core/presentation/state/success.dart';
|
|
||||||
|
|
||||||
class TransformHtmlSignatureLoading extends UIState {}
|
|
||||||
|
|
||||||
class TransformHtmlSignatureSuccess extends UIState {
|
|
||||||
final String signature;
|
|
||||||
|
|
||||||
TransformHtmlSignatureSuccess(this.signature);
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [signature];
|
|
||||||
}
|
|
||||||
|
|
||||||
class TransformHtmlSignatureFailure extends FeatureFailure {
|
|
||||||
|
|
||||||
TransformHtmlSignatureFailure(exception) : super(exception: exception);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
|
|
||||||
|
class TransformListSignatureLoading extends LoadingState {}
|
||||||
|
|
||||||
|
class TransformListSignatureSuccess extends UIState {
|
||||||
|
final List<IdentitySignature> identitySignatures;
|
||||||
|
|
||||||
|
TransformListSignatureSuccess(this.identitySignatures);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [identitySignatures];
|
||||||
|
}
|
||||||
|
|
||||||
|
class TransformListSignatureFailure extends FeatureFailure {
|
||||||
|
final List<IdentitySignature> identitySignatures;
|
||||||
|
|
||||||
|
TransformListSignatureFailure(exception, this.identitySignatures)
|
||||||
|
: super(exception: exception);
|
||||||
|
}
|
||||||
+1
-1
@@ -11,7 +11,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_de
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_default_identity_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_default_identity_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
|
|
||||||
class CreateNewDefaultIdentityInteractor {
|
class CreateNewDefaultIdentityInteractor {
|
||||||
final IdentityRepository _identityRepository;
|
final IdentityRepository _identityRepository;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/edit_default_
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_default_identity_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_default_identity_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
|
|
||||||
class EditDefaultIdentityInteractor {
|
class EditDefaultIdentityInteractor {
|
||||||
final IdentityRepository _identityRepository;
|
final IdentityRepository _identityRepository;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||||
|
|
||||||
class GetAllIdentitiesInteractor {
|
class GetAllIdentitiesInteractor {
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
import 'dart:core';
|
|
||||||
|
|
||||||
import 'package:core/presentation/state/failure.dart';
|
|
||||||
import 'package:core/presentation/state/success.dart';
|
|
||||||
import 'package:dartz/dartz.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/transform_html_signature_state.dart';
|
|
||||||
|
|
||||||
class TransformHtmlSignatureInteractor {
|
|
||||||
final IdentityRepository _identityRepository;
|
|
||||||
|
|
||||||
TransformHtmlSignatureInteractor(this._identityRepository);
|
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(String signature) async* {
|
|
||||||
try {
|
|
||||||
yield Right<Failure, Success>(TransformHtmlSignatureLoading());
|
|
||||||
final signatureUnescape = await _identityRepository.transformHtmlSignature(signature);
|
|
||||||
yield Right<Failure, Success>(TransformHtmlSignatureSuccess(signatureUnescape));
|
|
||||||
} catch (exception) {
|
|
||||||
yield Left<Failure, Success>(EditIdentityFailure(exception));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import 'dart:core';
|
||||||
|
|
||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/identity_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/state/transform_list_signature_state.dart';
|
||||||
|
|
||||||
|
class TransformListSignatureInteractor {
|
||||||
|
final IdentityRepository _identityRepository;
|
||||||
|
|
||||||
|
TransformListSignatureInteractor(this._identityRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(List<IdentitySignature> identitySignatures) async* {
|
||||||
|
try {
|
||||||
|
yield Right<Failure, Success>(TransformListSignatureLoading());
|
||||||
|
final newListIdentitySignature = await Future.wait(
|
||||||
|
identitySignatures.map(_transformHtmlSignature),
|
||||||
|
eagerError: true,
|
||||||
|
);
|
||||||
|
yield Right<Failure, Success>(TransformListSignatureSuccess(newListIdentitySignature));
|
||||||
|
} catch (exception) {
|
||||||
|
yield Left<Failure, Success>(TransformListSignatureFailure(exception, identitySignatures));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<IdentitySignature> _transformHtmlSignature(IdentitySignature identitySignature) async {
|
||||||
|
try {
|
||||||
|
return await _identityRepository.transformHtmlSignature(identitySignature);
|
||||||
|
} catch (e) {
|
||||||
|
logError('TransformListSignatureInteractor::_transformHtmlSignature:Exception = $e');
|
||||||
|
return identitySignature;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
|
|
||||||
extension IdentityExtension on Identity {
|
extension IdentityExtension on Identity {
|
||||||
|
|
||||||
@@ -12,4 +12,8 @@ extension IdentityExtension on Identity {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
IdentitySignature? toIdentitySignature() => id != null
|
||||||
|
? IdentitySignature(identityId: id!, signature: signatureAsString)
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
||||||
|
|
||||||
|
extension ListIdentityExtension on List<Identity> {
|
||||||
|
|
||||||
|
List<IdentitySignature> toListIdentitySignature() {
|
||||||
|
return map((identity) => identity.toIdentitySignature())
|
||||||
|
.nonNulls
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
}
|
||||||
+68
-28
@@ -26,24 +26,26 @@ import 'package:tmail_ui_user/features/identity_creator/presentation/model/ident
|
|||||||
import 'package:tmail_ui_user/features/identity_creator/presentation/restore_identity_cache_interactor_bindings.dart';
|
import 'package:tmail_ui_user/features/identity_creator/presentation/restore_identity_cache_interactor_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/identity_signature.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_default_identity_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_default_identity_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_identity_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_identity_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_identity_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_identity_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/transform_html_signature_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/transform_list_signature_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_html_signature_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_list_signature_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/update_own_email_address_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/update_own_email_address_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/list_identity_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/widgets/delete_identity_dialog_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart';
|
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/extensions/string_to_public_asset_extension.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/extensions/string_to_public_asset_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/state/remove_identity_from_public_assets_state.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/state/remove_identity_from_public_assets_state.dart';
|
||||||
@@ -67,15 +69,19 @@ class IdentitiesController extends ReloadableController implements BeforeReconne
|
|||||||
final DeleteIdentityInteractor _deleteIdentityInteractor;
|
final DeleteIdentityInteractor _deleteIdentityInteractor;
|
||||||
final EditIdentityInteractor _editIdentityInteractor;
|
final EditIdentityInteractor _editIdentityInteractor;
|
||||||
final EditDefaultIdentityInteractor _editDefaultIdentityInteractor;
|
final EditDefaultIdentityInteractor _editDefaultIdentityInteractor;
|
||||||
final TransformHtmlSignatureInteractor _transformHtmlSignatureInteractor;
|
final TransformListSignatureInteractor _transformListSignatureInteractor;
|
||||||
final SaveIdentityCacheOnWebInteractor _saveIdentityCacheOnWebInteractor;
|
final SaveIdentityCacheOnWebInteractor _saveIdentityCacheOnWebInteractor;
|
||||||
|
|
||||||
final identitySelected = Rxn<Identity>();
|
final identitySelected = Rxn<Identity>();
|
||||||
final signatureSelected = Rxn<String>();
|
final signatureSelected = Rxn<String>();
|
||||||
final listAllIdentities = <Identity>[].obs;
|
final listAllIdentities = <Identity>[].obs;
|
||||||
|
final mapIdentitySignatures = <IdentityId, String>{}.obs;
|
||||||
|
final identitiesViewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||||
|
final signatureViewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||||
|
|
||||||
dynamic newIdentityArguments;
|
dynamic newIdentityArguments;
|
||||||
|
ScrollController? listIdentityScrollController;
|
||||||
|
|
||||||
final _beforeReconnectManager = Get.find<BeforeReconnectManager>();
|
final _beforeReconnectManager = Get.find<BeforeReconnectManager>();
|
||||||
|
|
||||||
IdentitiesController(
|
IdentitiesController(
|
||||||
@@ -85,7 +91,7 @@ class IdentitiesController extends ReloadableController implements BeforeReconne
|
|||||||
this._editIdentityInteractor,
|
this._editIdentityInteractor,
|
||||||
this._createNewDefaultIdentityInteractor,
|
this._createNewDefaultIdentityInteractor,
|
||||||
this._editDefaultIdentityInteractor,
|
this._editDefaultIdentityInteractor,
|
||||||
this._transformHtmlSignatureInteractor,
|
this._transformListSignatureInteractor,
|
||||||
this._saveIdentityCacheOnWebInteractor
|
this._saveIdentityCacheOnWebInteractor
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -94,14 +100,24 @@ class IdentitiesController extends ReloadableController implements BeforeReconne
|
|||||||
_registerObxStreamListener();
|
_registerObxStreamListener();
|
||||||
RestoreIdentityCacheInteractorBindings().dependencies();
|
RestoreIdentityCacheInteractorBindings().dependencies();
|
||||||
_beforeReconnectManager.addListener(onBeforeReconnect);
|
_beforeReconnectManager.addListener(onBeforeReconnect);
|
||||||
|
if (PlatformInfo.isWeb) {
|
||||||
|
listIdentityScrollController = ScrollController();
|
||||||
|
}
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onReady() {
|
||||||
|
identitiesViewState.value = Right(GetAllIdentitiesLoading());
|
||||||
|
super.onReady();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleSuccessViewState(Success success) {
|
void handleSuccessViewState(Success success) {
|
||||||
super.handleSuccessViewState(success);
|
|
||||||
if (success is GetAllIdentitiesSuccess) {
|
if (success is GetAllIdentitiesSuccess) {
|
||||||
_handleGetAllIdentitiesSuccess(success);
|
_handleGetAllIdentitiesSuccess(success);
|
||||||
|
} if (success is GetAllIdentitiesLoading) {
|
||||||
|
identitiesViewState.value = Right(success);
|
||||||
} else if (success is CreateNewIdentitySuccess) {
|
} else if (success is CreateNewIdentitySuccess) {
|
||||||
_createNewIdentitySuccess(success);
|
_createNewIdentitySuccess(success);
|
||||||
} else if (success is CreateNewDefaultIdentitySuccess) {
|
} else if (success is CreateNewDefaultIdentitySuccess) {
|
||||||
@@ -110,19 +126,25 @@ class IdentitiesController extends ReloadableController implements BeforeReconne
|
|||||||
_deleteIdentitySuccess(success);
|
_deleteIdentitySuccess(success);
|
||||||
} else if (success is EditIdentitySuccess) {
|
} else if (success is EditIdentitySuccess) {
|
||||||
_editIdentitySuccess(success);
|
_editIdentitySuccess(success);
|
||||||
} else if (success is TransformHtmlSignatureSuccess) {
|
} else if (success is TransformListSignatureLoading) {
|
||||||
signatureSelected.value = success.signature;
|
signatureViewState.value = Right(success);
|
||||||
|
} else if (success is TransformListSignatureSuccess) {
|
||||||
|
signatureViewState.value = Right(success);
|
||||||
|
_syncMapIdentitySignatures(success.identitySignatures);
|
||||||
} else if (success is RemoveIdentityFromPublicAssetsSuccessState) {
|
} else if (success is RemoveIdentityFromPublicAssetsSuccessState) {
|
||||||
_deleteIdentityAction(success.identityId);
|
_deleteIdentityAction(success.identityId);
|
||||||
} else if (success is GetIdentityCacheOnWebSuccess) {
|
} else if (success is GetIdentityCacheOnWebSuccess) {
|
||||||
_openIdentityEditorFromCache(success);
|
_openIdentityEditorFromCache(success);
|
||||||
|
} else {
|
||||||
|
super.handleSuccessViewState(success);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleFailureViewState(Failure failure) {
|
void handleFailureViewState(Failure failure) {
|
||||||
super.handleFailureViewState(failure);
|
if (failure is GetAllIdentitiesFailure) {
|
||||||
if (failure is DeleteIdentityFailure) {
|
identitiesViewState.value = Left(failure);
|
||||||
|
} else if (failure is DeleteIdentityFailure) {
|
||||||
_deleteIdentityFailure(failure);
|
_deleteIdentityFailure(failure);
|
||||||
} else if (failure is RemoveIdentityFromPublicAssetsFailureState) {
|
} else if (failure is RemoveIdentityFromPublicAssetsFailureState) {
|
||||||
_deleteIdentityAction(failure.identityId);
|
_deleteIdentityAction(failure.identityId);
|
||||||
@@ -134,6 +156,11 @@ class IdentitiesController extends ReloadableController implements BeforeReconne
|
|||||||
accountDashBoardController.synchronizeOwnEmailAddress(
|
accountDashBoardController.synchronizeOwnEmailAddress(
|
||||||
accountDashBoardController.sessionCurrent?.getUserDisplayName() ?? '',
|
accountDashBoardController.sessionCurrent?.getUserDisplayName() ?? '',
|
||||||
);
|
);
|
||||||
|
} else if (failure is TransformListSignatureFailure) {
|
||||||
|
signatureViewState.value = Left(failure);
|
||||||
|
_syncMapIdentitySignatures(failure.identitySignatures);
|
||||||
|
} else {
|
||||||
|
super.handleFailureViewState(failure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,29 +191,39 @@ class IdentitiesController extends ReloadableController implements BeforeReconne
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleGetAllIdentitiesSuccess(GetAllIdentitiesSuccess success) {
|
void _handleGetAllIdentitiesSuccess(GetAllIdentitiesSuccess success) {
|
||||||
|
identitiesViewState.value = Right(success);
|
||||||
|
|
||||||
final listIdentities = success.identities ?? [];
|
final listIdentities = success.identities ?? [];
|
||||||
|
|
||||||
if (listIdentities.isNotEmpty) {
|
|
||||||
final newListIdentities = listIdentities
|
|
||||||
.where((identity) => identity.mayDelete == true && identity.name?.trim().isNotEmpty == true)
|
|
||||||
.toList();
|
|
||||||
listAllIdentities.addAll(newListIdentities);
|
|
||||||
}
|
|
||||||
|
|
||||||
accountDashBoardController.updateOwnEmailAddressFromIdentities(listIdentities);
|
accountDashBoardController.updateOwnEmailAddressFromIdentities(listIdentities);
|
||||||
|
|
||||||
if (listAllIdentities.isNotEmpty) {
|
final newListIdentities = listIdentities.where(_validateIdentity).toList();
|
||||||
selectIdentity(listAllIdentities.first);
|
|
||||||
}
|
if (newListIdentities.isEmpty) return;
|
||||||
|
|
||||||
|
listAllIdentities.addAll(newListIdentities);
|
||||||
|
|
||||||
|
identitySelected.value = listAllIdentities.first;
|
||||||
|
|
||||||
|
_transformSignature();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _validateIdentity(Identity identity) {
|
||||||
|
return identity.mayDelete == true &&
|
||||||
|
identity.name?.trim().isNotEmpty == true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void selectIdentity(Identity? newIdentity) {
|
void _transformSignature() {
|
||||||
signatureSelected.value = null;
|
final listIdentitySignature = listAllIdentities.toListIdentitySignature();
|
||||||
identitySelected.value = newIdentity;
|
consumeState(_transformListSignatureInteractor.execute(listIdentitySignature));
|
||||||
|
}
|
||||||
|
|
||||||
if (newIdentity != null) {
|
void _syncMapIdentitySignatures(List<IdentitySignature> identitySignatures) {
|
||||||
consumeState(_transformHtmlSignatureInteractor.execute(newIdentity.signatureAsString));
|
mapIdentitySignatures.value = Map.fromEntries(
|
||||||
}
|
identitySignatures.map((identitySignature) => MapEntry(
|
||||||
|
identitySignature.identityId,
|
||||||
|
identitySignature.signature,
|
||||||
|
)),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void goToCreateNewIdentity(BuildContext context) async {
|
void goToCreateNewIdentity(BuildContext context) async {
|
||||||
@@ -527,6 +564,9 @@ class IdentitiesController extends ReloadableController implements BeforeReconne
|
|||||||
RestoreIdentityCacheInteractorBindings().close();
|
RestoreIdentityCacheInteractorBindings().close();
|
||||||
newIdentityArguments = null;
|
newIdentityArguments = null;
|
||||||
_beforeReconnectManager.removeListener(onBeforeReconnect);
|
_beforeReconnectManager.removeListener(onBeforeReconnect);
|
||||||
|
if (PlatformInfo.isWeb) {
|
||||||
|
listIdentityScrollController?.dispose();
|
||||||
|
}
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
import 'package:core/presentation/utils/theme_utils.dart';
|
||||||
|
import 'package:core/presentation/views/list/no_stretch_scroll_behavior.dart';
|
||||||
|
import 'package:core/utils/platform_info.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identities_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/widgets/create_new_identity_button_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/widgets/identity_list_tile_builder.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/widgets/identity_loading_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_explanation_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_header_widget.dart';
|
||||||
|
|
||||||
|
class IdentitiesView extends GetWidget<IdentitiesController> {
|
||||||
|
|
||||||
|
const IdentitiesView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final isDesktop = controller.responsiveUtils.isDesktop(context);
|
||||||
|
|
||||||
|
return SettingDetailViewBuilder(
|
||||||
|
responsiveUtils: controller.responsiveUtils,
|
||||||
|
child: Container(
|
||||||
|
color: SettingsUtils.getContentBackgroundColor(
|
||||||
|
context,
|
||||||
|
controller.responsiveUtils,
|
||||||
|
),
|
||||||
|
decoration: SettingsUtils.getBoxDecorationForContent(
|
||||||
|
context,
|
||||||
|
controller.responsiveUtils,
|
||||||
|
),
|
||||||
|
width: double.infinity,
|
||||||
|
padding: isDesktop
|
||||||
|
? const EdgeInsetsDirectional.only(
|
||||||
|
start: 30,
|
||||||
|
end: 30,
|
||||||
|
top: 22,
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
if (isDesktop)
|
||||||
|
...[
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: SettingHeaderWidget(
|
||||||
|
menuItem: AccountMenuItem.profiles,
|
||||||
|
textStyle: ThemeUtils.textStyleInter600().copyWith(
|
||||||
|
color: Colors.black.withValues(alpha: 0.9),
|
||||||
|
),
|
||||||
|
padding: const EdgeInsetsDirectional.only(end: 16),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
CreateNewIdentityButtonWidget(
|
||||||
|
imagePaths: controller.imagePaths,
|
||||||
|
onCreateNewIdentityAction: () =>
|
||||||
|
controller.goToCreateNewIdentity(context),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 14),
|
||||||
|
]
|
||||||
|
else
|
||||||
|
...[
|
||||||
|
const SettingExplanationWidget(
|
||||||
|
menuItem: AccountMenuItem.profiles,
|
||||||
|
padding: EdgeInsetsDirectional.symmetric(horizontal: 16),
|
||||||
|
isCenter: true,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: CreateNewIdentityButtonWidget(
|
||||||
|
imagePaths: controller.imagePaths,
|
||||||
|
margin: const EdgeInsets.only(top: 24, bottom: 16),
|
||||||
|
onCreateNewIdentityAction: () =>
|
||||||
|
controller.goToCreateNewIdentity(context),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
Obx(() => IdentityLoadingWidget(
|
||||||
|
identityViewState: controller.identitiesViewState.value,
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
child: Obx(() {
|
||||||
|
final Widget listView = ListView.separated(
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: controller.listAllIdentities.length + 1,
|
||||||
|
controller: controller.listIdentityScrollController,
|
||||||
|
padding: const EdgeInsetsDirectional.only(
|
||||||
|
start: 24,
|
||||||
|
end: 24,
|
||||||
|
bottom: 24,
|
||||||
|
),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
if (index == controller.listAllIdentities.length) {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
|
||||||
|
final identity = controller.listAllIdentities[index];
|
||||||
|
final isSelected = identity == controller.identitySelected.value;
|
||||||
|
return Obx(() => IdentityListTileBuilder(
|
||||||
|
imagePaths: controller.imagePaths,
|
||||||
|
identity: identity,
|
||||||
|
isSelected: isSelected,
|
||||||
|
mapIdentitySignatures: controller.mapIdentitySignatures,
|
||||||
|
signatureViewState: controller.signatureViewState.value,
|
||||||
|
isDesktop: isDesktop,
|
||||||
|
scrollController: controller.listIdentityScrollController,
|
||||||
|
onEditIdentityAction: (identitySelected) =>
|
||||||
|
controller.goToEditIdentity(context, identitySelected),
|
||||||
|
onDeleteIdentityAction: (identitySelected) =>
|
||||||
|
controller.openConfirmationDialogDeleteIdentityAction(
|
||||||
|
context,
|
||||||
|
identitySelected,
|
||||||
|
),
|
||||||
|
));
|
||||||
|
},
|
||||||
|
separatorBuilder: (_, index) => Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 24),
|
||||||
|
child: Divider(color: Colors.black.withValues(alpha: 0.08)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (PlatformInfo.isMobile) {
|
||||||
|
return ScrollConfiguration(
|
||||||
|
behavior: NoStretchScrollBehavior(),
|
||||||
|
child: listView,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return listView;
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
+4
-4
@@ -6,9 +6,9 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_ide
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_html_signature_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_list_signature_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identities_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart';
|
||||||
|
|
||||||
class IdentityBindings extends Bindings {
|
class IdentityBindings extends Bindings {
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ class IdentityBindings extends Bindings {
|
|||||||
Get.find<EditIdentityInteractor>(),
|
Get.find<EditIdentityInteractor>(),
|
||||||
Get.find<CreateNewDefaultIdentityInteractor>(),
|
Get.find<CreateNewDefaultIdentityInteractor>(),
|
||||||
Get.find<EditDefaultIdentityInteractor>(),
|
Get.find<EditDefaultIdentityInteractor>(),
|
||||||
Get.find<TransformHtmlSignatureInteractor>(),
|
Get.find<TransformListSignatureInteractor>(),
|
||||||
Get.find<SaveIdentityCacheOnWebInteractor>(),
|
Get.find<SaveIdentityCacheOnWebInteractor>(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
+4
-4
@@ -17,8 +17,8 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_ide
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_html_signature_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_list_signature_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
||||||
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
|
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ class IdentityInteractorsBindings extends InteractorsBindings {
|
|||||||
Get.find<IdentityUtils>(tag: composerId)
|
Get.find<IdentityUtils>(tag: composerId)
|
||||||
), tag: composerId);
|
), tag: composerId);
|
||||||
Get.lazyPut(
|
Get.lazyPut(
|
||||||
() => TransformHtmlSignatureInteractor(Get.find<IdentityRepository>(tag: composerId)),
|
() => TransformListSignatureInteractor(Get.find<IdentityRepository>(tag: composerId)),
|
||||||
tag: composerId,
|
tag: composerId,
|
||||||
);
|
);
|
||||||
Get.lazyPut(
|
Get.lazyPut(
|
||||||
@@ -138,7 +138,7 @@ class IdentityInteractorsBindings extends InteractorsBindings {
|
|||||||
Get.delete<DeleteIdentityInteractor>(tag: composerId);
|
Get.delete<DeleteIdentityInteractor>(tag: composerId);
|
||||||
Get.delete<EditIdentityInteractor>(tag: composerId);
|
Get.delete<EditIdentityInteractor>(tag: composerId);
|
||||||
Get.delete<EditDefaultIdentityInteractor>(tag: composerId);
|
Get.delete<EditDefaultIdentityInteractor>(tag: composerId);
|
||||||
Get.delete<TransformHtmlSignatureInteractor>(tag: composerId);
|
Get.delete<TransformListSignatureInteractor>(tag: composerId);
|
||||||
Get.delete<SaveIdentityCacheOnWebInteractor>(tag: composerId);
|
Get.delete<SaveIdentityCacheOnWebInteractor>(tag: composerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
|
import 'package:core/presentation/resources/image_paths.dart';
|
||||||
|
import 'package:core/presentation/utils/theme_utils.dart';
|
||||||
|
import 'package:core/presentation/views/button/tmail_button_widget.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
|
typedef OnCreateNewIdentityAction = void Function();
|
||||||
|
|
||||||
|
class CreateNewIdentityButtonWidget extends StatelessWidget {
|
||||||
|
final ImagePaths imagePaths;
|
||||||
|
final OnCreateNewIdentityAction onCreateNewIdentityAction;
|
||||||
|
final EdgeInsetsGeometry? margin;
|
||||||
|
|
||||||
|
const CreateNewIdentityButtonWidget({
|
||||||
|
super.key,
|
||||||
|
required this.imagePaths,
|
||||||
|
required this.onCreateNewIdentityAction,
|
||||||
|
this.margin,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return TMailButtonWidget(
|
||||||
|
text: AppLocalizations.of(context).createNewIdentity,
|
||||||
|
icon: imagePaths.icAddIdentity,
|
||||||
|
backgroundColor: AppColor.primaryMain,
|
||||||
|
borderRadius: 100,
|
||||||
|
height: 48,
|
||||||
|
maxWidth: 300,
|
||||||
|
margin: margin,
|
||||||
|
textStyle: ThemeUtils.textStyleM3LabelLarge(color: Colors.white),
|
||||||
|
padding: const EdgeInsetsDirectional.symmetric(
|
||||||
|
horizontal: 32,
|
||||||
|
),
|
||||||
|
iconSize: 16,
|
||||||
|
iconColor: Colors.white,
|
||||||
|
iconSpace: 8,
|
||||||
|
maxLines: 1,
|
||||||
|
flexibleText: true,
|
||||||
|
textOverflow: TextOverflow.ellipsis,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
onTapActionCallback: onCreateNewIdentityAction,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
+157
@@ -0,0 +1,157 @@
|
|||||||
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
|
import 'package:core/presentation/resources/image_paths.dart';
|
||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:core/presentation/utils/theme_utils.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
|
import 'package:model/extensions/list_email_address_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/widgets/list_identity_item_actions_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/widgets/signature_builder.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/widgets/signature_loading_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
|
class IdentityListTileBuilder extends StatelessWidget {
|
||||||
|
|
||||||
|
const IdentityListTileBuilder({
|
||||||
|
Key? key,
|
||||||
|
required this.identity,
|
||||||
|
required this.mapIdentitySignatures,
|
||||||
|
required this.signatureViewState,
|
||||||
|
required this.imagePaths,
|
||||||
|
required this.onEditIdentityAction,
|
||||||
|
required this.onDeleteIdentityAction,
|
||||||
|
this.isDesktop = false,
|
||||||
|
this.isSelected = false,
|
||||||
|
this.scrollController,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final Identity identity;
|
||||||
|
final Map<IdentityId, String> mapIdentitySignatures;
|
||||||
|
final Either<Failure, Success> signatureViewState;
|
||||||
|
final ImagePaths imagePaths;
|
||||||
|
final bool isSelected;
|
||||||
|
final bool isDesktop;
|
||||||
|
final OnEditIdentityAction onEditIdentityAction;
|
||||||
|
final OnDeleteIdentityAction onDeleteIdentityAction;
|
||||||
|
final ScrollController? scrollController;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final selectedIcon = SvgPicture.asset(
|
||||||
|
isSelected ? imagePaths.icRadioSelected : imagePaths.icRadio,
|
||||||
|
width: 18,
|
||||||
|
height: 18,
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
);
|
||||||
|
|
||||||
|
final signatureContent = mapIdentitySignatures[identity.id!] ??
|
||||||
|
identity.signatureAsString;
|
||||||
|
|
||||||
|
final identityContent = Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 8),
|
||||||
|
child: Text(
|
||||||
|
(identity.name ?? ''),
|
||||||
|
style: ThemeUtils.textStyleBodyBody1(color: Colors.black),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (identity.email?.isNotEmpty == true)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 8),
|
||||||
|
child: Text(
|
||||||
|
identity.email ?? '',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||||
|
color: AppColor.steelGray400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (identity.replyTo?.isNotEmpty == true)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 8),
|
||||||
|
child: Text(
|
||||||
|
'${AppLocalizations.of(context).reply_to.toUpperCase()}: ${identity.replyTo?.listEmailAddressToString(isFullEmailAddress: true)}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||||
|
color: AppColor.steelGray400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (identity.bcc?.isNotEmpty == true)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 8),
|
||||||
|
child: Text(
|
||||||
|
'${AppLocalizations.of(context).bcc_email_address_prefix.toUpperCase()}: ${identity.bcc?.listEmailAddressToString(isFullEmailAddress: true)}',
|
||||||
|
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||||
|
color: AppColor.steelGray400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (signatureContent.trim().isNotEmpty)
|
||||||
|
...[
|
||||||
|
Text(
|
||||||
|
'--',
|
||||||
|
style: ThemeUtils.textStyleBodyBody2(
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SignatureLoadingWidget(signatureViewState: signatureViewState),
|
||||||
|
SignatureBuilder(
|
||||||
|
value: signatureContent,
|
||||||
|
width: isDesktop ? 280 : double.infinity,
|
||||||
|
scrollController: scrollController,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isDesktop) {
|
||||||
|
return Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
selectedIcon,
|
||||||
|
Container(
|
||||||
|
width: 280,
|
||||||
|
padding: const EdgeInsetsDirectional.only(start: 18, end: 12),
|
||||||
|
child: identityContent,
|
||||||
|
),
|
||||||
|
ListIdentityItemActionsWidget(
|
||||||
|
identity: identity,
|
||||||
|
imagePaths: imagePaths,
|
||||||
|
onEditIdentityAction: onEditIdentityAction,
|
||||||
|
onDeleteIdentityAction: onDeleteIdentityAction,
|
||||||
|
isDesktop: isDesktop,
|
||||||
|
),
|
||||||
|
const Spacer(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
selectedIcon,
|
||||||
|
const SizedBox(width: 18),
|
||||||
|
Expanded(child: identityContent),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 24),
|
||||||
|
ListIdentityItemActionsWidget(
|
||||||
|
identity: identity,
|
||||||
|
imagePaths: imagePaths,
|
||||||
|
onEditIdentityAction: onEditIdentityAction,
|
||||||
|
onDeleteIdentityAction: onDeleteIdentityAction,
|
||||||
|
isDesktop: isDesktop,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
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:tmail_ui_user/features/base/widget/circle_loading_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||||
|
|
||||||
|
class IdentityLoadingWidget extends StatelessWidget {
|
||||||
|
|
||||||
|
final Either<Failure, Success> identityViewState;
|
||||||
|
|
||||||
|
const IdentityLoadingWidget({
|
||||||
|
super.key,
|
||||||
|
required this.identityViewState,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return identityViewState.fold(
|
||||||
|
(failure) => const SizedBox.shrink(),
|
||||||
|
(success) {
|
||||||
|
if (success is GetAllIdentitiesLoading) {
|
||||||
|
return const Center(
|
||||||
|
child: CircleLoadingWidget(margin: EdgeInsets.all(16.0)),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
|
import 'package:core/presentation/resources/image_paths.dart';
|
||||||
|
import 'package:core/presentation/utils/theme_utils.dart';
|
||||||
|
import 'package:core/presentation/views/button/tmail_button_widget.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
|
typedef OnEditIdentityAction = Function(Identity identity);
|
||||||
|
typedef OnDeleteIdentityAction = Function(Identity identity);
|
||||||
|
|
||||||
|
class ListIdentityItemActionsWidget extends StatelessWidget {
|
||||||
|
final Identity identity;
|
||||||
|
final ImagePaths imagePaths;
|
||||||
|
final OnEditIdentityAction onEditIdentityAction;
|
||||||
|
final OnDeleteIdentityAction onDeleteIdentityAction;
|
||||||
|
final bool isDesktop;
|
||||||
|
|
||||||
|
const ListIdentityItemActionsWidget({
|
||||||
|
super.key,
|
||||||
|
required this.identity,
|
||||||
|
required this.imagePaths,
|
||||||
|
required this.onEditIdentityAction,
|
||||||
|
required this.onDeleteIdentityAction,
|
||||||
|
this.isDesktop = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
TMailButtonWidget(
|
||||||
|
icon: imagePaths.icCompose,
|
||||||
|
iconSize: 20,
|
||||||
|
text: AppLocalizations.of(context).edit,
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
iconColor: AppColor.primaryColor,
|
||||||
|
textStyle: ThemeUtils.textStyleInter500().copyWith(
|
||||||
|
fontSize: 13,
|
||||||
|
height: 1,
|
||||||
|
letterSpacing: 0.39,
|
||||||
|
color: AppColor.primaryColor,
|
||||||
|
),
|
||||||
|
flexibleText: true,
|
||||||
|
minWidth: 100,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
maxLines: 1,
|
||||||
|
iconSpace: 4,
|
||||||
|
padding: const EdgeInsetsDirectional.symmetric(
|
||||||
|
vertical: 5,
|
||||||
|
horizontal: 8,
|
||||||
|
),
|
||||||
|
onTapActionCallback: () => onEditIdentityAction(identity),
|
||||||
|
),
|
||||||
|
TMailButtonWidget(
|
||||||
|
icon: imagePaths.icDeleteRule,
|
||||||
|
iconSize: 20,
|
||||||
|
text: AppLocalizations.of(context).delete,
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
iconColor: AppColor.primaryColor,
|
||||||
|
textStyle: ThemeUtils.textStyleInter500().copyWith(
|
||||||
|
fontSize: 13,
|
||||||
|
height: 1,
|
||||||
|
letterSpacing: 0.39,
|
||||||
|
color: AppColor.primaryColor,
|
||||||
|
),
|
||||||
|
minWidth: 100,
|
||||||
|
flexibleText: true,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
maxLines: 1,
|
||||||
|
iconSpace: 4,
|
||||||
|
padding: const EdgeInsetsDirectional.symmetric(
|
||||||
|
vertical: 5,
|
||||||
|
horizontal: 8,
|
||||||
|
),
|
||||||
|
onTapActionCallback: () => onDeleteIdentityAction(identity),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
import 'package:core/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
|
||||||
|
import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart';
|
||||||
|
import 'package:core/utils/platform_info.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
||||||
|
|
||||||
|
class SignatureBuilder extends StatelessWidget {
|
||||||
|
|
||||||
|
const SignatureBuilder({
|
||||||
|
Key? key,
|
||||||
|
required this.value,
|
||||||
|
this.height = 150,
|
||||||
|
this.width = 280,
|
||||||
|
this.scrollController,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final String value;
|
||||||
|
final double width;
|
||||||
|
final double height;
|
||||||
|
final ScrollController? scrollController;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (PlatformInfo.isWeb) {
|
||||||
|
return HtmlContentViewerOnWeb(
|
||||||
|
contentHtml: value,
|
||||||
|
widthContent: width,
|
||||||
|
heightContent: height,
|
||||||
|
contentPadding: 0,
|
||||||
|
viewMaxHeight: height,
|
||||||
|
htmlContentMinWidth: width,
|
||||||
|
htmlContentMinHeight: 0.0,
|
||||||
|
offsetHtmlContentHeight: 0.0,
|
||||||
|
allowResizeToDocumentSize: false,
|
||||||
|
direction: AppUtils.getCurrentDirection(context),
|
||||||
|
scrollController: scrollController,
|
||||||
|
keepAlive: true,
|
||||||
|
disableScrolling: true,
|
||||||
|
autoAdjustHeight: true,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return HtmlContentViewer(
|
||||||
|
contentHtml: value,
|
||||||
|
initialWidth: width,
|
||||||
|
maxViewHeight: height,
|
||||||
|
contentPadding: 0,
|
||||||
|
htmlContentMinHeight: 0.0,
|
||||||
|
offsetHtmlContentHeight: 0.0,
|
||||||
|
direction: AppUtils.getCurrentDirection(context),
|
||||||
|
keepAlive: true,
|
||||||
|
disableScrolling: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/state/transform_list_signature_state.dart';
|
||||||
|
|
||||||
|
class SignatureLoadingWidget extends StatelessWidget {
|
||||||
|
|
||||||
|
final Either<Failure, Success> signatureViewState;
|
||||||
|
|
||||||
|
const SignatureLoadingWidget({
|
||||||
|
super.key,
|
||||||
|
required this.signatureViewState,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return signatureViewState.fold(
|
||||||
|
(failure) => const SizedBox.shrink(),
|
||||||
|
(success) {
|
||||||
|
if (success is TransformListSignatureLoading) {
|
||||||
|
return const Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.all(8),
|
||||||
|
child: CupertinoActivityIndicator(color: AppColor.colorLoading),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,10 +6,10 @@ import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_
|
|||||||
import 'package:tmail_ui_user/features/manage_account/data/local/local_setting_cache_manager.dart';
|
import 'package:tmail_ui_user/features/manage_account/data/local/local_setting_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart';
|
import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/profiles_bindings.dart';
|
|
||||||
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
||||||
|
|
||||||
class ManageAccountDashBoardBindings extends BaseBindings {
|
class ManageAccountDashBoardBindings extends BaseBindings {
|
||||||
@@ -19,7 +19,7 @@ class ManageAccountDashBoardBindings extends BaseBindings {
|
|||||||
super.dependencies();
|
super.dependencies();
|
||||||
SettingsBindings().dependencies();
|
SettingsBindings().dependencies();
|
||||||
ManageAccountMenuBindings().dependencies();
|
ManageAccountMenuBindings().dependencies();
|
||||||
ProfileBindings().dependencies();
|
IdentityBindings().dependencies();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/ex
|
|||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/update_own_email_address_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/update_own_email_address_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forward_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forward_bindings.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
||||||
@@ -34,7 +35,6 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_
|
|||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/notification/bindings/notification_binding.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/notification/bindings/notification_binding.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/bindings/preferences_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/profiles_bindings.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_controller_bindings.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_controller_bindings.dart';
|
||||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
@@ -196,7 +196,7 @@ class ManageAccountDashBoardController extends ReloadableController {
|
|||||||
void _bindingControllerMenuItemView(AccountMenuItem item) {
|
void _bindingControllerMenuItemView(AccountMenuItem item) {
|
||||||
switch (item) {
|
switch (item) {
|
||||||
case AccountMenuItem.profiles:
|
case AccountMenuItem.profiles:
|
||||||
ProfileBindings().dependencies();
|
IdentityBindings().dependencies();
|
||||||
break;
|
break;
|
||||||
case AccountMenuItem.languageAndRegion:
|
case AccountMenuItem.languageAndRegion:
|
||||||
LanguageAndRegionBindings().dependencies();
|
LanguageAndRegionBindings().dependencies();
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/e
|
|||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/handle_profile_setting_action_type_click_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identities_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
||||||
@@ -18,7 +19,6 @@ import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_a
|
|||||||
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/profiles_view.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
|
|||||||
return Obx(() {
|
return Obx(() {
|
||||||
switch(controller.accountMenuItemSelected.value) {
|
switch(controller.accountMenuItemSelected.value) {
|
||||||
case AccountMenuItem.profiles:
|
case AccountMenuItem.profiles:
|
||||||
return ProfilesView(responsiveUtils: controller.responsiveUtils);
|
return const IdentitiesView();
|
||||||
case AccountMenuItem.languageAndRegion:
|
case AccountMenuItem.languageAndRegion:
|
||||||
if (controller.isLanguageSettingDisplayed) {
|
if (controller.isLanguageSettingDisplayed) {
|
||||||
return const LanguageAndRegionView();
|
return const LanguageAndRegionView();
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:get/get.dart';
|
|||||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identities_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/setting_app_bar.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/setting_app_bar.dart';
|
||||||
@@ -12,7 +13,6 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/account
|
|||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/notification/notification_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/notification/notification_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/profiles_view.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ class SettingsView extends GetWidget<SettingsController> {
|
|||||||
return Obx(() {
|
return Obx(() {
|
||||||
switch(controller.manageAccountDashboardController.accountMenuItemSelected.value) {
|
switch(controller.manageAccountDashboardController.accountMenuItemSelected.value) {
|
||||||
case AccountMenuItem.profiles:
|
case AccountMenuItem.profiles:
|
||||||
return ProfilesView(responsiveUtils: controller.responsiveUtils);
|
return const IdentitiesView();
|
||||||
case AccountMenuItem.languageAndRegion:
|
case AccountMenuItem.languageAndRegion:
|
||||||
if (controller.manageAccountDashboardController.isLanguageSettingDisplayed) {
|
if (controller.manageAccountDashboardController.isLanguageSettingDisplayed) {
|
||||||
return const LanguageAndRegionView();
|
return const LanguageAndRegionView();
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ enum AccountMenuItem {
|
|||||||
String getExplanation(AppLocalizations appLocalizations) {
|
String getExplanation(AppLocalizations appLocalizations) {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case AccountMenuItem.profiles:
|
case AccountMenuItem.profiles:
|
||||||
return appLocalizations.profilesSettingExplanation;
|
return appLocalizations.identitiesSettingExplanation;
|
||||||
case AccountMenuItem.languageAndRegion:
|
case AccountMenuItem.languageAndRegion:
|
||||||
return appLocalizations.languageSubtitle;
|
return appLocalizations.languageSubtitle;
|
||||||
case AccountMenuItem.emailRules:
|
case AccountMenuItem.emailRules:
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
|
|
||||||
import 'package:tmail_ui_user/features/base/mixin/popup_menu_widget_mixin.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_controller.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/identities_header_widget.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/identities_radio_list_builder.dart';
|
|
||||||
|
|
||||||
class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidgetMixin, AppLoaderMixin {
|
|
||||||
|
|
||||||
IdentitiesView({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Padding(
|
|
||||||
padding: SettingsUtils.getSettingContentPadding(
|
|
||||||
context,
|
|
||||||
controller.responsiveUtils,
|
|
||||||
),
|
|
||||||
child: controller.responsiveUtils.isWebDesktop(context)
|
|
||||||
? _buildIdentitiesViewWebDesktop(context)
|
|
||||||
: _buildIdentitiesViewMobile(context),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildIdentitiesViewMobile(BuildContext context) {
|
|
||||||
return Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
IdentitiesHeaderWidget(
|
|
||||||
onAddNewIdentityAction: () => controller.goToCreateNewIdentity(context),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 12),
|
|
||||||
IdentitiesRadioListBuilder(
|
|
||||||
controller: controller,
|
|
||||||
responsiveUtils: controller.responsiveUtils,
|
|
||||||
imagePaths: controller.imagePaths
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildIdentitiesViewWebDesktop(BuildContext context) {
|
|
||||||
return Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
SizedBox(
|
|
||||||
width: 224,
|
|
||||||
child: IdentitiesHeaderWidget(
|
|
||||||
onAddNewIdentityAction: () => controller.goToCreateNewIdentity(context),
|
|
||||||
)
|
|
||||||
),
|
|
||||||
const SizedBox(width: 12),
|
|
||||||
Expanded(child: IdentitiesRadioListBuilder(
|
|
||||||
controller: controller,
|
|
||||||
responsiveUtils: controller.responsiveUtils,
|
|
||||||
imagePaths: controller.imagePaths
|
|
||||||
)),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-52
@@ -1,52 +0,0 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
|
||||||
import 'package:core/presentation/resources/image_paths.dart';
|
|
||||||
import 'package:core/presentation/utils/theme_utils.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:tmail_ui_user/features/base/widget/material_text_icon_button.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
|
||||||
|
|
||||||
typedef OnAddNewIdentityAction = Function();
|
|
||||||
|
|
||||||
class IdentitiesHeaderWidget extends StatelessWidget {
|
|
||||||
|
|
||||||
const IdentitiesHeaderWidget({
|
|
||||||
Key? key,
|
|
||||||
required this.onAddNewIdentityAction,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
final OnAddNewIdentityAction onAddNewIdentityAction;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final imagePaths = Get.find<ImagePaths>();
|
|
||||||
|
|
||||||
return Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
AppLocalizations.of(context).identities,
|
|
||||||
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontSize: 17,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
color: Colors.black)),
|
|
||||||
const SizedBox(height: 4),
|
|
||||||
Text(
|
|
||||||
AppLocalizations.of(context).identitiesSettingExplanation,
|
|
||||||
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.normal,
|
|
||||||
color: AppColor.colorSettingExplanation)),
|
|
||||||
const SizedBox(height: 24),
|
|
||||||
MaterialTextIconButton(
|
|
||||||
key: const Key('button_add_identity'),
|
|
||||||
label: AppLocalizations.of(context).createNewIdentity,
|
|
||||||
icon: imagePaths.icAddIdentity,
|
|
||||||
iconSize: 28,
|
|
||||||
minimumSize: const Size(double.infinity, 44),
|
|
||||||
onTap: onAddNewIdentityAction
|
|
||||||
)
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-152
@@ -1,152 +0,0 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
|
||||||
import 'package:core/presentation/resources/image_paths.dart';
|
|
||||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
|
||||||
import 'package:fading_edge_scrollview/fading_edge_scrollview.dart';
|
|
||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:get/get_state_manager/get_state_manager.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/transform_html_signature_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_controller.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/identity_list_tile_builder.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/identity_loading_widget.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart';
|
|
||||||
|
|
||||||
class IdentitiesRadioListBuilder extends StatelessWidget {
|
|
||||||
|
|
||||||
final IdentitiesController controller;
|
|
||||||
final ResponsiveUtils responsiveUtils;
|
|
||||||
final ImagePaths imagePaths;
|
|
||||||
|
|
||||||
const IdentitiesRadioListBuilder({
|
|
||||||
Key? key,
|
|
||||||
required this.controller,
|
|
||||||
required this.responsiveUtils,
|
|
||||||
required this.imagePaths,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
height: responsiveUtils.isWebDesktop(context) ? 256 : null,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(color: AppColor.attachmentFileBorderColor),
|
|
||||||
borderRadius: const BorderRadius.all(Radius.circular(16.0)),
|
|
||||||
color: Colors.white
|
|
||||||
),
|
|
||||||
child: ClipRRect(
|
|
||||||
borderRadius: const BorderRadius.all(Radius.circular(16.0)),
|
|
||||||
child: Stack(
|
|
||||||
children: [
|
|
||||||
if (responsiveUtils.isWebDesktop(context))
|
|
||||||
_buildIdentityViewHorizontal(context)
|
|
||||||
else
|
|
||||||
_buildIdentityViewVertical(context),
|
|
||||||
Obx(() => Align(
|
|
||||||
alignment: AlignmentDirectional.topCenter,
|
|
||||||
child: IdentityLoadingWidget(
|
|
||||||
identityViewState: controller.viewState.value,
|
|
||||||
settingViewState: controller.accountDashBoardController.viewState.value
|
|
||||||
)
|
|
||||||
))
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildIdentityViewVertical(BuildContext context) {
|
|
||||||
return Obx(() => Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
if(controller.isSignatureShow)
|
|
||||||
...[
|
|
||||||
_buildListIdentityView(context),
|
|
||||||
Container(height: 1, color: AppColor.attachmentFileBorderColor),
|
|
||||||
Obx(() {
|
|
||||||
if (controller.isSignatureShow) {
|
|
||||||
return SignatureBuilder(controller.signatureSelected.value!);
|
|
||||||
} else {
|
|
||||||
return _buildLoadingView();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
]
|
|
||||||
else
|
|
||||||
_buildListIdentityView(context)
|
|
||||||
],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildIdentityViewHorizontal(BuildContext context) {
|
|
||||||
return Obx(() => Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
if (controller.isSignatureShow)
|
|
||||||
...[
|
|
||||||
_buildListIdentityView(context),
|
|
||||||
Container(width: 1, color: AppColor.attachmentFileBorderColor),
|
|
||||||
Expanded(child: Obx(() {
|
|
||||||
if (controller.signatureSelected.value != null) {
|
|
||||||
return SignatureBuilder(controller.signatureSelected.value!);
|
|
||||||
} else {
|
|
||||||
return _buildLoadingView();
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
]
|
|
||||||
else
|
|
||||||
Expanded(child: _buildListIdentityView(context))
|
|
||||||
],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildListIdentityView(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
key: const Key('identities_list'),
|
|
||||||
width: responsiveUtils.isWebDesktop(context) ? 320 : null,
|
|
||||||
height: 256,
|
|
||||||
padding: const EdgeInsets.only(left: 12, top: 12, bottom: 12),
|
|
||||||
child: Obx(() => FadingEdgeScrollView.fromScrollView(
|
|
||||||
gradientFractionOnStart: 0.3,
|
|
||||||
gradientFractionOnEnd: 0.3,
|
|
||||||
child: ListView.builder(
|
|
||||||
controller: ScrollController(),
|
|
||||||
padding: const EdgeInsets.only(right: 12.0),
|
|
||||||
itemCount: controller.listAllIdentities.length,
|
|
||||||
itemBuilder: ((context, index) {
|
|
||||||
return IdentityListTileBuilder(
|
|
||||||
imagePaths: imagePaths,
|
|
||||||
identity: controller.listAllIdentities[index],
|
|
||||||
identitySelected: controller.identitySelected.value,
|
|
||||||
onSelectIdentityAction: controller.selectIdentity,
|
|
||||||
onEditIdentityAction: (identitySelected) =>
|
|
||||||
controller.goToEditIdentity(context, identitySelected),
|
|
||||||
onDeleteIdentityAction: (identitySelected) =>
|
|
||||||
controller.openConfirmationDialogDeleteIdentityAction(context, identitySelected),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildLoadingView() {
|
|
||||||
return Obx(() => controller.viewState.value.fold(
|
|
||||||
(failure) => const SizedBox.shrink(),
|
|
||||||
(success) {
|
|
||||||
if (success is TransformHtmlSignatureLoading) {
|
|
||||||
return const Align(
|
|
||||||
alignment: Alignment.topCenter,
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.all(16),
|
|
||||||
child: SizedBox(
|
|
||||||
width: 30,
|
|
||||||
height: 30,
|
|
||||||
child: CupertinoActivityIndicator(color: AppColor.colorLoading)
|
|
||||||
))
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-163
@@ -1,163 +0,0 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
|
||||||
import 'package:core/presentation/resources/image_paths.dart';
|
|
||||||
import 'package:core/presentation/utils/theme_utils.dart';
|
|
||||||
import 'package:core/presentation/views/button/icon_button_web.dart';
|
|
||||||
import 'package:core/presentation/views/text/text_overflow_builder.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
|
||||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
|
||||||
import 'package:model/extensions/list_email_address_extension.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
|
||||||
|
|
||||||
typedef OnSelectIdentityAction = Function(Identity? identitySelected);
|
|
||||||
typedef OnEditIdentityAction = Function(Identity identitySelected);
|
|
||||||
typedef OnDeleteIdentityAction = Function(Identity identitySelected);
|
|
||||||
|
|
||||||
class IdentityListTileBuilder extends StatelessWidget {
|
|
||||||
|
|
||||||
const IdentityListTileBuilder({
|
|
||||||
Key? key,
|
|
||||||
required this.identity,
|
|
||||||
required this.identitySelected,
|
|
||||||
required this.imagePaths,
|
|
||||||
this.onSelectIdentityAction,
|
|
||||||
this.onEditIdentityAction,
|
|
||||||
this.onDeleteIdentityAction
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
final Identity identity;
|
|
||||||
final Identity? identitySelected;
|
|
||||||
final ImagePaths imagePaths;
|
|
||||||
final OnSelectIdentityAction? onSelectIdentityAction;
|
|
||||||
final OnEditIdentityAction? onEditIdentityAction;
|
|
||||||
final OnDeleteIdentityAction? onDeleteIdentityAction;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Material(
|
|
||||||
color: Colors.transparent,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 2),
|
|
||||||
child: InkWell(
|
|
||||||
borderRadius: BorderRadius.circular(12.0),
|
|
||||||
onTap: () => onSelectIdentityAction?.call(identity),
|
|
||||||
child: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(12.0),
|
|
||||||
color: _isIdentitySelected
|
|
||||||
? AppColor.colorItemSelected
|
|
||||||
: Colors.transparent,
|
|
||||||
),
|
|
||||||
padding: const EdgeInsets.all(12),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Radio<Identity>(
|
|
||||||
value: identity,
|
|
||||||
splashRadius: 15,
|
|
||||||
groupValue: identitySelected,
|
|
||||||
activeColor: AppColor.primaryColor,
|
|
||||||
onChanged: onSelectIdentityAction,
|
|
||||||
),
|
|
||||||
const SizedBox(width: 10),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 6),
|
|
||||||
child: TextOverflowBuilder(
|
|
||||||
(identity.name ?? ''),
|
|
||||||
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
fontSize: 16,
|
|
||||||
color: Colors.black)),
|
|
||||||
),
|
|
||||||
if (identity.email?.isNotEmpty == true)
|
|
||||||
_buildIconSVGWithTextLine(imagePaths.icEmail, identity.email),
|
|
||||||
if (identity.replyTo?.isNotEmpty == true)
|
|
||||||
_buildIconSVGWithTextLine(
|
|
||||||
imagePaths.icReplyTo,
|
|
||||||
identity.replyTo?.listEmailAddressToString(isFullEmailAddress: true)
|
|
||||||
),
|
|
||||||
if (identity.bcc?.isNotEmpty == true)
|
|
||||||
_buildIconCharacterWithTextLine(
|
|
||||||
AppLocalizations.of(context).bcc_email_address_prefix,
|
|
||||||
identity.bcc?.listEmailAddressToString(isFullEmailAddress: true)
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
),
|
|
||||||
if(_isIdentitySelected)
|
|
||||||
...[
|
|
||||||
buildSVGIconButton(
|
|
||||||
icon: imagePaths.icEditRule,
|
|
||||||
iconSize: 24,
|
|
||||||
iconColor: AppColor.primaryColor,
|
|
||||||
onTap: () => onEditIdentityAction?.call(identity),
|
|
||||||
),
|
|
||||||
buildSVGIconButton(
|
|
||||||
icon: imagePaths.icDeleteRule,
|
|
||||||
iconSize: 24,
|
|
||||||
iconColor: AppColor.colorDeletePermanentlyButton,
|
|
||||||
onTap: () => onDeleteIdentityAction?.call(identity),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildIconSVGWithTextLine(String imagePath, String? text) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 4),
|
|
||||||
child: Row(children: [
|
|
||||||
SizedBox(
|
|
||||||
width: 30,
|
|
||||||
child: Align(
|
|
||||||
alignment: Alignment.centerLeft,
|
|
||||||
child: SvgPicture.asset(imagePath, width: 15, height: 15))),
|
|
||||||
const SizedBox(width: 4),
|
|
||||||
Expanded(child: TextOverflowBuilder(
|
|
||||||
(text ?? ''),
|
|
||||||
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
color: AppColor.colorEmailAddressFull,
|
|
||||||
fontWeight: FontWeight.normal,
|
|
||||||
fontSize: 13,
|
|
||||||
),
|
|
||||||
))
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildIconCharacterWithTextLine(String character, String? text) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 4),
|
|
||||||
child: Row(children: [
|
|
||||||
Container(
|
|
||||||
width: 30,
|
|
||||||
alignment: Alignment.centerLeft,
|
|
||||||
child: Text(
|
|
||||||
character,
|
|
||||||
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.normal,
|
|
||||||
decoration: TextDecoration.underline,
|
|
||||||
color: AppColor.colorTextButton))),
|
|
||||||
const SizedBox(width: 4),
|
|
||||||
Expanded(child: TextOverflowBuilder(
|
|
||||||
(text ?? ''),
|
|
||||||
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
color: AppColor.colorEmailAddressFull,
|
|
||||||
fontWeight: FontWeight.normal,
|
|
||||||
fontSize: 13,
|
|
||||||
),
|
|
||||||
))
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool get _isIdentitySelected => identity.id == identitySelected?.id;
|
|
||||||
}
|
|
||||||
-45
@@ -1,45 +0,0 @@
|
|||||||
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:tmail_ui_user/features/base/widget/circle_loading_widget.dart';
|
|
||||||
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
|
||||||
|
|
||||||
class IdentityLoadingWidget extends StatelessWidget {
|
|
||||||
|
|
||||||
final Either<Failure, Success> identityViewState;
|
|
||||||
final Either<Failure, Success> settingViewState;
|
|
||||||
|
|
||||||
const IdentityLoadingWidget({
|
|
||||||
super.key,
|
|
||||||
required this.identityViewState,
|
|
||||||
required this.settingViewState
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return settingViewState.fold(
|
|
||||||
(failure) => identityViewState.fold(
|
|
||||||
(failure) => const SizedBox.shrink(),
|
|
||||||
(success) {
|
|
||||||
if (success is GetAllIdentitiesLoading || success is GetSessionLoading) {
|
|
||||||
return const CircleLoadingWidget(margin: EdgeInsets.all(16.0));
|
|
||||||
} else {
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
),
|
|
||||||
(success) => identityViewState.fold(
|
|
||||||
(failure) => const SizedBox.shrink(),
|
|
||||||
(success) {
|
|
||||||
if (success is GetAllIdentitiesLoading || success is GetSessionLoading) {
|
|
||||||
return const CircleLoadingWidget(margin: EdgeInsets.all(16.0));
|
|
||||||
} else {
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
import 'package:core/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
|
|
||||||
import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart';
|
|
||||||
import 'package:core/utils/platform_info.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
|
||||||
|
|
||||||
class SignatureBuilder extends StatelessWidget {
|
|
||||||
|
|
||||||
const SignatureBuilder(
|
|
||||||
this.signatureSelected, {
|
|
||||||
Key? key,
|
|
||||||
this.width,
|
|
||||||
this.height = 256
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
final String signatureSelected;
|
|
||||||
final double? width;
|
|
||||||
final double height;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return LayoutBuilder(
|
|
||||||
builder: (context, constraints) {
|
|
||||||
final signatureWidth = width ?? constraints.biggest.width;
|
|
||||||
final signatureHeight = height;
|
|
||||||
return Container(
|
|
||||||
width: signatureWidth,
|
|
||||||
color: Colors.white,
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 16.0),
|
|
||||||
child: _buildSignature(context, signatureWidth, signatureHeight),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildSignature(BuildContext context, double width, double height) {
|
|
||||||
if (signatureSelected.isNotEmpty) {
|
|
||||||
if (PlatformInfo.isWeb) {
|
|
||||||
return HtmlContentViewerOnWeb(
|
|
||||||
contentHtml: signatureSelected,
|
|
||||||
widthContent: width,
|
|
||||||
heightContent: height,
|
|
||||||
allowResizeToDocumentSize: false,
|
|
||||||
direction: AppUtils.getCurrentDirection(context),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return LayoutBuilder(builder: (context, constraints) {
|
|
||||||
return HtmlContentViewer(
|
|
||||||
contentHtml: signatureSelected,
|
|
||||||
initialWidth: constraints.maxWidth,
|
|
||||||
direction: AppUtils.getCurrentDirection(context),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return SizedBox(width: width, height: height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_bindings.dart';
|
|
||||||
|
|
||||||
class ProfileBindings extends Bindings {
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dependencies() {
|
|
||||||
IdentityBindings().dependencies();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
|
|
||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
|
||||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_view.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_header_widget.dart';
|
|
||||||
|
|
||||||
class ProfilesView extends StatelessWidget {
|
|
||||||
|
|
||||||
final ResponsiveUtils responsiveUtils;
|
|
||||||
|
|
||||||
const ProfilesView({
|
|
||||||
Key? key,
|
|
||||||
required this.responsiveUtils,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return SettingDetailViewBuilder(
|
|
||||||
responsiveUtils: responsiveUtils,
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
if (responsiveUtils.isWebDesktop(context))
|
|
||||||
...[
|
|
||||||
const SettingHeaderWidget(menuItem: AccountMenuItem.profiles),
|
|
||||||
const Divider(height: 1, color: AppColor.colorDividerHeaderSetting),
|
|
||||||
],
|
|
||||||
Expanded(child: SingleChildScrollView(
|
|
||||||
physics: const ClampingScrollPhysics(),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
IdentitiesView()
|
|
||||||
]
|
|
||||||
)
|
|
||||||
))
|
|
||||||
]
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,18 +8,21 @@ class SettingExplanationWidget extends StatelessWidget {
|
|||||||
final AccountMenuItem menuItem;
|
final AccountMenuItem menuItem;
|
||||||
final EdgeInsetsGeometry? padding;
|
final EdgeInsetsGeometry? padding;
|
||||||
final bool isCenter;
|
final bool isCenter;
|
||||||
|
final TextAlign? textAlign;
|
||||||
|
|
||||||
const SettingExplanationWidget({
|
const SettingExplanationWidget({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.menuItem,
|
required this.menuItem,
|
||||||
this.isCenter = false,
|
this.isCenter = false,
|
||||||
this.padding,
|
this.padding,
|
||||||
|
this.textAlign,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Widget child = Text(
|
Widget child = Text(
|
||||||
menuItem.getExplanation(AppLocalizations.of(context)),
|
menuItem.getExplanation(AppLocalizations.of(context)),
|
||||||
|
textAlign: textAlign,
|
||||||
style: ThemeUtils.textStyleM3BodyMedium1
|
style: ThemeUtils.textStyleM3BodyMedium1
|
||||||
.copyWith(color: AppColor.gray424244.withValues(alpha: 0.64)),
|
.copyWith(color: AppColor.gray424244.withValues(alpha: 0.64)),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ class SettingHeaderWidget extends StatelessWidget {
|
|||||||
style: textStyle ?? ThemeUtils.textStyleInter600().copyWith(
|
style: textStyle ?? ThemeUtils.textStyleInter600().copyWith(
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
),
|
),
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
if (menuItem.getExplanation(appLocalizations).isNotEmpty)
|
if (menuItem.getExplanation(appLocalizations).isNotEmpty)
|
||||||
Padding(
|
Padding(
|
||||||
@@ -38,6 +40,8 @@ class SettingHeaderWidget extends StatelessWidget {
|
|||||||
letterSpacing: -0.15,
|
letterSpacing: -0.15,
|
||||||
color: AppColor.gray424244.withValues(alpha: 0.64),
|
color: AppColor.gray424244.withValues(alpha: 0.64),
|
||||||
),
|
),
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
@@ -46,6 +50,7 @@ class SettingHeaderWidget extends StatelessWidget {
|
|||||||
? children.first
|
? children.first
|
||||||
: Column(
|
: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: children,
|
children: children,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na
|
|||||||
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
|
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/create_public_asset_interactor.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/usecase/create_public_asset_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/delete_public_assets_interactor.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/usecase/delete_public_assets_interactor.dart';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/utils/identity_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
final identityUtils = IdentityUtils();
|
final identityUtils = IdentityUtils();
|
||||||
|
|||||||
+6
-6
@@ -29,9 +29,9 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_defau
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_html_signature_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/transform_list_signature_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identities_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_controller.dart';
|
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/add_identity_to_public_assets_interactor.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/usecase/add_identity_to_public_assets_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/clean_up_public_assets_interactor.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/usecase/clean_up_public_assets_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/delete_public_assets_interactor.dart';
|
import 'package:tmail_ui_user/features/public_asset/domain/usecase/delete_public_assets_interactor.dart';
|
||||||
@@ -80,7 +80,7 @@ const fallbackGenerators = {
|
|||||||
MockSpec<EditIdentityInteractor>(),
|
MockSpec<EditIdentityInteractor>(),
|
||||||
MockSpec<CreateNewDefaultIdentityInteractor>(),
|
MockSpec<CreateNewDefaultIdentityInteractor>(),
|
||||||
MockSpec<EditDefaultIdentityInteractor>(),
|
MockSpec<EditDefaultIdentityInteractor>(),
|
||||||
MockSpec<TransformHtmlSignatureInteractor>(),
|
MockSpec<TransformListSignatureInteractor>(),
|
||||||
MockSpec<ManageAccountDashBoardController>(fallbackGenerators: fallbackGenerators),
|
MockSpec<ManageAccountDashBoardController>(fallbackGenerators: fallbackGenerators),
|
||||||
MockSpec<SaveIdentityCacheOnWebInteractor>(),
|
MockSpec<SaveIdentityCacheOnWebInteractor>(),
|
||||||
MockSpec<BeforeReconnectManager>(),
|
MockSpec<BeforeReconnectManager>(),
|
||||||
@@ -95,7 +95,7 @@ void main() {
|
|||||||
late MockEditIdentityInteractor mockEditIdentityInteractor;
|
late MockEditIdentityInteractor mockEditIdentityInteractor;
|
||||||
late MockCreateNewDefaultIdentityInteractor mockCreateNewDefaultIdentityInteractor;
|
late MockCreateNewDefaultIdentityInteractor mockCreateNewDefaultIdentityInteractor;
|
||||||
late MockEditDefaultIdentityInteractor mockEditDefaultIdentityInteractor;
|
late MockEditDefaultIdentityInteractor mockEditDefaultIdentityInteractor;
|
||||||
late MockTransformHtmlSignatureInteractor mockTransformHtmlSignatureInteractor;
|
late MockTransformListSignatureInteractor mockTransformListSignatureInteractor;
|
||||||
late MockManageAccountDashBoardController mockManageAccountDashBoardController;
|
late MockManageAccountDashBoardController mockManageAccountDashBoardController;
|
||||||
|
|
||||||
late MockCachingManager mockCachingManager;
|
late MockCachingManager mockCachingManager;
|
||||||
@@ -165,7 +165,7 @@ void main() {
|
|||||||
mockEditIdentityInteractor = MockEditIdentityInteractor();
|
mockEditIdentityInteractor = MockEditIdentityInteractor();
|
||||||
mockCreateNewDefaultIdentityInteractor = MockCreateNewDefaultIdentityInteractor();
|
mockCreateNewDefaultIdentityInteractor = MockCreateNewDefaultIdentityInteractor();
|
||||||
mockEditDefaultIdentityInteractor = MockEditDefaultIdentityInteractor();
|
mockEditDefaultIdentityInteractor = MockEditDefaultIdentityInteractor();
|
||||||
mockTransformHtmlSignatureInteractor = MockTransformHtmlSignatureInteractor();
|
mockTransformListSignatureInteractor = MockTransformListSignatureInteractor();
|
||||||
|
|
||||||
mockManageAccountDashBoardController = MockManageAccountDashBoardController();
|
mockManageAccountDashBoardController = MockManageAccountDashBoardController();
|
||||||
Get.put<BeforeReconnectManager>(MockBeforeReconnectManager());
|
Get.put<BeforeReconnectManager>(MockBeforeReconnectManager());
|
||||||
@@ -181,7 +181,7 @@ void main() {
|
|||||||
mockEditIdentityInteractor,
|
mockEditIdentityInteractor,
|
||||||
mockCreateNewDefaultIdentityInteractor,
|
mockCreateNewDefaultIdentityInteractor,
|
||||||
mockEditDefaultIdentityInteractor,
|
mockEditDefaultIdentityInteractor,
|
||||||
mockTransformHtmlSignatureInteractor,
|
mockTransformListSignatureInteractor,
|
||||||
mockSaveIdentityCacheOnWebInteractor);
|
mockSaveIdentityCacheOnWebInteractor);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user