TF-1581 Update UI to support language RTL

This commit is contained in:
dab246
2023-03-10 13:05:00 +07:00
committed by Dat Vu
parent 42bde0e415
commit 9af4924b9a
44 changed files with 821 additions and 392 deletions
@@ -26,6 +26,7 @@ class ButtonBuilder {
double? _maxWidth; double? _maxWidth;
EdgeInsets? _padding; EdgeInsets? _padding;
String? _tooltip; String? _tooltip;
BoxConstraints? _constraints;
void key(Key key) { void key(Key key) {
_key = key; _key = key;
@@ -84,6 +85,10 @@ class ButtonBuilder {
_tooltip = message; _tooltip = message;
} }
void addBoxConstraints(BoxConstraints? constraints) {
_constraints = constraints;
}
ButtonBuilder(this._icon); ButtonBuilder(this._icon);
void onPressActionClick(OnPressActionClick onPressActionClick) { void onPressActionClick(OnPressActionClick onPressActionClick) {
@@ -122,6 +127,7 @@ class ButtonBuilder {
color: _decoration == null ? _colorButton : null, color: _decoration == null ? _colorButton : null,
decoration: _decoration, decoration: _decoration,
width: _maxWidth, width: _maxWidth,
constraints: _constraints,
padding: _padding ?? EdgeInsets.zero, padding: _padding ?? EdgeInsets.zero,
child: _buildBody() child: _buildBody()
), ),
@@ -58,6 +58,7 @@ class TreeViewChild {
final List<Widget> children; final List<Widget> children;
final VoidCallback? onTap; final VoidCallback? onTap;
final EdgeInsets? paddingChild; final EdgeInsets? paddingChild;
final bool isDirectionRTL;
TreeViewChild( TreeViewChild(
this.context, this.context,
@@ -67,6 +68,7 @@ class TreeViewChild {
this.isExpanded, this.isExpanded,
this.onTap, this.onTap,
this.paddingChild, this.paddingChild,
this.isDirectionRTL = false,
Key? key, Key? key,
} }
); );
@@ -90,7 +92,10 @@ class TreeViewChild {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: children children: children
.map((child) => Padding( .map((child) => Padding(
padding: paddingChild ?? const EdgeInsets.only(left: 20), padding: paddingChild ?? EdgeInsets.only(
left: isDirectionRTL ? 0 : 20,
right: isDirectionRTL ? 20 : 0,
),
child: child child: child
)) ))
.toList() .toList()
@@ -89,6 +89,7 @@ class QuickSearchInputForm<T, R> extends FormField<String> {
bool hideSuggestionsBox = false, bool hideSuggestionsBox = false,
BoxDecoration? decoration, BoxDecoration? decoration,
double? maxHeight, double? maxHeight,
bool isDirectionRTL = false,
}) : assert( }) : assert(
initialValue == null || textFieldConfiguration.controller == null), initialValue == null || textFieldConfiguration.controller == null),
assert(minCharsForSuggestions >= 0), assert(minCharsForSuggestions >= 0),
@@ -152,6 +153,7 @@ class QuickSearchInputForm<T, R> extends FormField<String> {
hideSuggestionsBox: hideSuggestionsBox, hideSuggestionsBox: hideSuggestionsBox,
decoration: decoration, decoration: decoration,
maxHeight: maxHeight, maxHeight: maxHeight,
isDirectionRTL: isDirectionRTL,
); );
}); });
@@ -519,6 +521,8 @@ class TypeAheadFieldQuickSearch<T, R> extends StatefulWidget {
/// Max height search input /// Max height search input
final double? maxHeight; final double? maxHeight;
final bool isDirectionRTL;
/// Creates a [TypeAheadFieldQuickSearch] /// Creates a [TypeAheadFieldQuickSearch]
const TypeAheadFieldQuickSearch( const TypeAheadFieldQuickSearch(
{Key? key, {Key? key,
@@ -560,6 +564,7 @@ class TypeAheadFieldQuickSearch<T, R> extends StatefulWidget {
this.hideSuggestionsBox = false, this.hideSuggestionsBox = false,
this.decoration, this.decoration,
this.maxHeight, this.maxHeight,
this.isDirectionRTL = false,
}) : assert(animationStart >= 0.0 && animationStart <= 1.0), }) : assert(animationStart >= 0.0 && animationStart <= 1.0),
assert( assert(
direction == AxisDirection.down || direction == AxisDirection.up), direction == AxisDirection.down || direction == AxisDirection.up),
@@ -748,6 +753,7 @@ class _TypeAheadFieldQuickSearchState<T, R> extends State<TypeAheadFieldQuickSea
}, },
listActionPadding: widget.listActionPadding, listActionPadding: widget.listActionPadding,
hideSuggestionsBox: widget.hideSuggestionsBox, hideSuggestionsBox: widget.hideSuggestionsBox,
isDirectionRTL: widget.isDirectionRTL,
); );
double w = _suggestionsBox!.textBoxWidth; double w = _suggestionsBox!.textBoxWidth;
@@ -899,6 +905,7 @@ class _SuggestionsList<T, R> extends StatefulWidget {
final RecentSelectionCallback<R>? onRecentSelected; final RecentSelectionCallback<R>? onRecentSelected;
final EdgeInsets? listActionPadding; final EdgeInsets? listActionPadding;
final bool hideSuggestionsBox; final bool hideSuggestionsBox;
final bool isDirectionRTL;
const _SuggestionsList({ const _SuggestionsList({
required this.suggestionsBox, required this.suggestionsBox,
@@ -932,6 +939,7 @@ class _SuggestionsList<T, R> extends StatefulWidget {
this.onRecentSelected, this.onRecentSelected,
this.listActionPadding, this.listActionPadding,
this.hideSuggestionsBox = false, this.hideSuggestionsBox = false,
this.isDirectionRTL = false,
}); });
@override @override
@@ -1174,7 +1182,11 @@ class _SuggestionsListState<T, R> extends State<_SuggestionsList<T, R>>
children: widget.listActionButton!.map((dynamic action) { children: widget.listActionButton!.map((dynamic action) {
if (widget.actionButtonBuilder != null) { if (widget.actionButtonBuilder != null) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8, bottom: kIsWeb ? 8 : 0), padding: EdgeInsets.only(
right: widget.isDirectionRTL ? 0 : 8,
left: widget.isDirectionRTL ? 8 : 0,
bottom: kIsWeb ? 8 : 0
),
child: InkWell( child: InkWell(
borderRadius: const BorderRadius.all(Radius.circular(10)), borderRadius: const BorderRadius.all(Radius.circular(10)),
onTap: () { onTap: () {
@@ -1255,7 +1267,11 @@ class _SuggestionsListState<T, R> extends State<_SuggestionsList<T, R>>
children: widget.listActionButton!.map((dynamic action) { children: widget.listActionButton!.map((dynamic action) {
if (widget.actionButtonBuilder != null) { if (widget.actionButtonBuilder != null) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8, bottom: kIsWeb ? 8 : 0), padding: EdgeInsets.only(
right: widget.isDirectionRTL ? 0 : 8,
left: widget.isDirectionRTL ? 8 : 0,
bottom: kIsWeb ? 8 : 0
),
child: InkWell( child: InkWell(
borderRadius: const BorderRadius.all(Radius.circular(10)), borderRadius: const BorderRadius.all(Radius.circular(10)),
onTap: () { onTap: () {
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/upload/presentation/extensions/list_uploa
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart'; import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ComposerView extends GetWidget<ComposerController> class ComposerView extends GetWidget<ComposerController>
with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin { with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin {
@@ -271,7 +272,8 @@ class ComposerView extends GetWidget<ComposerController>
Widget _buildFromEmailAddress(BuildContext context) { Widget _buildFromEmailAddress(BuildContext context) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: responsiveUtils.isMobile(context) ? 16 : 0, left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
top: 12, top: 12,
bottom: 12), bottom: 12),
child: Row(children: [ child: Row(children: [
@@ -324,7 +326,10 @@ class ComposerView extends GetWidget<ComposerController>
), ),
), ),
Expanded(child: Padding( Expanded(child: Padding(
padding: const EdgeInsets.only(right: 8, left: 12), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 12 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 12
),
child: Text( child: Text(
controller.identitySelected.value?.email ?? '', controller.identitySelected.value?.email ?? '',
maxLines: 1, maxLines: 1,
@@ -339,7 +344,10 @@ class ComposerView extends GetWidget<ComposerController>
return Column( return Column(
children: [ children: [
Obx(() => Padding( Obx(() => Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
),
child: (EmailAddressInputBuilder(context, imagePaths, child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.to, PrefixEmailAddress.to,
controller.listToEmailAddress, controller.listToEmailAddress,
@@ -362,7 +370,10 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()), : const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true
? Padding( ? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
),
child: (EmailAddressInputBuilder(context, imagePaths, child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.cc, PrefixEmailAddress.cc,
controller.listCcEmailAddress, controller.listCcEmailAddress,
@@ -384,7 +395,10 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()), : const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true
? Padding( ? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
),
child: (EmailAddressInputBuilder(context, imagePaths, child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.bcc, PrefixEmailAddress.bcc,
controller.listBccEmailAddress, controller.listBccEmailAddress,
@@ -410,7 +424,10 @@ class ComposerView extends GetWidget<ComposerController>
return Row( return Row(
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(right: 8), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0
),
child: Text( child: Text(
'${AppLocalizations.of(context).subject_email}:', '${AppLocalizations.of(context).subject_email}:',
style: const TextStyle( style: const TextStyle(
@@ -478,7 +495,10 @@ class ComposerView extends GetWidget<ComposerController>
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
child: Column(children: [ child: Column(children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 16), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
left: AppUtils.isDirectionRTL(context) ? 0 : 16
),
child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [
Padding(padding: const EdgeInsets.only(top: 20), Padding(padding: const EdgeInsets.only(top: 20),
child: (AvatarBuilder() child: (AvatarBuilder()
@@ -498,13 +518,22 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()), : const SizedBox.shrink()),
_buildEmailAddress(context), _buildEmailAddress(context),
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
Padding(padding: const EdgeInsets.only(right: 16), child: _buildSubjectEmail(context)), Padding(
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
),
child: _buildSubjectEmail(context)
),
]), ]),
)) ))
])), ])),
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
Padding( Padding(
padding: const EdgeInsets.only(left: 60, right: 25), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 25 : 60,
right: AppUtils.isDirectionRTL(context) ? 60 : 25,
),
child: Column(children: [ child: Column(children: [
_buildAttachmentsWidget(context), _buildAttachmentsWidget(context),
buildInlineLoadingView(controller), buildInlineLoadingView(controller),
@@ -662,7 +691,10 @@ class ComposerView extends GetWidget<ComposerController>
itemCount: uploadFilesState.length, itemCount: uploadFilesState.length,
itemBuilder: (context, index) => AttachmentFileComposerBuilder( itemBuilder: (context, index) => AttachmentFileComposerBuilder(
uploadFilesState[index], uploadFilesState[index],
itemMargin: const EdgeInsets.only(right: 8), itemMargin: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
),
maxWidth: _getMaxWidthItemListAttachment(context, constraints), maxWidth: _getMaxWidthItemListAttachment(context, constraints),
onDeleteAttachmentAction: (attachment) => onDeleteAttachmentAction: (attachment) =>
controller.deleteAttachmentUploaded(attachment.uploadTaskId)) controller.deleteAttachmentUploaded(attachment.uploadTaskId))
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/upload/presentation/extensions/list_uploa
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart'; import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ComposerView extends GetWidget<ComposerController> class ComposerView extends GetWidget<ComposerController>
with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin { with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin {
@@ -76,56 +77,111 @@ class ComposerView extends GetWidget<ComposerController>
desktop: Obx(() { desktop: Obx(() {
return Stack(children: [ return Stack(children: [
if (controller.screenDisplayMode.value == ScreenDisplayMode.normal) if (controller.screenDisplayMode.value == ScreenDisplayMode.normal)
Positioned(right: 5, bottom: 5, child: Card( if (AppUtils.isDirectionRTL(context))
Positioned(left: 5, bottom: 5, child: Card(
elevation: 20, elevation: 20,
color: Colors.transparent, color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(24))), shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(24))),
child: Container( child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(24))), decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(24))),
width: responsiveUtils.getSizeScreenWidth(context) * 0.5, width: responsiveUtils.getSizeScreenWidth(context) * 0.5,
height: responsiveUtils.getSizeScreenHeight(context) * 0.75, height: responsiveUtils.getSizeScreenHeight(context) * 0.75,
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(24)), borderRadius: const BorderRadius.all(Radius.circular(24)),
child: LayoutBuilder(builder: (context, constraints) => child: LayoutBuilder(builder: (context, constraints) =>
PointerInterceptor(child: _buildBodyForDesktop(context, constraints))) PointerInterceptor(child: _buildBodyForDesktop(context, constraints))
) )
)
) )
)), ))
else
Positioned(right: 5, bottom: 5, child: Card(
elevation: 20,
color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(24))),
child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(24))),
width: responsiveUtils.getSizeScreenWidth(context) * 0.5,
height: responsiveUtils.getSizeScreenHeight(context) * 0.75,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(24)),
child: LayoutBuilder(builder: (context, constraints) =>
PointerInterceptor(child: _buildBodyForDesktop(context, constraints))
)
)
)
)),
if (controller.screenDisplayMode.value == ScreenDisplayMode.minimize) if (controller.screenDisplayMode.value == ScreenDisplayMode.minimize)
Positioned(right: 5, bottom: 5, child: Card( if (AppUtils.isDirectionRTL(context))
Positioned(left: 5, bottom: 5, child: Card(
elevation: 20, elevation: 20,
color: Colors.transparent, color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))), shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))),
child: Container( child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(16))), decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(16))),
width: 500, width: 500,
height: 50, height: 50,
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)), borderRadius: const BorderRadius.all(Radius.circular(16)),
child: PointerInterceptor(child: Row(children: [ child: PointerInterceptor(child: Row(children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 10), padding: const EdgeInsets.only(left: 10),
child: buildIconWeb( child: buildIconWeb(
icon: SvgPicture.asset(imagePaths.icCloseMailbox, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icCloseMailbox, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).saveAndClose, tooltip: AppLocalizations.of(context).saveAndClose,
onTap: () => controller.saveEmailAsDrafts(context) onTap: () => controller.saveEmailAsDrafts(context)
)), )),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(imagePaths.icFullScreenComposer, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icFullScreenComposer, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).fullscreen, tooltip: AppLocalizations.of(context).fullscreen,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.fullScreen)), onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.fullScreen)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(imagePaths.icChevronUp, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icChevronUp, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).show, tooltip: AppLocalizations.of(context).show,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.normal)), onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.normal)),
Expanded(child: Padding( Expanded(child: Padding(
padding: const EdgeInsets.only(left: 16, right: 80), padding: const EdgeInsets.only(left: 16, right: 80),
child: _buildTitleComposer(context), child: _buildTitleComposer(context),
)), )),
])) ]))
) )
) )
)), ))
else
Positioned(right: 5, bottom: 5, child: Card(
elevation: 20,
color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))),
child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(16))),
width: 500,
height: 50,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)),
child: PointerInterceptor(child: Row(children: [
Padding(
padding: const EdgeInsets.only(left: 10),
child: buildIconWeb(
icon: SvgPicture.asset(imagePaths.icCloseMailbox, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).saveAndClose,
onTap: () => controller.saveEmailAsDrafts(context)
)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icFullScreenComposer, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).fullscreen,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.fullScreen)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icChevronUp, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).show,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.normal)),
Expanded(child: Padding(
padding: const EdgeInsets.only(left: 16, right: 80),
child: _buildTitleComposer(context),
)),
]))
)
)
)),
if (controller.screenDisplayMode.value == ScreenDisplayMode.fullScreen) if (controller.screenDisplayMode.value == ScreenDisplayMode.fullScreen)
Scaffold( Scaffold(
backgroundColor: Colors.black38, backgroundColor: Colors.black38,
@@ -326,7 +382,10 @@ class ComposerView extends GetWidget<ComposerController>
Padding(padding: const EdgeInsets.only(left: 20, right: 20, top: 8), child: _buildAppBar(context)), Padding(padding: const EdgeInsets.only(left: 20, right: 20, top: 8), child: _buildAppBar(context)),
const Padding(padding: EdgeInsets.only(top: 8), child: Divider(color: AppColor.colorDividerComposer, height: 1)), const Padding(padding: EdgeInsets.only(top: 8), child: Divider(color: AppColor.colorDividerComposer, height: 1)),
Padding( Padding(
padding: const EdgeInsets.only(left: 16), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [
Padding(padding: const EdgeInsets.only(top: 20), Padding(padding: const EdgeInsets.only(top: 20),
child: (AvatarBuilder() child: (AvatarBuilder()
@@ -336,7 +395,10 @@ class ComposerView extends GetWidget<ComposerController>
..backgroundColor(AppColor.colorAvatar)) ..backgroundColor(AppColor.colorAvatar))
.build()), .build()),
Expanded(child: Padding( Expanded(child: Padding(
padding: const EdgeInsets.only(left: 12), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: Column(children: [ child: Column(children: [
Obx(() => controller.identitySelected.value != null Obx(() => controller.identitySelected.value != null
? _buildFromEmailAddress(context) ? _buildFromEmailAddress(context)
@@ -346,7 +408,13 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()), : const SizedBox.shrink()),
_buildEmailAddress(context, constraints), _buildEmailAddress(context, constraints),
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
Padding(padding: const EdgeInsets.only(right: 16), child: _buildSubjectEmail(context)), Padding(
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
),
child: _buildSubjectEmail(context)
),
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
_buildListButton(context, constraints), _buildListButton(context, constraints),
]), ]),
@@ -355,8 +423,9 @@ class ComposerView extends GetWidget<ComposerController>
const Divider(color: AppColor.colorDividerComposer, height: 1), const Divider(color: AppColor.colorDividerComposer, height: 1),
Expanded(child: Padding( Expanded(child: Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: responsiveUtils.isMobile(context) ? 16 : 60, left: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 25 : responsiveUtils.isMobile(context) ? 16 : 60,
right: responsiveUtils.isMobile(context) ? 16 : 25), right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 60 : responsiveUtils.isMobile(context) ? 16 : 25,
),
child: Column( child: Column(
children: [ children: [
_buildAttachmentsWidget(context), _buildAttachmentsWidget(context),
@@ -384,7 +453,8 @@ class ComposerView extends GetWidget<ComposerController>
Widget _buildFromEmailAddress(BuildContext context) { Widget _buildFromEmailAddress(BuildContext context) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: responsiveUtils.isMobile(context) ? 16 : 0, left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
top: 12, top: 12,
bottom: 12), bottom: 12),
child: Row(children: [ child: Row(children: [
@@ -447,7 +517,10 @@ class ComposerView extends GetWidget<ComposerController>
), ),
), ),
Expanded(child: Padding( Expanded(child: Padding(
padding: const EdgeInsets.only(right: 8, left: 12), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 12 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 12,
),
child: Text( child: Text(
controller.identitySelected.value?.email ?? '', controller.identitySelected.value?.email ?? '',
maxLines: 1, maxLines: 1,
@@ -471,7 +544,10 @@ class ComposerView extends GetWidget<ComposerController>
child: Column( child: Column(
children: [ children: [
Obx(() => Padding( Obx(() => Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0
),
child: (EmailAddressInputBuilder(context, imagePaths, child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.to, PrefixEmailAddress.to,
controller.listToEmailAddress, controller.listToEmailAddress,
@@ -495,8 +571,11 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()), : const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true
? Padding( ? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), padding: EdgeInsets.only(
child: (EmailAddressInputBuilder(context, imagePaths, left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0
),
child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.cc, PrefixEmailAddress.cc,
controller.listCcEmailAddress, controller.listCcEmailAddress,
controller.listEmailAddressType, controller.listEmailAddressType,
@@ -518,7 +597,10 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()), : const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true
? Padding( ? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0
),
child: (EmailAddressInputBuilder(context, imagePaths, child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.bcc, PrefixEmailAddress.bcc,
controller.listBccEmailAddress, controller.listBccEmailAddress,
@@ -547,7 +629,11 @@ class ComposerView extends GetWidget<ComposerController>
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(right: 8, top: 16), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
top: 16
),
child: Text( child: Text(
'${AppLocalizations.of(context).subject_email}:', '${AppLocalizations.of(context).subject_email}:',
style: const TextStyle( style: const TextStyle(
@@ -572,7 +658,11 @@ class ComposerView extends GetWidget<ComposerController>
Widget _buildListButton(BuildContext context, BoxConstraints constraints) { Widget _buildListButton(BuildContext context, BoxConstraints constraints) {
return Transform( return Transform(
transform: Matrix4.translationValues(-5.0, 0.0, 0.0), transform: Matrix4.translationValues(
AppUtils.isDirectionRTL(context) ? 0.0 : -5.0,
0.0,
0.0
),
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 5), padding: const EdgeInsets.symmetric(vertical: 5),
child: Row(children: [ child: Row(children: [
@@ -740,10 +830,10 @@ class ComposerView extends GetWidget<ComposerController>
return Column(children: [ return Column(children: [
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 4, top: 4,
bottom: 4, bottom: 4,
left: responsiveUtils.isMobile(context) ? 16 : 20, left: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16: 0 : responsiveUtils.isMobile(context) ? 16 : 20,
right: responsiveUtils.isMobile(context) ? 16: 0), right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 20 : responsiveUtils.isMobile(context) ? 16: 0),
child: _buildAttachmentsTitle( child: _buildAttachmentsTitle(
context, context,
attachments, attachments,
@@ -810,7 +900,10 @@ class ComposerView extends GetWidget<ComposerController>
itemCount: uploadFilesState.length, itemCount: uploadFilesState.length,
itemBuilder: (context, index) => AttachmentFileComposerBuilder( itemBuilder: (context, index) => AttachmentFileComposerBuilder(
uploadFilesState[index], uploadFilesState[index],
itemMargin: const EdgeInsets.only(right: 8), itemMargin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0
),
maxWidth: _getMaxWidthItemListAttachment(context, constraints), maxWidth: _getMaxWidthItemListAttachment(context, constraints),
onDeleteAttachmentAction: (attachment) => onDeleteAttachmentAction: (attachment) =>
controller.deleteAttachmentUploaded(attachment.uploadTaskId)) controller.deleteAttachmentUploaded(attachment.uploadTaskId))
@@ -8,6 +8,7 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart'; import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_status.dart'; import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_status.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnDeleteAttachmentAction = void Function(UploadFileState fileState); typedef OnDeleteAttachmentAction = void Function(UploadFileState fileState);
@@ -51,9 +52,11 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
hoverColor: AppColor.primaryColor, hoverColor: AppColor.primaryColor,
onTap: () {}, onTap: () {},
leading: Padding( leading: Padding(
padding: const EdgeInsets.only( padding: EdgeInsets.only(
left: 8, left: AppUtils.isDirectionRTL(context) ? 0 : 8,
bottom: BuildUtils.isWeb ? 6 : 14), right: AppUtils.isDirectionRTL(context) ? 8 : 0,
bottom: BuildUtils.isWeb ? 6 : 14
),
child: SvgPicture.asset( child: SvgPicture.asset(
fileState.getIcon(_imagePaths), fileState.getIcon(_imagePaths),
width: 40, width: 40,
@@ -62,11 +65,14 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
), ),
title: Transform( title: Transform(
transform: Matrix4.translationValues( transform: Matrix4.translationValues(
BuildUtils.isWeb ? 0.0 : -8.0, AppUtils.isDirectionRTL(context) ? 0.0 : BuildUtils.isWeb ? 0.0 : -8.0,
BuildUtils.isWeb ? -8.0 : -10.0, BuildUtils.isWeb ? -8.0 : -10.0,
0.0), 0.0),
child: Padding( child: Padding(
padding: const EdgeInsets.only(right: BuildUtils.isWeb ? 20 : 16), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : BuildUtils.isWeb ? 20 : 16,
left: AppUtils.isDirectionRTL(context) ? BuildUtils.isWeb ? 20 : 16 : 0
),
child: Text( child: Text(
fileState.fileName, fileState.fileName,
maxLines: 1, maxLines: 1,
@@ -82,7 +88,7 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
subtitle: fileState.fileSize != 0 subtitle: fileState.fileSize != 0
? Transform( ? Transform(
transform: Matrix4.translationValues( transform: Matrix4.translationValues(
BuildUtils.isWeb ? 0.0 : -8.0, AppUtils.isDirectionRTL(context) ? 0.0 : BuildUtils.isWeb ? 0.0 : -8.0,
BuildUtils.isWeb ? -8.0 : -10.0, BuildUtils.isWeb ? -8.0 : -10.0,
0.0), 0.0),
child: Text( child: Text(
@@ -96,19 +102,34 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
color: AppColor.colorContentEmail))) color: AppColor.colorContentEmail)))
: null, : null,
), ),
Positioned( if (AppUtils.isDirectionRTL(context))
right: BuildUtils.isWeb ? -5 : -12, Positioned(
top: BuildUtils.isWeb ? -5 : -12, left: BuildUtils.isWeb ? -5 : -12,
child: buildIconWeb( top: BuildUtils.isWeb ? -5 : -12,
icon: SvgPicture.asset(_imagePaths.icDeleteAttachment, fit: BoxFit.fill), child: buildIconWeb(
tooltip: AppLocalizations.of(context).delete, icon: SvgPicture.asset(_imagePaths.icDeleteAttachment, fit: BoxFit.fill),
onTap: () { tooltip: AppLocalizations.of(context).delete,
if (onDeleteAttachmentAction != null) { onTap: () {
onDeleteAttachmentAction!.call(fileState); if (onDeleteAttachmentAction != null) {
onDeleteAttachmentAction!.call(fileState);
}
} }
} )
) )
), else
Positioned(
right: BuildUtils.isWeb ? -5 : -12,
top: BuildUtils.isWeb ? -5 : -12,
child: buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDeleteAttachment, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).delete,
onTap: () {
if (onDeleteAttachmentAction != null) {
onDeleteAttachmentAction!.call(fileState);
}
}
)
),
Align(alignment: Alignment.bottomCenter, child: _progressLoading), Align(alignment: Alignment.bottomCenter, child: _progressLoading),
]), ]),
) )
@@ -174,7 +174,6 @@ class ContactController extends BaseController {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onSelectedContactCallback?.call(emailAddress); onSelectedContactCallback?.call(emailAddress);
} else { } else {
popBack(result: emailAddress); popBack(result: emailAddress);
@@ -186,7 +185,6 @@ class ContactController extends BaseController {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onDismissContactView?.call(); onDismissContactView?.call();
} else { } else {
popBack(); popBack();
@@ -426,7 +426,6 @@ class DestinationPickerController extends BaseMailboxController {
} }
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onSelectedMailboxCallback?.call(mailboxDestination.value); onSelectedMailboxCallback?.call(mailboxDestination.value);
} else { } else {
popBack(result: mailboxDestination.value); popBack(result: mailboxDestination.value);
@@ -475,7 +474,6 @@ class DestinationPickerController extends BaseMailboxController {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onDismissDestinationPicker?.call(); onDismissDestinationPicker?.call();
} else { } else {
popBack(); popBack();
@@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_fold
import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/create_mailbox_name_input_decoration_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/create_mailbox_name_input_decoration_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class DestinationPickerView extends GetWidget<DestinationPickerController> class DestinationPickerView extends GetWidget<DestinationPickerController>
with AppLoaderMixin, with AppLoaderMixin,
@@ -368,8 +369,12 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
return TreeViewChild( return TreeViewChild(
context, context,
key: const Key('children_tree_mailbox_child'), key: const Key('children_tree_mailbox_child'),
isDirectionRTL: AppUtils.isDirectionRTL(context),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 14), paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 14,
right: AppUtils.isDirectionRTL(context) ? 14 : 0,
),
parent: (MailBoxFolderTileBuilder( parent: (MailBoxFolderTileBuilder(
context, context,
_imagePaths, _imagePaths,
@@ -481,7 +486,10 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
if (actions == MailboxActions.select && (mailboxIdSelected == null || if (actions == MailboxActions.select && (mailboxIdSelected == null ||
mailboxIdSelected == PresentationMailbox.unifiedMailbox.id)) mailboxIdSelected == PresentationMailbox.unifiedMailbox.id))
Padding( Padding(
padding: const EdgeInsets.only(right: 30.0), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 30.0,
left: AppUtils.isDirectionRTL(context) ? 30 : 0.0,
),
child: SvgPicture.asset( child: SvgPicture.asset(
_imagePaths.icFilterSelected, _imagePaths.icFilterSelected,
width: 20, width: 20,
@@ -535,7 +543,12 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
padding: const EdgeInsets.symmetric(vertical: 16), padding: const EdgeInsets.symmetric(vertical: 16),
child: Row( child: Row(
children: [ children: [
Padding(padding: const EdgeInsets.only(left: 5), child: buildIconWeb( Padding(
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 5,
right: AppUtils.isDirectionRTL(context) ? 5 : 0,
),
child: buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icBack, _imagePaths.icBack,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
@@ -549,7 +562,10 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
hasBackButton: false, hasBackButton: false,
hasSearchButton: true) hasSearchButton: true)
..addPadding(EdgeInsets.zero) ..addPadding(EdgeInsets.zero)
..setMargin(const EdgeInsets.only(right: 16)) ..setMargin(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
))
..addDecoration(BoxDecoration(borderRadius: BorderRadius.circular(12), color: AppColor.colorBgSearchBar)) ..addDecoration(BoxDecoration(borderRadius: BorderRadius.circular(12), color: AppColor.colorBgSearchBar))
..addIconClearText(SvgPicture.asset(_imagePaths.icClearTextSearch, width: 18, height: 18, fit: BoxFit.fill)) ..addIconClearText(SvgPicture.asset(_imagePaths.icClearTextSearch, width: 18, height: 18, fit: BoxFit.fill))
..setHintText(AppLocalizations.of(context).hint_search_mailboxes) ..setHintText(AppLocalizations.of(context).hint_search_mailboxes)
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_ma
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/features/search/mailbox/presentation/utils/search_mailbox_utils.dart'; import 'package:tmail_ui_user/features/search/mailbox/presentation/utils/search_mailbox_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget { class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget {
@@ -64,7 +65,7 @@ class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget {
] ]
) )
)), )),
_buildSelectedIcon() _buildSelectedIcon(context)
] ]
), ),
) )
@@ -132,12 +133,15 @@ class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget {
} }
} }
Widget _buildSelectedIcon() { Widget _buildSelectedIcon(BuildContext context) {
if (_presentationMailbox.id == mailboxIdAlreadySelected && if (_presentationMailbox.id == mailboxIdAlreadySelected &&
(mailboxActions == MailboxActions.select || (mailboxActions == MailboxActions.select ||
mailboxActions == MailboxActions.create)) { mailboxActions == MailboxActions.create)) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: SvgPicture.asset( child: SvgPicture.asset(
_imagePaths.icFilterSelected, _imagePaths.icFilterSelected,
width: 20, width: 20,
@@ -7,6 +7,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_screen_type.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_screen_type.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnCreateNewMailboxAction = Function(); typedef OnCreateNewMailboxAction = Function();
typedef OnOpenCreateNewMailboxScreenAction = Function(); typedef OnOpenCreateNewMailboxScreenAction = Function();
@@ -61,7 +62,10 @@ class TopBarDestinationPickerBuilder extends StatelessWidget {
fontWeight: FontWeight.w700))), fontWeight: FontWeight.w700))),
if (_destinationScreenType == DestinationScreenType.destinationPicker) if (_destinationScreenType == DestinationScreenType.destinationPicker)
Padding( Padding(
padding: const EdgeInsets.only(left: 8.0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: Align( child: Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: buildIconWeb( child: buildIconWeb(
@@ -76,7 +80,10 @@ class TopBarDestinationPickerBuilder extends StatelessWidget {
) )
else else
Padding( Padding(
padding: const EdgeInsets.only(left: 8.0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: Align( child: Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Material( child: Material(
+50 -12
View File
@@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/information_se
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/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class EmailView extends GetWidget<SingleEmailController> { class EmailView extends GetWidget<SingleEmailController> {
@@ -81,7 +82,12 @@ class EmailView extends GetWidget<SingleEmailController> {
EdgeInsets _getMarginEmailView(BuildContext context) { EdgeInsets _getMarginEmailView(BuildContext context) {
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
if (responsiveUtils.isDesktop(context)) { if (responsiveUtils.isDesktop(context)) {
return const EdgeInsets.only(right: 16, top: 16, bottom: 16); return EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
top: 16,
bottom: 16
);
} else { } else {
return const EdgeInsets.symmetric(vertical: 16); return const EdgeInsets.symmetric(vertical: 16);
} }
@@ -278,8 +284,13 @@ class EmailView extends GetWidget<SingleEmailController> {
_buildAttachments(context), _buildAttachments(context),
if (BuildUtils.isWeb) if (BuildUtils.isWeb)
Expanded(child: Padding( Expanded(child: Padding(
padding: const EdgeInsets.only(left: 16, bottom: 16), padding: EdgeInsets.only(
child: _buildEmailContent(context, constraints, email))) left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
bottom: 16
),
child: _buildEmailContent(context, constraints, email)
))
else else
Padding( Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
@@ -477,10 +488,19 @@ class EmailView extends GetWidget<SingleEmailController> {
AppLocalizations.of(context).mark_as_unread, AppLocalizations.of(context).mark_as_unread,
email, email,
iconLeftPadding: responsiveUtils.isMobile(context) iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? EdgeInsets.only(
: const EdgeInsets.only(right: 12), left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16,
)
: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
),
iconRightPadding: responsiveUtils.isMobile(context) iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
)
: EdgeInsets.zero) : EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction( ..onActionClick((email) => controller.handleEmailAction(
context, context,
@@ -507,10 +527,19 @@ class EmailView extends GetWidget<SingleEmailController> {
: AppLocalizations.of(context).mark_as_spam, : AppLocalizations.of(context).mark_as_spam,
email, email,
iconLeftPadding: responsiveUtils.isMobile(context) iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? EdgeInsets.only(
: const EdgeInsets.only(right: 12), left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16,
)
: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
),
iconRightPadding: responsiveUtils.isMobile(context) iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
)
: EdgeInsets.zero) : EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction( ..onActionClick((email) => controller.handleEmailAction(
context, context,
@@ -532,10 +561,19 @@ class EmailView extends GetWidget<SingleEmailController> {
AppLocalizations.of(context).quickCreatingRule, AppLocalizations.of(context).quickCreatingRule,
email, email,
iconLeftPadding: responsiveUtils.isMobile(context) iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16) ? EdgeInsets.only(
: const EdgeInsets.only(right: 12), left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16,
)
: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
),
iconRightPadding: responsiveUtils.isMobile(context) iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12) ? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
)
: EdgeInsets.zero) : EdgeInsets.zero)
..onActionClick((email) => controller.quickCreatingRule(context, email.from!.first))) ..onActionClick((email) => controller.quickCreatingRule(context, email.from!.first)))
.build(); .build();
@@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnBackActionClick = void Function(); typedef OnBackActionClick = void Function();
typedef OnEmailActionClick = void Function(PresentationEmail, EmailActionType); typedef OnEmailActionClick = void Function(PresentationEmail, EmailActionType);
@@ -66,7 +67,10 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
fit: BoxFit.fill), fit: BoxFit.fill),
if (!isSearchIsRunning) if (!isSearchIsRunning)
Container( Container(
margin: const EdgeInsets.only(left: 8), margin: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
constraints: BoxConstraints( constraints: BoxConstraints(
maxWidth: _responsiveUtils.getSizeScreenWidth(context) - 250), maxWidth: _responsiveUtils.getSizeScreenWidth(context) - 250),
child: Text( child: Text(
@@ -100,6 +100,7 @@ class IdentityCreatorController extends BaseController {
@override @override
void onInit() { void onInit() {
log('IdentityCreatorController::onInit():');
super.onInit(); super.onInit();
keyboardRichTextController = RichTextController(); keyboardRichTextController = RichTextController();
richTextWebController = RichTextWebController(); richTextWebController = RichTextWebController();
@@ -340,7 +341,6 @@ class IdentityCreatorController extends BaseController {
); );
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedIdentityCallback?.call(identityRequest); onCreatedIdentityCallback?.call(identityRequest);
} else { } else {
popBack(result: identityRequest); popBack(result: identityRequest);
@@ -352,7 +352,6 @@ class IdentityCreatorController extends BaseController {
isDefaultIdentity: isDefaultIdentity.value); isDefaultIdentity: isDefaultIdentity.value);
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedIdentityCallback?.call(identityRequest); onCreatedIdentityCallback?.call(identityRequest);
} else { } else {
popBack(result: identityRequest); popBack(result: identityRequest);
@@ -426,7 +425,6 @@ class IdentityCreatorController extends BaseController {
void closeView(BuildContext context) { void closeView(BuildContext context) {
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onDismissIdentityCreator?.call(); onDismissIdentityCreator?.call();
} else { } else {
popBack(); popBack();
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/set
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/model/identity_action_type.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class IdentityCreatorView extends GetWidget<IdentityCreatorController> { class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
@@ -475,12 +476,20 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
}), }),
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsets.only(top: 24.0, bottom: 12.0, left: 12.0), padding: EdgeInsets.only(
top: 24.0,
bottom: 12.0,
left: AppUtils.isDirectionRTL(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 0
),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(right: 12.0), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? 12 : 0
),
child: buildTextButton( child: buildTextButton(
AppLocalizations.of(context).cancel, AppLocalizations.of(context).cancel,
textStyle: const TextStyle( textStyle: const TextStyle(
@@ -3,6 +3,7 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnCheckboxChanged = void Function(); typedef OnCheckboxChanged = void Function();
@@ -43,7 +44,10 @@ class SetDefaultIdentityCheckboxBuilder extends StatelessWidget {
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.only(left: 8.0), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: Text( child: Text(
AppLocalizations.of(context).setDefaultIdentity, AppLocalizations.of(context).setDefaultIdentity,
style: const TextStyle( style: const TextStyle(
@@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_fold
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart';
import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart'; import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxView extends GetWidget<MailboxController> class MailboxView extends GetWidget<MailboxController>
with MailboxWidgetMixin, with MailboxWidgetMixin,
@@ -101,8 +102,11 @@ class MailboxView extends GetWidget<MailboxController>
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 10), padding: EdgeInsets.only(
child: _buildCloseScreenButton(context)), left: AppUtils.isDirectionRTL(context) ? 0 : 10,
right: AppUtils.isDirectionRTL(context) ? 19 : 0,
),
child: _buildCloseScreenButton(context)),
SizedBox(width: controller.isSelectionEnabled() ? 49 : 40), SizedBox(width: controller.isSelectionEnabled() ? 49 : 40),
Expanded(child: Text( Expanded(child: Text(
AppLocalizations.of(context).folders, AppLocalizations.of(context).folders,
@@ -147,8 +151,8 @@ class MailboxView extends GetWidget<MailboxController>
return Column(children: [ return Column(children: [
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 16, left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 16,
right: 16), right: AppUtils.isDirectionRTL(context) ?_responsiveUtils.isLandscapeMobile(context) ? 0 : 16 : 16),
child: UserInformationWidgetBuilder( child: UserInformationWidgetBuilder(
_imagePaths, _imagePaths,
controller.mailboxDashBoardController.userProfile.value, controller.mailboxDashBoardController.userProfile.value,
@@ -203,44 +207,45 @@ class MailboxView extends GetWidget<MailboxController>
const SizedBox(height: 12), const SizedBox(height: 12),
Container( Container(
margin: EdgeInsets.only( margin: EdgeInsets.only(
left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 8, left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
right: 16), right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 0 : 8 : 16),
padding: const EdgeInsets.only(left: 8), padding: EdgeInsets.only(
child: Row( left: AppUtils.isDirectionRTL(context) ? 0 : 8,
mainAxisAlignment: MainAxisAlignment.spaceBetween, right: AppUtils.isDirectionRTL(context) ? 8 : 0,
children: [ ),
Text(AppLocalizations.of(context).mailBoxes, child: Row(
style: const TextStyle( mainAxisAlignment: MainAxisAlignment.spaceBetween,
fontSize: 20, children: [
color: Colors.black, Text(AppLocalizations.of(context).mailBoxes,
fontWeight: FontWeight.bold)), style: const TextStyle(
Row( fontSize: 20,
children: [ color: Colors.black,
buildIconWeb( fontWeight: FontWeight.bold)),
minSize: 40, Row(children: [
iconPadding: EdgeInsets.zero, buildIconWeb(
icon: SvgPicture.asset( minSize: 40,
_imagePaths.icSearchBar, iconPadding: EdgeInsets.zero,
colorFilter: AppColor.colorTextButton.asFilter(), icon: SvgPicture.asset(
fit: BoxFit.fill _imagePaths.icSearchBar,
), colorFilter: AppColor.colorTextButton.asFilter(),
tooltip: AppLocalizations.of(context).searchForMailboxes, fit: BoxFit.fill
onTap: () => controller.openSearchViewAction(context) ),
), tooltip: AppLocalizations.of(context).searchForMailboxes,
buildIconWeb( onTap: () => controller.openSearchViewAction(context)
minSize: 40,
iconSize: 20,
iconPadding: EdgeInsets.zero,
splashRadius: 15,
icon: SvgPicture.asset(
_imagePaths.icAddNewFolder,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).new_mailbox,
onTap: () => controller.goToCreateNewMailboxView(context)),
],
), ),
buildIconWeb(
minSize: 40,
iconSize: 20,
iconPadding: EdgeInsets.zero,
splashRadius: 15,
icon: SvgPicture.asset(
_imagePaths.icAddNewFolder,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).new_mailbox,
onTap: () => controller.goToCreateNewMailboxView(context)),
]), ]),
]),
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Obx(() { Obx(() {
@@ -274,8 +279,8 @@ class MailboxView extends GetWidget<MailboxController>
Widget _buildHeaderMailboxCategory(BuildContext context, MailboxCategories categories) { Widget _buildHeaderMailboxCategory(BuildContext context, MailboxCategories categories) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
right: _responsiveUtils.isLandscapeMobile(context) ? 8 : 28, right: AppUtils.isDirectionRTL(context) ? 4 : _responsiveUtils.isLandscapeMobile(context) ? 8 : 28,
left: 4), left: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 8 : 28 : 4),
child: Row(children: [ child: Row(children: [
buildIconWeb( buildIconWeb(
minSize: 40, minSize: 40,
@@ -302,9 +307,13 @@ class MailboxView extends GetWidget<MailboxController>
return Container( return Container(
margin: EdgeInsets.only( margin: EdgeInsets.only(
left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 8, left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
right: 16), right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 0 : 8 : 16
padding: const EdgeInsets.only(left: 12), ),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: TreeView( child: TreeView(
key: Key('${categories.keyValue}_mailbox_list'), key: Key('${categories.keyValue}_mailbox_list'),
children: _buildListChildTileWidget(context, mailboxNode, lastNode: lastNode))); children: _buildListChildTileWidget(context, mailboxNode, lastNode: lastNode)));
@@ -332,7 +341,11 @@ class MailboxView extends GetWidget<MailboxController>
context, context,
key: const Key('children_tree_mailbox_child'), key: const Key('children_tree_mailbox_child'),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 14), isDirectionRTL: AppUtils.isDirectionRTL(context),
paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 14,
right: AppUtils.isDirectionRTL(context) ? 14 : 0,
),
parent: Obx(() => (MailBoxFolderTileBuilder( parent: Obx(() => (MailBoxFolderTileBuilder(
context, context,
_imagePaths, _imagePaths,
@@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/ap
import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart'; import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxView extends GetWidget<MailboxController> class MailboxView extends GetWidget<MailboxController>
with AppLoaderMixin, with AppLoaderMixin,
@@ -39,8 +40,7 @@ class MailboxView extends GetWidget<MailboxController>
height: 0.5, height: 0.5,
thickness: 0.2), thickness: 0.2),
Expanded(child: Container( Expanded(child: Container(
padding: EdgeInsets.only( padding: _getViewPadding(context),
left: _responsiveUtils.isDesktop(context) ? 16 : 0),
color: _responsiveUtils.isDesktop(context) color: _responsiveUtils.isDesktop(context)
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
@@ -61,13 +61,23 @@ class MailboxView extends GetWidget<MailboxController>
); );
} }
EdgeInsets _getViewPadding(BuildContext context) {
if (AppUtils.isDirectionRTL(context)) {
return EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0);
} else {
return EdgeInsets.only(left: _responsiveUtils.isDesktop(context) ? 16 : 0);
}
}
Widget _buildLogoApp(BuildContext context) { Widget _buildLogoApp(BuildContext context) {
return Container( return Container(
color: Colors.white, color: Colors.white,
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: _responsiveUtils.isDesktop(context) ? 25 : 16, top: _responsiveUtils.isDesktop(context) ? 25 : 16,
bottom: _responsiveUtils.isDesktop(context) ? 25 : 16, bottom: _responsiveUtils.isDesktop(context) ? 25 : 16,
left: _responsiveUtils.isDesktop(context) ? 32 : 16), left: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 32 : 16,
right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 32 : 16 : 0
),
child: Row(children: [ child: Row(children: [
(SloganBuilder(arrangedByHorizontal: true) (SloganBuilder(arrangedByHorizontal: true)
..setSloganText(AppLocalizations.of(context).app_name) ..setSloganText(AppLocalizations.of(context).app_name)
@@ -102,7 +112,10 @@ class MailboxView extends GetWidget<MailboxController>
controller: controller.mailboxListScrollController, controller: controller.mailboxListScrollController,
key: const PageStorageKey('mailbox_list'), key: const PageStorageKey('mailbox_list'),
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 16 : 0,
left: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 16 : 0 : 0
),
child: Column(children: [ child: Column(children: [
if (!_responsiveUtils.isDesktop(context)) if (!_responsiveUtils.isDesktop(context))
_buildUserInformation(context), _buildUserInformation(context),
@@ -131,7 +144,8 @@ class MailboxView extends GetWidget<MailboxController>
const SizedBox(height: 13), const SizedBox(height: 13),
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: _responsiveUtils.isDesktop(context) ? 0 : 12, left: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 0 : 12 : 0,
bottom: 8 bottom: 8
), ),
child: Row( child: Row(
@@ -143,7 +157,10 @@ class MailboxView extends GetWidget<MailboxController>
color: Colors.black, color: Colors.black,
fontWeight: FontWeight.bold)), fontWeight: FontWeight.bold)),
Padding( Padding(
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 0 : 12), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 0 : 12 : 0,
),
child: Row( child: Row(
children: [ children: [
buildIconWeb( buildIconWeb(
@@ -293,8 +310,12 @@ class MailboxView extends GetWidget<MailboxController>
return TreeViewChild( return TreeViewChild(
context, context,
key: const Key('children_tree_mailbox_child'), key: const Key('children_tree_mailbox_child'),
isDirectionRTL: AppUtils.isDirectionRTL(context),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 14), paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 14,
right: AppUtils.isDirectionRTL(context) ? 14 : 0,
),
parent: Obx(() => (MailBoxFolderTileBuilder( parent: Obx(() => (MailBoxFolderTileBuilder(
context, context,
_imagePaths, _imagePaths,
@@ -1,71 +0,0 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
typedef OnOpenMailboxNewFolderActionClick = void Function();
class MailboxNewFolderTileBuilder {
String? _icon;
String? _name;
OnOpenMailboxNewFolderActionClick? _onOpenMailboxFolderActionClick;
MailboxNewFolderTileBuilder();
void addIcon(String icon) {
_icon = icon;
}
void addName(String name) {
_name = name;
}
void onOpenMailboxFolderAction(OnOpenMailboxNewFolderActionClick onOpenMailboxFolderActionClick) {
_onOpenMailboxFolderActionClick = onOpenMailboxFolderActionClick;
}
Widget build() {
return Theme(
data: ThemeData(
splashColor: Colors.transparent,
highlightColor: Colors.transparent),
child: Container(
key: const Key('mailbox_new_folder_tile'),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
color: AppColor.mailboxBackgroundColor),
child: MediaQuery(
data: const MediaQueryData(padding: EdgeInsets.zero),
child: ListTile(
contentPadding: EdgeInsets.zero,
onTap: () => {
if (_onOpenMailboxFolderActionClick != null) {
_onOpenMailboxFolderActionClick!()
}
},
leading: Padding(
padding: const EdgeInsets.only(left: 34),
child: _icon != null
? SvgPicture.asset(
_icon!,
width: 24,
height: 24,
colorFilter: AppColor.mailboxIconColor.asFilter(),
fit: BoxFit.fill)
: const SizedBox.shrink()),
title: Padding(
padding: const EdgeInsets.only(left: 8),
child: Text(
_name ?? '',
maxLines: 1,
style: const TextStyle(fontSize: 15, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold),
)),
)
)
)
);
}
}
@@ -17,6 +17,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displa
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailBoxFolderTileBuilder { class MailBoxFolderTileBuilder {
@@ -82,15 +83,15 @@ class MailBoxFolderTileBuilder {
Widget build() { Widget build() {
if (responsiveUtils?.isWebDesktop(_context) == true && mailboxDisplayed == MailboxDisplayed.mailbox) { if (responsiveUtils?.isWebDesktop(_context) == true && mailboxDisplayed == MailboxDisplayed.mailbox) {
return DragTarget<List<PresentationEmail>>( return DragTarget<List<PresentationEmail>>(
builder: (_, __, ___) => _buildMailboxItem(), builder: (_, __, ___) => _buildMailboxItem(_context),
onAccept: (emails) => _onDragItemAccepted?.call(emails, _mailboxNode.item), onAccept: (emails) => _onDragItemAccepted?.call(emails, _mailboxNode.item),
); );
} else { } else {
return _buildMailboxItem(); return _buildMailboxItem(_context);
} }
} }
Widget _buildMailboxItem() { Widget _buildMailboxItem(BuildContext context) {
if (mailboxDisplayed == MailboxDisplayed.mailbox) { if (mailboxDisplayed == MailboxDisplayed.mailbox) {
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
return StatefulBuilder( return StatefulBuilder(
@@ -108,11 +109,11 @@ class MailBoxFolderTileBuilder {
? CrossAxisAlignment.start ? CrossAxisAlignment.start
: CrossAxisAlignment.center, : CrossAxisAlignment.center,
children: [ children: [
_buildLeadingMailboxItem(), _buildLeadingMailboxItem(context),
const SizedBox(width: 4), const SizedBox(width: 4),
Expanded(child: _buildTitleFolderItem()), Expanded(child: _buildTitleFolderItem()),
const SizedBox(width: 8), const SizedBox(width: 8),
_buildTrailingItemForMailboxView() _buildTrailingItemForMailboxView(context)
]) ])
), ),
); );
@@ -141,12 +142,12 @@ class MailBoxFolderTileBuilder {
? CrossAxisAlignment.start ? CrossAxisAlignment.start
: CrossAxisAlignment.center, : CrossAxisAlignment.center,
children: [ children: [
_buildLeadingMailboxItem(), _buildLeadingMailboxItem(context),
const SizedBox(width: 8), const SizedBox(width: 8),
Expanded(child: _buildTitleFolderItem()), Expanded(child: _buildTitleFolderItem()),
_buildSelectedIcon(), _buildSelectedIcon(),
const SizedBox(width: 8), const SizedBox(width: 8),
_buildTrailingItemForMailboxView() _buildTrailingItemForMailboxView(context)
]), ]),
] ]
), ),
@@ -171,7 +172,7 @@ class MailBoxFolderTileBuilder {
? AppColor.colorItemSelected ? AppColor.colorItemSelected
: Colors.transparent, : Colors.transparent,
child: Row(children: [ child: Row(children: [
_buildLeadingMailboxItem(), _buildLeadingMailboxItem(context),
const SizedBox(width: 8), const SizedBox(width: 8),
Expanded(child: _buildTitleFolderItem()), Expanded(child: _buildTitleFolderItem()),
_buildSelectedIcon() _buildSelectedIcon()
@@ -184,7 +185,7 @@ class MailBoxFolderTileBuilder {
} }
} }
Widget _buildLeadingMailboxItem() { Widget _buildLeadingMailboxItem(BuildContext context) {
return Row(children: [ return Row(children: [
if (_mailboxNode.hasChildren()) if (_mailboxNode.hasChildren())
Row(children: [ Row(children: [
@@ -211,20 +212,27 @@ class MailBoxFolderTileBuilder {
else else
const SizedBox(width: 32), const SizedBox(width: 32),
Transform( Transform(
transform: Matrix4.translationValues(-4.0, 0.0, 0.0), transform: Matrix4.translationValues(
AppUtils.isDirectionRTL(context) ? 0.0 : -4.0,
0.0,
0.0
),
child: _buildLeadingIcon() child: _buildLeadingIcon()
), ),
]); ]);
} }
Widget _buildTrailingItemForMailboxView() { Widget _buildTrailingItemForMailboxView(BuildContext context) {
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
if (isHoverItem) { if (isHoverItem) {
return _buildMenuIcon(); return _buildMenuIcon(context);
} else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty } else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty
&& _mailboxNode.item.matchCountingRules()) { && _mailboxNode.item.matchCountingRules()) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 10), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 10,
left: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
child: _buildCounter(), child: _buildCounter(),
); );
} else { } else {
@@ -233,7 +241,10 @@ class MailBoxFolderTileBuilder {
} else { } else {
if (_mailboxNode.hasChildren()) { if (_mailboxNode.hasChildren()) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 12), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: Row( child: Row(
children: [ children: [
if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty
@@ -245,7 +256,10 @@ class MailBoxFolderTileBuilder {
} else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty } else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty
&& _mailboxNode.item.matchCountingRules()) { && _mailboxNode.item.matchCountingRules()) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 12), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: _buildCounter(), child: _buildCounter(),
); );
} else { } else {
@@ -328,9 +342,12 @@ class MailBoxFolderTileBuilder {
fit: BoxFit.fill); fit: BoxFit.fill);
} }
Widget _buildMenuIcon() { Widget _buildMenuIcon(BuildContext context) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: InkWell( child: InkWell(
onTapDown: (detail) { onTapDown: (detail) {
final screenSize = MediaQuery.of(_context).size; final screenSize = MediaQuery.of(_context).size;
@@ -1,11 +1,15 @@
import 'package:core/core.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/image/avatar_builder.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get_utils/src/platform/platform.dart'; import 'package:get/get_utils/src/platform/platform.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnSubtitleClick = void Function(); typedef OnSubtitleClick = void Function();
@@ -49,7 +53,11 @@ class UserInformationWidgetBuilder extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: titlePadding ?? const EdgeInsets.only(left: 16, top: 10), padding: titlePadding ?? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 10
),
child: Text( child: Text(
_userProfile != null ? '${_userProfile?.email}' : '', _userProfile != null ? '${_userProfile?.email}' : '',
maxLines: 1, maxLines: 1,
@@ -60,7 +68,10 @@ class UserInformationWidgetBuilder extends StatelessWidget {
), ),
subtitle != null subtitle != null
? Padding( ? Padding(
padding: const EdgeInsets.only(left: 10), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 10,
right: AppUtils.isDirectionRTL(context) ? 10 : 0
),
child: Material( child: Material(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
color: Colors.transparent, color: Colors.transparent,
@@ -80,10 +91,14 @@ class UserInformationWidgetBuilder extends StatelessWidget {
])), ])),
if (!kIsWeb) if (!kIsWeb)
Transform( Transform(
transform: Matrix4.translationValues(14.0, 0.0, 0.0), transform: Matrix4.translationValues(
AppUtils.isDirectionRTL(context) ? -14.0 : 14.0,
0.0,
0.0
),
child: IconButton( child: IconButton(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePaths.icCollapseFolder, AppUtils.isDirectionRTL(context) ? _imagePaths.icBack : _imagePaths.icCollapseFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
colorFilter: AppColor.colorCollapseMailbox.asFilter()), colorFilter: AppColor.colorCollapseMailbox.asFilter()),
onPressed: () => {})) onPressed: () => {}))
@@ -205,7 +205,6 @@ class MailboxCreatorController extends BaseController {
mailboxLocation: selectedMailbox.value); mailboxLocation: selectedMailbox.value);
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedMailboxCallback?.call(newMailboxArguments); onCreatedMailboxCallback?.call(newMailboxArguments);
} else { } else {
popBack(result: newMailboxArguments); popBack(result: newMailboxArguments);
@@ -217,7 +216,6 @@ class MailboxCreatorController extends BaseController {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onDismissMailboxCreator?.call(); onDismissMailboxCreator?.call();
} else { } else {
popBack(); popBack();
@@ -33,6 +33,7 @@ import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
import 'widgets/app_dashboard/app_grid_dashboard_overlay.dart'; import 'widgets/app_dashboard/app_grid_dashboard_overlay.dart';
@@ -61,7 +62,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Container( Container(
width: ResponsiveUtils.defaultSizeMenu, width: ResponsiveUtils.defaultSizeMenu,
color: Colors.white, color: Colors.white,
padding: const EdgeInsets.only(left: 28), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 28,
right: AppUtils.isDirectionRTL(context) ? 28 : 0,
),
alignment: Alignment.center, alignment: Alignment.center,
height: 80, height: 80,
child: Row(children: [ child: Row(children: [
@@ -95,7 +99,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Expanded(child: Container( Expanded(child: Container(
color: Colors.white, color: Colors.white,
alignment: Alignment.center, alignment: Alignment.center,
padding: const EdgeInsets.only(right: 10), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 10,
left: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
height: 80, height: 80,
child: _buildRightHeader(context))) child: _buildRightHeader(context)))
]), ]),
@@ -118,8 +125,12 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Expanded(child: Column(children: [ Expanded(child: Column(children: [
const SpamReportBannerWebWidget(), const SpamReportBannerWebWidget(),
_buildEmptyTrashButton(context), _buildEmptyTrashButton(context),
const QuotasWarningBannerWidget( QuotasWarningBannerWidget(
margin: EdgeInsets.only(right: 16, top: 8), margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 8
),
), ),
_buildVacationNotificationMessage(context), _buildVacationNotificationMessage(context),
_buildListButtonQuickSearchFilter(context), _buildListButtonQuickSearchFilter(context),
@@ -212,7 +223,12 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Widget _buildThreadViewForWebDesktop(BuildContext context) { Widget _buildThreadViewForWebDesktop(BuildContext context) {
return Container( return Container(
margin: const EdgeInsets.only(right: 16, top: 8, bottom: 16), margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 8,
bottom: 16
),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
@@ -273,9 +289,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () => appGridDashboardController.toggleAppGridDashboard()), onTap: () => appGridDashboardController.toggleAppGridDashboard()),
child: PortalTarget( child: PortalTarget(
anchor: const Aligned( anchor: Aligned(
follower: Alignment.topRight, follower: AppUtils.isDirectionRTL(context)
target: Alignment.bottomRight ? Alignment.topLeft
: Alignment.topRight,
target: AppUtils.isDirectionRTL(context)
? Alignment.bottomLeft
: Alignment.bottomRight
), ),
portalFollower: Obx(() { portalFollower: Obx(() {
if (appGridDashboardController.linagoraApplications.value != null) { if (appGridDashboardController.linagoraApplications.value != null) {
@@ -344,7 +364,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
..decoration(const BoxDecoration( ..decoration(const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10)), borderRadius: BorderRadius.all(Radius.circular(10)),
color: AppColor.colorButtonHeaderThread)) color: AppColor.colorButtonHeaderThread))
..paddingIcon(const EdgeInsets.only(right: 8)) ..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0
))
..size(16) ..size(16)
..radiusSplash(10) ..radiusSplash(10)
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
@@ -354,7 +377,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
.build(), .build(),
if (mailBoxDashboardController.isAbleMarkAllAsRead()) if (mailBoxDashboardController.isAbleMarkAllAsRead())
Padding( Padding(
padding: const EdgeInsets.only(left: 16), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: (ButtonBuilder(imagePaths.icMarkAllAsRead) child: (ButtonBuilder(imagePaths.icMarkAllAsRead)
..key(const Key('button_mark_all_as_read')) ..key(const Key('button_mark_all_as_read'))
..decoration(const BoxDecoration( ..decoration(const BoxDecoration(
@@ -378,13 +404,19 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
..decoration(BoxDecoration( ..decoration(BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(10)), borderRadius: const BorderRadius.all(Radius.circular(10)),
color: controller.filterMessageOption.value.getBackgroundColor())) color: controller.filterMessageOption.value.getBackgroundColor()))
..paddingIcon(const EdgeInsets.only(right: 8)) ..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
))
..size(16) ..size(16)
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
..radiusSplash(10) ..radiusSplash(10)
..textStyle(controller.filterMessageOption.value.getTextStyle()) ..textStyle(controller.filterMessageOption.value.getTextStyle())
..addIconAction(Padding( ..addIconAction(Padding(
padding: const EdgeInsets.only(left: 8), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: SvgPicture.asset(imagePaths.icArrowDown, fit: BoxFit.fill))) child: SvgPicture.asset(imagePaths.icArrowDown, fit: BoxFit.fill)))
..addOnPressActionWithPositionClick((position) => ..addOnPressActionWithPositionClick((position) =>
controller.openPopupMenuAction( controller.openPopupMenuAction(
@@ -472,7 +504,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Obx(() { return Obx(() {
if (controller.vacationResponse.value?.vacationResponderIsValid == true) { if (controller.vacationResponse.value?.vacationResponderIsValid == true) {
return VacationNotificationMessageWidget( return VacationNotificationMessageWidget(
margin: const EdgeInsets.only(top: 16, right: 16), margin: EdgeInsets.only(
top: 16,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
vacationResponse: controller.vacationResponse.value!, vacationResponse: controller.vacationResponse.value!,
actionGotoVacationSetting: () => controller.goToVacationSetting(), actionGotoVacationSetting: () => controller.goToVacationSetting(),
actionEndNow: () => controller.disableVacationResponder()); actionEndNow: () => controller.disableVacationResponder());
@@ -491,7 +527,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Obx(() { return Obx(() {
if (supportListButtonQuickSearchFilter(context)) { if (supportListButtonQuickSearchFilter(context)) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 16, top: 16), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 16
),
child: Row(children: QuickSearchFilter.values child: Row(children: QuickSearchFilter.values
.map((filter) => _buildQuickSearchFilterButton(context, filter)) .map((filter) => _buildQuickSearchFilterButton(context, filter))
.toList() .toList()
@@ -514,7 +554,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
); );
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
if (filter != QuickSearchFilter.last7Days) { if (filter != QuickSearchFilter.last7Days) {
@@ -613,11 +656,18 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
borderRadius: const BorderRadius.all(Radius.circular(14)), borderRadius: const BorderRadius.all(Radius.circular(14)),
border: Border.all(color: AppColor.colorLineLeftEmailView), border: Border.all(color: AppColor.colorLineLeftEmailView),
color: Colors.white), color: Colors.white),
margin: const EdgeInsets.only(right: 16, top: 16), margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 16
),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(children: [ child: Row(children: [
Padding( Padding(
padding: const EdgeInsets.only(right: 16), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: SvgPicture.asset( child: SvgPicture.asset(
imagePaths.icDeleteTrash, imagePaths.icDeleteTrash,
fit: BoxFit.fill)), fit: BoxFit.fill)),
@@ -626,7 +676,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 8), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0
),
child: Text( child: Text(
AppLocalizations.of(context).message_delete_all_email_in_trash_button, AppLocalizations.of(context).message_delete_all_email_in_trash_button,
style: const TextStyle( style: const TextStyle(
@@ -671,7 +724,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
color: AppColor.colorShadowComposerButton color: AppColor.colorShadowComposerButton
) )
])) ]))
..paddingIcon(const EdgeInsets.only(right: 8)) ..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
))
..iconColor(Colors.white) ..iconColor(Colors.white)
..size(24) ..size(24)
..radiusSplash(10) ..radiusSplash(10)
@@ -7,6 +7,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class IconOpenAdvancedSearchWidget extends StatelessWidget { class IconOpenAdvancedSearchWidget extends StatelessWidget {
IconOpenAdvancedSearchWidget( IconOpenAdvancedSearchWidget(
@@ -23,11 +24,17 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Obx( return Obx(
() => Padding( () => Padding(
padding: const EdgeInsets.only(right: 8), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: buildIconWeb( child: buildIconWeb(
splashRadius: 15, splashRadius: 15,
minSize: 40, minSize: 40,
iconPadding: const EdgeInsets.only(right: 2), iconPadding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 2,
left: AppUtils.isDirectionRTL(context) ? 2 : 0,
),
icon: SvgPicture.asset(_imagePaths.icFilterAdvanced, icon: SvgPicture.asset(_imagePaths.icFilterAdvanced,
colorFilter: searchController.isAdvancedSearchViewOpen.isTrue || searchController.advancedSearchIsActivated.isTrue colorFilter: searchController.isAdvancedSearchViewOpen.isTrue || searchController.advancedSearchIsActivated.isTrue
? AppColor.colorFilterMessageEnabled.asFilter() ? AppColor.colorFilterMessageEnabled.asFilter()
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/ad
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
final MailboxDashBoardController dashBoardController; final MailboxDashBoardController dashBoardController;
@@ -189,7 +190,10 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
labelStyle: const TextStyle(color: Colors.black, fontSize: 16.0) labelStyle: const TextStyle(color: Colors.black, fontSize: 16.0)
), ),
leftButton: Padding( leftButton: Padding(
padding: const EdgeInsets.only(left: 8), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0
),
child: buildIconWeb( child: buildIconWeb(
minSize: 40, minSize: 40,
iconPadding: EdgeInsets.zero, iconPadding: EdgeInsets.zero,
@@ -215,10 +219,12 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
final isFilterSelected = filter.isApplied(dashBoardController.searchController.listFilterOnSuggestionForm); final isFilterSelected = filter.isApplied(dashBoardController.searchController.listFilterOnSuggestionForm);
return Chip( return Chip(
labelPadding: const EdgeInsets.only( labelPadding: EdgeInsets.only(
top: 2, top: 2,
bottom: 2, bottom: 2,
right: 10), right: AppUtils.isDirectionRTL(context) ? 0 : 10,
left: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
label: Text( label: Text(
filter.getName(context), filter.getName(context),
maxLines: 1, maxLines: 1,
@@ -6,6 +6,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
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/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SpamReportBannerWebWidget extends StatelessWidget { class SpamReportBannerWebWidget extends StatelessWidget {
const SpamReportBannerWebWidget({ Key? key }) : super(key: key); const SpamReportBannerWebWidget({ Key? key }) : super(key: key);
@@ -22,7 +23,11 @@ class SpamReportBannerWebWidget extends StatelessWidget {
} }
return Container( return Container(
height: 84, height: 84,
margin: const EdgeInsets.only(right: 16, top: 16), margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 16
),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
@@ -53,8 +58,9 @@ class SpamReportBannerWebWidget extends StatelessWidget {
], ],
), ),
Padding( Padding(
padding: const EdgeInsets.only( padding: EdgeInsets.only(
left: 32, left: AppUtils.isDirectionRTL(context) ? 0 : 32,
right: AppUtils.isDirectionRTL(context) ? 32 : 0,
), ),
child: buildTextButton( child: buildTextButton(
AppLocalizations.of(context).showDetails, AppLocalizations.of(context).showDetails,
@@ -71,14 +77,24 @@ class SpamReportBannerWebWidget extends StatelessWidget {
), ),
], ],
), ),
Positioned( if (AppUtils.isDirectionRTL(context))
top: 16, Positioned(
right: 16, top: 16,
child: buildSVGIconButton( left: 16,
icon: imagePaths.icCloseComposer, child: buildSVGIconButton(
onTap: () => spamReportController.dismissSpamReportAction(), icon: imagePaths.icCloseComposer,
), onTap: spamReportController.dismissSpamReportAction,
), ),
)
else
Positioned(
top: 16,
right: 16,
child: buildSVGIconButton(
icon: imagePaths.icCloseComposer,
onTap: spamReportController.dismissSpamReportAction,
),
)
], ],
), ),
); );
@@ -57,6 +57,7 @@ class EmailRulesHeaderWidget extends StatelessWidget {
..iconColor(Colors.white) ..iconColor(Colors.white)
..size(20) ..size(20)
..radiusSplash(10) ..radiusSplash(10)
..addBoxConstraints(const BoxConstraints(minWidth: 130))
..padding(const EdgeInsets.symmetric(vertical: 12,horizontal: 8)) ..padding(const EdgeInsets.symmetric(vertical: 12,horizontal: 8))
..textStyle(const TextStyle( ..textStyle(const TextStyle(
fontSize: 17, fontSize: 17,
@@ -68,7 +69,7 @@ class EmailRulesHeaderWidget extends StatelessWidget {
AppLocalizations.of(context).addNewRule, AppLocalizations.of(context).addNewRule,
isVertical: false, isVertical: false,
)).build(), )).build(),
const Expanded(child: SizedBox()), const Spacer(),
], ],
); );
} else { } else {
@@ -34,7 +34,7 @@ extension LocaleExtension on Locale {
case 'ru': case 'ru':
return 'Русский'; return 'Русский';
case 'ar': case 'ar':
return 'اَلْعَرَبِيَّةُ'; return 'عربي';
case 'it': case 'it':
return 'Italiano'; return 'Italiano';
default: default:
@@ -2,11 +2,13 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/widgets/change_language_button_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/widgets/change_language_button_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/widgets/language_and_region_header_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/widgets/language_and_region_header_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> { class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> {
@@ -16,36 +18,44 @@ class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Portal(
backgroundColor: _responsiveUtils.isWebDesktop(context) child: Scaffold(
? AppColor.colorBgDesktop backgroundColor: _responsiveUtils.isWebDesktop(context)
: Colors.white, ? AppColor.colorBgDesktop
body: Container( : Colors.white,
width: double.infinity, body: Container(
margin: _responsiveUtils.isWebDesktop(context) width: double.infinity,
? const EdgeInsets.all(24) margin: _responsiveUtils.isWebDesktop(context)
: EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)), ? const EdgeInsets.all(24)
color: _responsiveUtils.isWebDesktop(context) ? null : Colors.white, : EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)),
decoration: _responsiveUtils.isWebDesktop(context) color: _responsiveUtils.isWebDesktop(context) ? null : Colors.white,
? BoxDecoration( decoration: _responsiveUtils.isWebDesktop(context)
borderRadius: BorderRadius.circular(20), ? BoxDecoration(
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), borderRadius: BorderRadius.circular(20),
color: Colors.white) border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
: null, color: Colors.white)
child: ClipRRect( : null,
borderRadius: BorderRadius.circular( child: ClipRRect(
_responsiveUtils.isWebDesktop(context) ? 20 : 0), borderRadius: BorderRadius.circular(
child: Padding( _responsiveUtils.isWebDesktop(context) ? 20 : 0),
padding: EdgeInsets.only( child: Padding(
left: _responsiveUtils.isWebDesktop(context) ? 24 : 0, padding: EdgeInsets.only(
top: 24), right: AppUtils.isDirectionRTL(context)
child: Column( ? _responsiveUtils.isWebDesktop(context) ? 24 : 0
crossAxisAlignment: CrossAxisAlignment.start, : 0,
children: [ left: AppUtils.isDirectionRTL(context)
const LanguageAndRegionHeaderWidget(), ? 0
const SizedBox(height: 22), : _responsiveUtils.isWebDesktop(context) ? 24 : 0,
Expanded(child: ChangeLanguageButtonWidget()) top: 24
] ),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const LanguageAndRegionHeaderWidget(),
const SizedBox(height: 22),
Expanded(child: ChangeLanguageButtonWidget())
]
),
), ),
), ),
), ),
@@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visib
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/utils/mailbox_visibility_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/utils/mailbox_visibility_utils.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_header_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_header_widget.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxVisibilityView extends GetWidget<MailboxVisibilityController> class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
with AppLoaderMixin, with AppLoaderMixin,
@@ -137,7 +138,11 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
context, context,
key: const Key('children_tree_mailbox_child'), key: const Key('children_tree_mailbox_child'),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 10), isDirectionRTL: AppUtils.isDirectionRTL(context),
paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 10,
right: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
parent: MailBoxVisibilityFolderTileBuilder( parent: MailBoxVisibilityFolderTileBuilder(
_imagePaths, _imagePaths,
mailboxNode, mailboxNode,
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_ma
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailBoxVisibilityFolderTileBuilder extends StatelessWidget { class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
@@ -75,7 +76,7 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
else else
const SizedBox(width: 24), const SizedBox(width: 24),
if (!_mailboxNode.item.isTeamMailboxes) if (!_mailboxNode.item.isTeamMailboxes)
_buildMailboxIcon(), _buildMailboxIcon(context),
] ]
); );
} }
@@ -113,9 +114,12 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
); );
} }
Widget _buildMailboxIcon() { Widget _buildMailboxIcon(BuildContext context) {
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: SvgPicture.asset( child: SvgPicture.asset(
_mailboxNode.item.getMailboxIcon(_imagePaths), _mailboxNode.item.getMailboxIcon(_imagePaths),
width: 20, width: 20,
@@ -1,6 +1,7 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxVisibilityHeaderWidget extends StatelessWidget { class MailboxVisibilityHeaderWidget extends StatelessWidget {
@@ -9,7 +10,10 @@ class MailboxVisibilityHeaderWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: const EdgeInsets.only(left: 24), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 24,
right: AppUtils.isDirectionRTL(context) ? 24 : 0
),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@@ -11,6 +11,7 @@ import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.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/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_utils.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';
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/forward/forward_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
@@ -46,7 +47,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
desktop: Column(children: [ desktop: Column(children: [
Row(children: [ Row(children: [
Container(width: 256, color: Colors.white, Container(width: 256, color: Colors.white,
padding: const EdgeInsets.only(top: 25, bottom: 25, left: 32), padding: SettingsUtils.getPaddingHeaderSetting(context),
child: Row(children: [ child: Row(children: [
(SloganBuilder(arrangedByHorizontal: true) (SloganBuilder(arrangedByHorizontal: true)
..setSloganText(AppLocalizations.of(context).app_name) ..setSloganText(AppLocalizations.of(context).app_name)
@@ -71,7 +72,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
]) ])
), ),
Expanded(child: Padding( Expanded(child: Padding(
padding: const EdgeInsets.only(right: 10, top: 16, bottom: 10, left: 48), padding: SettingsUtils.getPaddingRightHeaderSetting(context),
child: _buildRightHeader(context))) child: _buildRightHeader(context)))
]), ]),
Expanded(child: Row( Expanded(child: Row(
@@ -6,6 +6,7 @@ import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/account_menu_item_tile_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/account_menu_item_tile_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> { class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
@@ -57,11 +58,18 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
color: _responsiveUtils.isWebDesktop(context) ? AppColor.colorBgDesktop : Colors.white, color: _responsiveUtils.isWebDesktop(context) ? AppColor.colorBgDesktop : Colors.white,
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 20, top: 24), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 20,
right: AppUtils.isDirectionRTL(context) ? 20 : 0,
top: 24
),
child: (ButtonBuilder(_imagePaths.icBack) child: (ButtonBuilder(_imagePaths.icBack)
..key(const Key('button_back')) ..key(const Key('button_back'))
..decoration(BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppColor.colorBgMailboxSelected)) ..decoration(BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppColor.colorBgMailboxSelected))
..paddingIcon(const EdgeInsets.only(right: 8)) ..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
))
..iconColor(AppColor.colorTextButton) ..iconColor(AppColor.colorTextButton)
..maxWidth(100) ..maxWidth(100)
..size(16) ..size(16)
@@ -72,14 +80,21 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
..text(AppLocalizations.of(context).back, isVertical: false)) ..text(AppLocalizations.of(context).back, isVertical: false))
.build()), .build()),
Padding( Padding(
padding: const EdgeInsets.only(left: 32, top: 20), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 32,
right: AppUtils.isDirectionRTL(context) ? 32 : 0,
top: 20
),
child: Text( child: Text(
AppLocalizations.of(context).manage_account, AppLocalizations.of(context).manage_account,
style: const TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 17))), style: const TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 17))),
const SizedBox(height: 12), const SizedBox(height: 12),
Obx( Obx(
() => ListView.builder( () => ListView.builder(
padding: const EdgeInsets.only(left: 16, right: 8), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 8 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 8
),
key: const Key('list_manage_account_property'), key: const Key('list_manage_account_property'),
shrinkWrap: true, shrinkWrap: true,
itemCount: controller.listAccountMenuItem.length, itemCount: controller.listAccountMenuItem.length,
@@ -95,21 +110,31 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
const Padding( const Padding(
padding: EdgeInsets.symmetric(vertical: 16), padding: EdgeInsets.symmetric(vertical: 16),
child: Divider(color: AppColor.lineItemListColor, height: 0.5, thickness: 0.2)), child: Divider(color: AppColor.lineItemListColor, height: 0.5, thickness: 0.2)),
Padding(padding: const EdgeInsets.only(left: 32), Padding(
child: InkWell( padding: EdgeInsets.only(
onTap: () { left: AppUtils.isDirectionRTL(context) ? 0 : 32,
controller.logout( right: AppUtils.isDirectionRTL(context) ? 32 : 0,
controller.dashBoardController.sessionCurrent.value, ),
controller.dashBoardController.accountId.value child: InkWell(
); onTap: () {
}, controller.logout(
child: Row(children: [ controller.dashBoardController.sessionCurrent.value,
SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill), controller.dashBoardController.accountId.value
const SizedBox(width: 12), );
Expanded(child: Text(AppLocalizations.of(context).sign_out, },
style: const TextStyle(fontWeight: FontWeight.normal, fontSize: 15, color: Colors.black))) child: Row(children: [
]) SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill),
) const SizedBox(width: 12),
Expanded(child: Text(
AppLocalizations.of(context).sign_out,
style: const TextStyle(
fontWeight: FontWeight.normal,
fontSize: 15,
color: Colors.black
)
))
])
)
), ),
]), ]),
)), )),
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings
import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/setting_first_level_tile_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/model/account_menu_item.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SettingsFirstLevelView extends GetWidget<SettingsController> { class SettingsFirstLevelView extends GetWidget<SettingsController> {
SettingsFirstLevelView({Key? key}) : super(key: key); SettingsFirstLevelView({Key? key}) : super(key: key);
@@ -25,7 +26,10 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
child: UserInformationWidgetBuilder( child: UserInformationWidgetBuilder(
_imagePaths, _imagePaths,
controller.manageAccountDashboardController.userProfile.value, controller.manageAccountDashboardController.userProfile.value,
titlePadding: const EdgeInsets.only(left: 16)) titlePadding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0
))
)), )),
Divider( Divider(
color: AppColor.colorDividerComposer, color: AppColor.colorDividerComposer,
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/profiles/prof
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';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef CloseSettingsViewAction = void Function(); typedef CloseSettingsViewAction = void Function();
@@ -66,9 +67,12 @@ class SettingsView extends GetWidget<SettingsController> {
fromAccountDashBoard: true, fromAccountDashBoard: true,
vacationResponse: controller.manageAccountDashboardController.vacationResponse.value!, vacationResponse: controller.manageAccountDashboardController.vacationResponse.value!,
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16),
leadingIcon: const Padding( leadingIcon: Padding(
padding: EdgeInsets.only(right: 16), padding: EdgeInsets.only(
child: Icon(Icons.timer, size: 20), right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: const Icon(Icons.timer, size: 20),
) )
); );
} else { } else {
@@ -131,13 +135,14 @@ class SettingsView extends GetWidget<SettingsController> {
padding: const EdgeInsets.symmetric(horizontal: 8), padding: const EdgeInsets.symmetric(horizontal: 8),
child: Row(mainAxisSize: MainAxisSize.min, children: [ child: Row(mainAxisSize: MainAxisSize.min, children: [
SvgPicture.asset( SvgPicture.asset(
_imagePaths.icBack, AppUtils.isDirectionRTL(context) ? _imagePaths.icCollapseFolder : _imagePaths.icBack,
width: 18,
height: 18,
colorFilter: AppColor.colorTextButton.asFilter(), colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill), fit: BoxFit.fill),
Container( Container(
margin: const EdgeInsets.only(left: 8), margin: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
constraints: const BoxConstraints(maxWidth: 100), constraints: const BoxConstraints(maxWidth: 100),
child: Text( child: Text(
AppLocalizations.of(context).settings, AppLocalizations.of(context).settings,
@@ -2,6 +2,7 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/build_utils.dart'; import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SettingsUtils { class SettingsUtils {
static double getHorizontalPadding(BuildContext context, ResponsiveUtils responsiveUtils) { static double getHorizontalPadding(BuildContext context, ResponsiveUtils responsiveUtils) {
@@ -142,4 +143,20 @@ class SettingsUtils {
return EdgeInsets.zero; return EdgeInsets.zero;
} }
} }
static EdgeInsets getPaddingHeaderSetting(BuildContext context) {
if (AppUtils.isDirectionRTL(context)) {
return const EdgeInsets.only(top: 25, bottom: 25, right: 32);
} else {
return const EdgeInsets.only(top: 25, bottom: 25, left: 32);
}
}
static EdgeInsets getPaddingRightHeaderSetting(BuildContext context) {
if (AppUtils.isDirectionRTL(context)) {
return const EdgeInsets.only(right: 48, top: 16, bottom: 10, left: 10);
} else {
return const EdgeInsets.only(right: 10, top: 16, bottom: 10, left: 48);
}
}
} }
@@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef SettingFirstLevelTileClickAction = void Function(); typedef SettingFirstLevelTileClickAction = void Function();
@@ -41,7 +42,10 @@ class SettingFirstLevelTileBuilder extends StatelessWidget {
Row( Row(
children: [ children: [
Padding( Padding(
padding: EdgeInsets.only(left: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? SettingsUtils.getHorizontalPadding(context, _responsiveUtils) : 0,
left: AppUtils.isDirectionRTL(context) ? 0 : SettingsUtils.getHorizontalPadding(context, _responsiveUtils),
),
child: _buildSettingIcon(context)), child: _buildSettingIcon(context)),
Expanded(child: Padding( Expanded(child: Padding(
padding: const EdgeInsets.only(left: 12, right: 12), padding: const EdgeInsets.only(left: 12, right: 12),
@@ -61,7 +65,11 @@ class SettingFirstLevelTileBuilder extends StatelessWidget {
), ),
subtitle != null subtitle != null
? Padding( ? Padding(
padding: EdgeInsets.only(left: _getSubtitleLeftPadding(context), right: 12, top: 12), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : _getSubtitleLeftPadding(context),
right: AppUtils.isDirectionRTL(context) ? _getSubtitleLeftPadding(context) : 12,
top: 12
),
child: Text( child: Text(
subtitle!, subtitle!,
style: const TextStyle( style: const TextStyle(
@@ -72,9 +80,12 @@ class SettingFirstLevelTileBuilder extends StatelessWidget {
] ]
)), )),
IconButton( IconButton(
padding: EdgeInsets.only(right: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : SettingsUtils.getHorizontalPadding(context, _responsiveUtils),
left: AppUtils.isDirectionRTL(context) ? SettingsUtils.getHorizontalPadding(context, _responsiveUtils) : 0,
),
icon: SvgPicture.asset( icon: SvgPicture.asset(
_imagePath.icCollapseFolder, AppUtils.isDirectionRTL(context) ? _imagePath.icBack : _imagePath.icCollapseFolder,
fit: BoxFit.fill, fit: BoxFit.fill,
colorFilter: AppColor.colorCollapseMailbox.asFilter()), colorFilter: AppColor.colorCollapseMailbox.asFilter()),
onPressed: clickAction onPressed: clickAction
@@ -419,10 +419,9 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
Widget _buildMessagePlainTextEditor(BuildContext context) { Widget _buildMessagePlainTextEditor(BuildContext context) {
return (TextFieldBuilder() return (TextFieldBuilder()
..onChange((value) => controller.updateMessageBody(context, value)) ..onChange((value) => controller.updateMessageBody(context, value))
..textInputAction(TextInputAction.next) ..keyboardType(TextInputType.multiline)
..addController(controller.messageTextController) ..addController(controller.messageTextController)
..textStyle(const TextStyle(color: Colors.black, fontSize: 16)) ..textStyle(const TextStyle(color: Colors.black, fontSize: 16))
..keyboardType(TextInputType.text)
..minLines(10) ..minLines(10)
..maxLines(null) ..maxLines(null)
..textDecoration((TextInputDecorationBuilder() ..textDecoration((TextInputDecorationBuilder()
@@ -88,7 +88,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
inputConditionValueController = TextEditingController(); inputConditionValueController = TextEditingController();
inputRuleNameFocusNode = FocusNode(); inputRuleNameFocusNode = FocusNode();
inputRuleConditionFocusNode = FocusNode(); inputRuleConditionFocusNode = FocusNode();
} }
@override @override
@@ -319,7 +318,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
newTMailRule); newTMailRule);
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedRuleFilterCallback?.call(ruleFilterRequest); onCreatedRuleFilterCallback?.call(ruleFilterRequest);
} else { } else {
popBack(result: ruleFilterRequest); popBack(result: ruleFilterRequest);
@@ -330,7 +328,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
newTMailRule); newTMailRule);
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedRuleFilterCallback?.call(ruleFilterRequest); onCreatedRuleFilterCallback?.call(ruleFilterRequest);
} else { } else {
popBack(result: ruleFilterRequest); popBack(result: ruleFilterRequest);
@@ -359,7 +356,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onDismissRuleFilterCreator?.call(); onDismissRuleFilterCreator?.call();
} else { } else {
popBack(); popBack();
@@ -30,6 +30,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_sta
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart' import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'
if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart'; if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SearchEmailView extends GetWidget<SearchEmailController> class SearchEmailView extends GetWidget<SearchEmailController>
with AppLoaderMixin { with AppLoaderMixin {
@@ -108,11 +109,11 @@ class SearchEmailView extends GetWidget<SearchEmailController>
return Row( return Row(
children: [ children: [
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icBack, icon: SvgPicture.asset(
width: 18, AppUtils.isDirectionRTL(context) ? _imagePaths.icCollapseFolder : _imagePaths.icBack,
height: 18, colorFilter: AppColor.colorTextButton.asFilter(),
colorFilter: AppColor.colorTextButton.asFilter(), fit: BoxFit.fill
fit: BoxFit.fill), ),
tooltip: AppLocalizations.of(context).back, tooltip: AppLocalizations.of(context).back,
onTap: () => controller.closeSearchView(context) onTap: () => controller.closeSearchView(context)
), ),
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/thread/presentation/widgets/filter_messag
import 'package:tmail_ui_user/features/thread/presentation/widgets/spam_report_banner_widget.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/spam_report_banner_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ThreadView extends GetWidget<ThreadController> class ThreadView extends GetWidget<ThreadController>
with AppLoaderMixin, with AppLoaderMixin,
@@ -187,11 +188,16 @@ class ThreadView extends GetWidget<ThreadController>
? EdgeInsets.zero ? EdgeInsets.zero
: controller.listEmailSelected.isNotEmpty ? const EdgeInsets.only(bottom: 70) : EdgeInsets.zero, : controller.listEmailSelected.isNotEmpty ? const EdgeInsets.only(bottom: 70) : EdgeInsets.zero,
child: Align( child: Align(
alignment: Alignment.bottomRight, alignment: AppUtils.isDirectionRTL(context)
? Alignment.bottomLeft
: Alignment.bottomRight,
child: ScrollingFloatingButtonAnimated( child: ScrollingFloatingButtonAnimated(
icon: SvgPicture.asset(_imagePaths.icCompose, width: 20, height: 20, fit: BoxFit.fill), icon: SvgPicture.asset(_imagePaths.icCompose, width: 20, height: 20, fit: BoxFit.fill),
text: Padding( text: Padding(
padding: const EdgeInsets.only(right: 16), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: Text(AppLocalizations.of(context).compose, child: Text(AppLocalizations.of(context).compose,
overflow: CommonTextStyle.defaultTextOverFlow, overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap, softWrap: CommonTextStyle.defaultSoftWrap,
@@ -532,14 +538,17 @@ class ThreadView extends GetWidget<ThreadController>
border: Border.all(color: AppColor.colorLineLeftEmailView), border: Border.all(color: AppColor.colorLineLeftEmailView),
color: Colors.white), color: Colors.white),
margin: EdgeInsets.only( margin: EdgeInsets.only(
left: _responsiveUtils.isWebDesktop(context) ? 0 : 16, left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isWebDesktop(context) ? 0 : 16,
right: 16, right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isWebDesktop(context) ? 0 : 16 : 16,
bottom: _responsiveUtils.isWebDesktop(context) ? 0 : 16, bottom: _responsiveUtils.isWebDesktop(context) ? 0 : 16,
top: _responsiveUtils.isWebDesktop(context) ? 16 : 0), top: _responsiveUtils.isWebDesktop(context) ? 16 : 0),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(children: [ child: Row(children: [
Padding( Padding(
padding: const EdgeInsets.only(right: 16), padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: SvgPicture.asset( child: SvgPicture.asset(
_imagePaths.icDeleteTrash, _imagePaths.icDeleteTrash,
fit: BoxFit.fill)), fit: BoxFit.fill)),
@@ -548,7 +557,10 @@ class ThreadView extends GetWidget<ThreadController>
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 8), padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
),
child: Text( child: Text(
AppLocalizations.of(context).message_delete_all_email_in_trash_button, AppLocalizations.of(context).message_delete_all_email_in_trash_button,
style: const TextStyle( style: const TextStyle(
+2 -1
View File
@@ -1,4 +1,5 @@
import 'package:core/core.dart'; import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
+7 -1
View File
@@ -1,7 +1,9 @@
import 'package:core/core.dart'; import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:intl/intl.dart' as intl;
class AppUtils { class AppUtils {
@@ -26,4 +28,8 @@ class AppUtils {
} }
static String? get fcmVapidPublicKey => BuildUtils.isWeb ? AppConfig.fcmVapidPublicKeyWeb : null; static String? get fcmVapidPublicKey => BuildUtils.isWeb ? AppConfig.fcmVapidPublicKeyWeb : null;
static bool isDirectionRTL(BuildContext context) {
return intl.Bidi.isRtlLanguage(Localizations.localeOf(context).languageCode);
}
} }