From 9af4924b9a161b0e22674e8e3670d2a8e1c5d25b Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 10 Mar 2023 13:05:00 +0700 Subject: [PATCH] TF-1581 Update UI to support language `RTL` --- .../views/button/button_builder.dart | 6 + .../presentation/views/list/tree_view.dart | 7 +- .../quick_search/quick_search_input_form.dart | 20 +- .../composer/presentation/composer_view.dart | 52 ++++- .../presentation/composer_view_web.dart | 205 +++++++++++++----- .../attachment_file_composer_builder.dart | 55 +++-- .../presentation/contact_controller.dart | 2 - .../destination_picker_controller.dart | 2 - .../presentation/destination_picker_view.dart | 24 +- ...on_picker_search_mailbox_item_builder.dart | 10 +- .../top_bar_destination_picker_builder.dart | 11 +- .../email/presentation/email_view.dart | 62 +++++- .../widgets/app_bar_mail_widget_builder.dart | 6 +- .../identity_creator_controller.dart | 4 +- .../presentation/identity_creator_view.dart | 13 +- ...set_default_identity_checkbox_builder.dart | 6 +- .../mailbox/presentation/mailbox_view.dart | 105 +++++---- .../presentation/mailbox_view_web.dart | 39 +++- .../mailbox_button_new_folder_builder.dart | 71 ------ .../widgets/mailbox_folder_tile_builder.dart | 51 +++-- .../user_information_widget_builder.dart | 25 ++- .../mailbox_creator_controller.dart | 2 - .../mailbox_dashboard_view_web.dart | 94 ++++++-- .../icon_open_advanced_search_widget.dart | 11 +- .../widgets/search_input_form_widget.dart | 12 +- .../spam_report_banner_web_widget.dart | 38 +++- .../widgets/email_rules_header_widget.dart | 3 +- .../extensions/locale_extension.dart | 2 +- .../language_and_region_view.dart | 70 +++--- .../mailbox_visibility_view.dart | 7 +- ...ailbox_visibility_folder_tile_builder.dart | 10 +- .../mailbox_visibility_header_widget.dart | 6 +- .../manage_account_dashboard_view.dart | 5 +- .../menu/manage_account_menu_view.dart | 63 ++++-- .../settings/settings_first_level_view.dart | 6 +- .../menu/settings/settings_view.dart | 19 +- .../presentation/menu/settings_utils.dart | 17 ++ .../setting_first_level_tile_builder.dart | 19 +- .../presentation/vacation/vacation_view.dart | 3 +- .../rules_filter_creator_controller.dart | 4 - .../email/presentation/search_email_view.dart | 11 +- .../thread/presentation/thread_view.dart | 24 +- lib/main.dart | 3 +- lib/main/utils/app_utils.dart | 8 +- 44 files changed, 821 insertions(+), 392 deletions(-) delete mode 100644 lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart diff --git a/core/lib/presentation/views/button/button_builder.dart b/core/lib/presentation/views/button/button_builder.dart index 357c10d81..630854984 100644 --- a/core/lib/presentation/views/button/button_builder.dart +++ b/core/lib/presentation/views/button/button_builder.dart @@ -26,6 +26,7 @@ class ButtonBuilder { double? _maxWidth; EdgeInsets? _padding; String? _tooltip; + BoxConstraints? _constraints; void key(Key key) { _key = key; @@ -84,6 +85,10 @@ class ButtonBuilder { _tooltip = message; } + void addBoxConstraints(BoxConstraints? constraints) { + _constraints = constraints; + } + ButtonBuilder(this._icon); void onPressActionClick(OnPressActionClick onPressActionClick) { @@ -122,6 +127,7 @@ class ButtonBuilder { color: _decoration == null ? _colorButton : null, decoration: _decoration, width: _maxWidth, + constraints: _constraints, padding: _padding ?? EdgeInsets.zero, child: _buildBody() ), diff --git a/core/lib/presentation/views/list/tree_view.dart b/core/lib/presentation/views/list/tree_view.dart index 19b3fd9d2..5a149b584 100644 --- a/core/lib/presentation/views/list/tree_view.dart +++ b/core/lib/presentation/views/list/tree_view.dart @@ -58,6 +58,7 @@ class TreeViewChild { final List children; final VoidCallback? onTap; final EdgeInsets? paddingChild; + final bool isDirectionRTL; TreeViewChild( this.context, @@ -67,6 +68,7 @@ class TreeViewChild { this.isExpanded, this.onTap, this.paddingChild, + this.isDirectionRTL = false, Key? key, } ); @@ -90,7 +92,10 @@ class TreeViewChild { mainAxisSize: MainAxisSize.min, children: children .map((child) => Padding( - padding: paddingChild ?? const EdgeInsets.only(left: 20), + padding: paddingChild ?? EdgeInsets.only( + left: isDirectionRTL ? 0 : 20, + right: isDirectionRTL ? 20 : 0, + ), child: child )) .toList() diff --git a/core/lib/presentation/views/quick_search/quick_search_input_form.dart b/core/lib/presentation/views/quick_search/quick_search_input_form.dart index e5245e31a..4e43362ba 100644 --- a/core/lib/presentation/views/quick_search/quick_search_input_form.dart +++ b/core/lib/presentation/views/quick_search/quick_search_input_form.dart @@ -89,6 +89,7 @@ class QuickSearchInputForm extends FormField { bool hideSuggestionsBox = false, BoxDecoration? decoration, double? maxHeight, + bool isDirectionRTL = false, }) : assert( initialValue == null || textFieldConfiguration.controller == null), assert(minCharsForSuggestions >= 0), @@ -152,6 +153,7 @@ class QuickSearchInputForm extends FormField { hideSuggestionsBox: hideSuggestionsBox, decoration: decoration, maxHeight: maxHeight, + isDirectionRTL: isDirectionRTL, ); }); @@ -519,6 +521,8 @@ class TypeAheadFieldQuickSearch extends StatefulWidget { /// Max height search input final double? maxHeight; + final bool isDirectionRTL; + /// Creates a [TypeAheadFieldQuickSearch] const TypeAheadFieldQuickSearch( {Key? key, @@ -560,6 +564,7 @@ class TypeAheadFieldQuickSearch extends StatefulWidget { this.hideSuggestionsBox = false, this.decoration, this.maxHeight, + this.isDirectionRTL = false, }) : assert(animationStart >= 0.0 && animationStart <= 1.0), assert( direction == AxisDirection.down || direction == AxisDirection.up), @@ -748,6 +753,7 @@ class _TypeAheadFieldQuickSearchState extends State extends StatefulWidget { final RecentSelectionCallback? onRecentSelected; final EdgeInsets? listActionPadding; final bool hideSuggestionsBox; + final bool isDirectionRTL; const _SuggestionsList({ required this.suggestionsBox, @@ -932,6 +939,7 @@ class _SuggestionsList extends StatefulWidget { this.onRecentSelected, this.listActionPadding, this.hideSuggestionsBox = false, + this.isDirectionRTL = false, }); @override @@ -1174,7 +1182,11 @@ class _SuggestionsListState extends State<_SuggestionsList> children: widget.listActionButton!.map((dynamic action) { if (widget.actionButtonBuilder != null) { 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( borderRadius: const BorderRadius.all(Radius.circular(10)), onTap: () { @@ -1255,7 +1267,11 @@ class _SuggestionsListState extends State<_SuggestionsList> children: widget.listActionButton!.map((dynamic action) { if (widget.actionButtonBuilder != null) { 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( borderRadius: const BorderRadius.all(Radius.circular(10)), onTap: () { diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index e8779a1f4..e862ad2a1 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -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/email/domain/state/get_email_content_state.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 with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin { @@ -271,7 +272,8 @@ class ComposerView extends GetWidget Widget _buildFromEmailAddress(BuildContext context) { return Padding( 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, bottom: 12), child: Row(children: [ @@ -324,7 +326,10 @@ class ComposerView extends GetWidget ), ), 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( controller.identitySelected.value?.email ?? '', maxLines: 1, @@ -339,7 +344,10 @@ class ComposerView extends GetWidget return Column( children: [ 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, PrefixEmailAddress.to, controller.listToEmailAddress, @@ -362,7 +370,10 @@ class ComposerView extends GetWidget : const SizedBox.shrink()), Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true ? 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, PrefixEmailAddress.cc, controller.listCcEmailAddress, @@ -384,7 +395,10 @@ class ComposerView extends GetWidget : const SizedBox.shrink()), Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true ? 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, PrefixEmailAddress.bcc, controller.listBccEmailAddress, @@ -410,7 +424,10 @@ class ComposerView extends GetWidget return Row( children: [ Padding( - padding: const EdgeInsets.only(right: 8), + padding: EdgeInsets.only( + right: AppUtils.isDirectionRTL(context) ? 0 : 8, + left: AppUtils.isDirectionRTL(context) ? 8 : 0 + ), child: Text( '${AppLocalizations.of(context).subject_email}:', style: const TextStyle( @@ -478,7 +495,10 @@ class ComposerView extends GetWidget physics: const ClampingScrollPhysics(), child: Column(children: [ 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: [ Padding(padding: const EdgeInsets.only(top: 20), child: (AvatarBuilder() @@ -498,13 +518,22 @@ class ComposerView extends GetWidget : const SizedBox.shrink()), _buildEmailAddress(context), 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), 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: [ _buildAttachmentsWidget(context), buildInlineLoadingView(controller), @@ -662,7 +691,10 @@ class ComposerView extends GetWidget itemCount: uploadFilesState.length, itemBuilder: (context, index) => AttachmentFileComposerBuilder( 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), onDeleteAttachmentAction: (attachment) => controller.deleteAttachmentUploaded(attachment.uploadTaskId)) diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index a02da8073..94ca6986e 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -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/email/domain/state/get_email_content_state.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 with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin { @@ -76,56 +77,111 @@ class ComposerView extends GetWidget desktop: Obx(() { return Stack(children: [ 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, 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))) + 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)) ) + ) ) - )), + )) + 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) - Positioned(right: 5, bottom: 5, child: Card( + if (AppUtils.isDirectionRTL(context)) + Positioned(left: 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), - )), - ])) - ) + 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), + )), + ])) + ) ) - )), + )) + 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) Scaffold( backgroundColor: Colors.black38, @@ -326,7 +382,10 @@ class ComposerView extends GetWidget 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)), 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: [ Padding(padding: const EdgeInsets.only(top: 20), child: (AvatarBuilder() @@ -336,7 +395,10 @@ class ComposerView extends GetWidget ..backgroundColor(AppColor.colorAvatar)) .build()), 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: [ Obx(() => controller.identitySelected.value != null ? _buildFromEmailAddress(context) @@ -346,7 +408,13 @@ class ComposerView extends GetWidget : const SizedBox.shrink()), _buildEmailAddress(context, constraints), 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), _buildListButton(context, constraints), ]), @@ -355,8 +423,9 @@ class ComposerView extends GetWidget const Divider(color: AppColor.colorDividerComposer, height: 1), Expanded(child: Padding( padding: EdgeInsets.only( - left: responsiveUtils.isMobile(context) ? 16 : 60, - right: responsiveUtils.isMobile(context) ? 16 : 25), + left: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 25 : responsiveUtils.isMobile(context) ? 16 : 60, + right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 60 : responsiveUtils.isMobile(context) ? 16 : 25, + ), child: Column( children: [ _buildAttachmentsWidget(context), @@ -384,7 +453,8 @@ class ComposerView extends GetWidget Widget _buildFromEmailAddress(BuildContext context) { return Padding( 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, bottom: 12), child: Row(children: [ @@ -447,7 +517,10 @@ class ComposerView extends GetWidget ), ), 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( controller.identitySelected.value?.email ?? '', maxLines: 1, @@ -471,7 +544,10 @@ class ComposerView extends GetWidget child: Column( children: [ 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, PrefixEmailAddress.to, controller.listToEmailAddress, @@ -495,8 +571,11 @@ class ComposerView extends GetWidget : const SizedBox.shrink()), Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true ? Padding( - padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0), - child: (EmailAddressInputBuilder(context, imagePaths, + 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, PrefixEmailAddress.cc, controller.listCcEmailAddress, controller.listEmailAddressType, @@ -518,7 +597,10 @@ class ComposerView extends GetWidget : const SizedBox.shrink()), Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true ? 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, PrefixEmailAddress.bcc, controller.listBccEmailAddress, @@ -547,7 +629,11 @@ class ComposerView extends GetWidget crossAxisAlignment: CrossAxisAlignment.start, children: [ 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( '${AppLocalizations.of(context).subject_email}:', style: const TextStyle( @@ -572,7 +658,11 @@ class ComposerView extends GetWidget Widget _buildListButton(BuildContext context, BoxConstraints constraints) { 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( padding: const EdgeInsets.symmetric(vertical: 5), child: Row(children: [ @@ -740,10 +830,10 @@ class ComposerView extends GetWidget return Column(children: [ Padding( padding: EdgeInsets.only( - top: 4, - bottom: 4, - left: responsiveUtils.isMobile(context) ? 16 : 20, - right: responsiveUtils.isMobile(context) ? 16: 0), + top: 4, + bottom: 4, + left: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16: 0 : responsiveUtils.isMobile(context) ? 16 : 20, + right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 20 : responsiveUtils.isMobile(context) ? 16: 0), child: _buildAttachmentsTitle( context, attachments, @@ -810,7 +900,10 @@ class ComposerView extends GetWidget itemCount: uploadFilesState.length, itemBuilder: (context, index) => AttachmentFileComposerBuilder( 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), onDeleteAttachmentAction: (attachment) => controller.deleteAttachmentUploaded(attachment.uploadTaskId)) diff --git a/lib/features/composer/presentation/widgets/attachment_file_composer_builder.dart b/lib/features/composer/presentation/widgets/attachment_file_composer_builder.dart index c09cc2547..99ac4ca04 100644 --- a/lib/features/composer/presentation/widgets/attachment_file_composer_builder.dart +++ b/lib/features/composer/presentation/widgets/attachment_file_composer_builder.dart @@ -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_status.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); @@ -51,9 +52,11 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin hoverColor: AppColor.primaryColor, onTap: () {}, leading: Padding( - padding: const EdgeInsets.only( - left: 8, - bottom: BuildUtils.isWeb ? 6 : 14), + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 8, + right: AppUtils.isDirectionRTL(context) ? 8 : 0, + bottom: BuildUtils.isWeb ? 6 : 14 + ), child: SvgPicture.asset( fileState.getIcon(_imagePaths), width: 40, @@ -62,11 +65,14 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin ), title: Transform( 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, 0.0), 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( fileState.fileName, maxLines: 1, @@ -82,7 +88,7 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin subtitle: fileState.fileSize != 0 ? Transform( 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, 0.0), child: Text( @@ -96,19 +102,34 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin color: AppColor.colorContentEmail))) : null, ), - 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); + if (AppUtils.isDirectionRTL(context)) + Positioned( + left: 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); + } } - } + ) ) - ), + 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), ]), ) diff --git a/lib/features/contact/presentation/contact_controller.dart b/lib/features/contact/presentation/contact_controller.dart index 039071953..bda1cfa68 100644 --- a/lib/features/contact/presentation/contact_controller.dart +++ b/lib/features/contact/presentation/contact_controller.dart @@ -174,7 +174,6 @@ class ContactController extends BaseController { FocusScope.of(context).unfocus(); if (BuildUtils.isWeb) { - _disposeWidget(); onSelectedContactCallback?.call(emailAddress); } else { popBack(result: emailAddress); @@ -186,7 +185,6 @@ class ContactController extends BaseController { FocusScope.of(context).unfocus(); if (BuildUtils.isWeb) { - _disposeWidget(); onDismissContactView?.call(); } else { popBack(); diff --git a/lib/features/destination_picker/presentation/destination_picker_controller.dart b/lib/features/destination_picker/presentation/destination_picker_controller.dart index 8ffcdc08c..c6bff2601 100644 --- a/lib/features/destination_picker/presentation/destination_picker_controller.dart +++ b/lib/features/destination_picker/presentation/destination_picker_controller.dart @@ -426,7 +426,6 @@ class DestinationPickerController extends BaseMailboxController { } if (BuildUtils.isWeb) { - _disposeWidget(); onSelectedMailboxCallback?.call(mailboxDestination.value); } else { popBack(result: mailboxDestination.value); @@ -475,7 +474,6 @@ class DestinationPickerController extends BaseMailboxController { FocusScope.of(context).unfocus(); if (BuildUtils.isWeb) { - _disposeWidget(); onDismissDestinationPicker?.call(); } else { popBack(); diff --git a/lib/features/destination_picker/presentation/destination_picker_view.dart b/lib/features/destination_picker/presentation/destination_picker_view.dart index 2a0ceece6..daeca91cb 100644 --- a/lib/features/destination_picker/presentation/destination_picker_view.dart +++ b/lib/features/destination_picker/presentation/destination_picker_view.dart @@ -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/thread/presentation/widgets/search_app_bar_widget.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 with AppLoaderMixin, @@ -368,8 +369,12 @@ class DestinationPickerView extends GetWidget return TreeViewChild( context, key: const Key('children_tree_mailbox_child'), + isDirectionRTL: AppUtils.isDirectionRTL(context), 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( context, _imagePaths, @@ -481,7 +486,10 @@ class DestinationPickerView extends GetWidget if (actions == MailboxActions.select && (mailboxIdSelected == null || mailboxIdSelected == PresentationMailbox.unifiedMailbox.id)) 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( _imagePaths.icFilterSelected, width: 20, @@ -535,7 +543,12 @@ class DestinationPickerView extends GetWidget padding: const EdgeInsets.symmetric(vertical: 16), child: Row( 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( _imagePaths.icBack, colorFilter: AppColor.colorTextButton.asFilter(), @@ -549,7 +562,10 @@ class DestinationPickerView extends GetWidget hasBackButton: false, hasSearchButton: true) ..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)) ..addIconClearText(SvgPicture.asset(_imagePaths.icClearTextSearch, width: 18, height: 18, fit: BoxFit.fill)) ..setHintText(AppLocalizations.of(context).hint_search_mailboxes) diff --git a/lib/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart b/lib/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart index 033d84784..14fe4206a 100644 --- a/lib/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart +++ b/lib/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart @@ -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/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/main/utils/app_utils.dart'; 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 && (mailboxActions == MailboxActions.select || mailboxActions == MailboxActions.create)) { 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( _imagePaths.icFilterSelected, width: 20, diff --git a/lib/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart b/lib/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart index ebaaa5306..b6b11f9bd 100644 --- a/lib/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart +++ b/lib/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart @@ -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/mailbox/presentation/model/mailbox_actions.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 OnOpenCreateNewMailboxScreenAction = Function(); @@ -61,7 +62,10 @@ class TopBarDestinationPickerBuilder extends StatelessWidget { fontWeight: FontWeight.w700))), if (_destinationScreenType == DestinationScreenType.destinationPicker) 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( alignment: Alignment.centerLeft, child: buildIconWeb( @@ -76,7 +80,10 @@ class TopBarDestinationPickerBuilder extends StatelessWidget { ) else 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( alignment: Alignment.centerLeft, child: Material( diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index b3f506220..9b1062d68 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -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/vacation/widgets/vacation_notification_message_widget.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 { @@ -81,7 +82,12 @@ class EmailView extends GetWidget { EdgeInsets _getMarginEmailView(BuildContext context) { if (BuildUtils.isWeb) { 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 { return const EdgeInsets.symmetric(vertical: 16); } @@ -278,8 +284,13 @@ class EmailView extends GetWidget { _buildAttachments(context), if (BuildUtils.isWeb) Expanded(child: Padding( - padding: const EdgeInsets.only(left: 16, bottom: 16), - child: _buildEmailContent(context, constraints, email))) + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 16, + right: AppUtils.isDirectionRTL(context) ? 16 : 0, + bottom: 16 + ), + child: _buildEmailContent(context, constraints, email) + )) else Padding( padding: const EdgeInsets.all(16), @@ -477,10 +488,19 @@ class EmailView extends GetWidget { AppLocalizations.of(context).mark_as_unread, email, iconLeftPadding: responsiveUtils.isMobile(context) - ? const EdgeInsets.only(left: 12, right: 16) - : const EdgeInsets.only(right: 12), + ? EdgeInsets.only( + 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) - ? const EdgeInsets.only(right: 12) + ? EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 12 : 0, + right: AppUtils.isDirectionRTL(context) ? 0 : 12, + ) : EdgeInsets.zero) ..onActionClick((email) => controller.handleEmailAction( context, @@ -507,10 +527,19 @@ class EmailView extends GetWidget { : AppLocalizations.of(context).mark_as_spam, email, iconLeftPadding: responsiveUtils.isMobile(context) - ? const EdgeInsets.only(left: 12, right: 16) - : const EdgeInsets.only(right: 12), + ? EdgeInsets.only( + 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) - ? const EdgeInsets.only(right: 12) + ? EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 12 : 0, + right: AppUtils.isDirectionRTL(context) ? 0 : 12, + ) : EdgeInsets.zero) ..onActionClick((email) => controller.handleEmailAction( context, @@ -532,10 +561,19 @@ class EmailView extends GetWidget { AppLocalizations.of(context).quickCreatingRule, email, iconLeftPadding: responsiveUtils.isMobile(context) - ? const EdgeInsets.only(left: 12, right: 16) - : const EdgeInsets.only(right: 12), + ? EdgeInsets.only( + 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) - ? const EdgeInsets.only(right: 12) + ? EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 12 : 0, + right: AppUtils.isDirectionRTL(context) ? 0 : 12, + ) : EdgeInsets.zero) ..onActionClick((email) => controller.quickCreatingRule(context, email.from!.first))) .build(); diff --git a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart index 0bef5d1c9..4fb8306c7 100644 --- a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart +++ b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart @@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:model/model.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 OnEmailActionClick = void Function(PresentationEmail, EmailActionType); @@ -66,7 +67,10 @@ class AppBarMailWidgetBuilder extends StatelessWidget { fit: BoxFit.fill), if (!isSearchIsRunning) Container( - margin: const EdgeInsets.only(left: 8), + margin: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 8, + right: AppUtils.isDirectionRTL(context) ? 8 : 0, + ), constraints: BoxConstraints( maxWidth: _responsiveUtils.getSizeScreenWidth(context) - 250), child: Text( diff --git a/lib/features/identity_creator/presentation/identity_creator_controller.dart b/lib/features/identity_creator/presentation/identity_creator_controller.dart index d47c9fac5..1598ff7e4 100644 --- a/lib/features/identity_creator/presentation/identity_creator_controller.dart +++ b/lib/features/identity_creator/presentation/identity_creator_controller.dart @@ -100,6 +100,7 @@ class IdentityCreatorController extends BaseController { @override void onInit() { + log('IdentityCreatorController::onInit():'); super.onInit(); keyboardRichTextController = RichTextController(); richTextWebController = RichTextWebController(); @@ -340,7 +341,6 @@ class IdentityCreatorController extends BaseController { ); if (BuildUtils.isWeb) { - _disposeWidget(); onCreatedIdentityCallback?.call(identityRequest); } else { popBack(result: identityRequest); @@ -352,7 +352,6 @@ class IdentityCreatorController extends BaseController { isDefaultIdentity: isDefaultIdentity.value); if (BuildUtils.isWeb) { - _disposeWidget(); onCreatedIdentityCallback?.call(identityRequest); } else { popBack(result: identityRequest); @@ -426,7 +425,6 @@ class IdentityCreatorController extends BaseController { void closeView(BuildContext context) { if (BuildUtils.isWeb) { - _disposeWidget(); onDismissIdentityCreator?.call(); } else { popBack(); diff --git a/lib/features/identity_creator/presentation/identity_creator_view.dart b/lib/features/identity_creator/presentation/identity_creator_view.dart index cb6de4b2a..c416288ac 100644 --- a/lib/features/identity_creator/presentation/identity_creator_view.dart +++ b/lib/features/identity_creator/presentation/identity_creator_view.dart @@ -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/presentation/model/identity_action_type.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 { @@ -475,12 +476,20 @@ class IdentityCreatorView extends GetWidget { }), Expanded( 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( mainAxisAlignment: MainAxisAlignment.end, children: [ 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( AppLocalizations.of(context).cancel, textStyle: const TextStyle( diff --git a/lib/features/identity_creator/presentation/widgets/set_default_identity_checkbox_builder.dart b/lib/features/identity_creator/presentation/widgets/set_default_identity_checkbox_builder.dart index 41389e691..799ea974d 100644 --- a/lib/features/identity_creator/presentation/widgets/set_default_identity_checkbox_builder.dart +++ b/lib/features/identity_creator/presentation/widgets/set_default_identity_checkbox_builder.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.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(); @@ -43,7 +44,10 @@ class SetDefaultIdentityCheckboxBuilder extends StatelessWidget { ), ), 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( AppLocalizations.of(context).setDefaultIdentity, style: const TextStyle( diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 67f5225c4..0f1fceb6c 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -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/quotas/presentation/widget/quotas_footer_widget.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 with MailboxWidgetMixin, @@ -101,8 +102,11 @@ class MailboxView extends GetWidget mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( - padding: const EdgeInsets.only(left: 10), - child: _buildCloseScreenButton(context)), + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 10, + right: AppUtils.isDirectionRTL(context) ? 19 : 0, + ), + child: _buildCloseScreenButton(context)), SizedBox(width: controller.isSelectionEnabled() ? 49 : 40), Expanded(child: Text( AppLocalizations.of(context).folders, @@ -147,8 +151,8 @@ class MailboxView extends GetWidget return Column(children: [ Padding( padding: EdgeInsets.only( - left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 16, - right: 16), + left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 16, + right: AppUtils.isDirectionRTL(context) ?_responsiveUtils.isLandscapeMobile(context) ? 0 : 16 : 16), child: UserInformationWidgetBuilder( _imagePaths, controller.mailboxDashBoardController.userProfile.value, @@ -203,44 +207,45 @@ class MailboxView extends GetWidget const SizedBox(height: 12), Container( margin: EdgeInsets.only( - left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 8, - right: 16), - padding: const EdgeInsets.only(left: 8), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(AppLocalizations.of(context).mailBoxes, - style: const TextStyle( - fontSize: 20, - color: Colors.black, - fontWeight: FontWeight.bold)), - Row( - children: [ - buildIconWeb( - minSize: 40, - iconPadding: EdgeInsets.zero, - icon: SvgPicture.asset( - _imagePaths.icSearchBar, - colorFilter: AppColor.colorTextButton.asFilter(), - fit: BoxFit.fill - ), - tooltip: AppLocalizations.of(context).searchForMailboxes, - onTap: () => controller.openSearchViewAction(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)), - ], + left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 8, + right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 0 : 8 : 16), + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 8, + right: AppUtils.isDirectionRTL(context) ? 8 : 0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(AppLocalizations.of(context).mailBoxes, + style: const TextStyle( + fontSize: 20, + color: Colors.black, + fontWeight: FontWeight.bold)), + Row(children: [ + buildIconWeb( + minSize: 40, + iconPadding: EdgeInsets.zero, + icon: SvgPicture.asset( + _imagePaths.icSearchBar, + colorFilter: AppColor.colorTextButton.asFilter(), + fit: BoxFit.fill + ), + tooltip: AppLocalizations.of(context).searchForMailboxes, + onTap: () => controller.openSearchViewAction(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), Obx(() { @@ -274,8 +279,8 @@ class MailboxView extends GetWidget Widget _buildHeaderMailboxCategory(BuildContext context, MailboxCategories categories) { return Padding( padding: EdgeInsets.only( - right: _responsiveUtils.isLandscapeMobile(context) ? 8 : 28, - left: 4), + right: AppUtils.isDirectionRTL(context) ? 4 : _responsiveUtils.isLandscapeMobile(context) ? 8 : 28, + left: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 8 : 28 : 4), child: Row(children: [ buildIconWeb( minSize: 40, @@ -302,9 +307,13 @@ class MailboxView extends GetWidget return Container( margin: EdgeInsets.only( - left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 8, - right: 16), - padding: const EdgeInsets.only(left: 12), + left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 8, + right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 0 : 8 : 16 + ), + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 12, + right: AppUtils.isDirectionRTL(context) ? 12 : 0, + ), child: TreeView( key: Key('${categories.keyValue}_mailbox_list'), children: _buildListChildTileWidget(context, mailboxNode, lastNode: lastNode))); @@ -332,7 +341,11 @@ class MailboxView extends GetWidget context, key: const Key('children_tree_mailbox_child'), 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( context, _imagePaths, diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 37cc6604a..731675cb7 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -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/main/localizations/app_localizations.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 with AppLoaderMixin, @@ -39,8 +40,7 @@ class MailboxView extends GetWidget height: 0.5, thickness: 0.2), Expanded(child: Container( - padding: EdgeInsets.only( - left: _responsiveUtils.isDesktop(context) ? 16 : 0), + padding: _getViewPadding(context), color: _responsiveUtils.isDesktop(context) ? AppColor.colorBgDesktop : Colors.white, @@ -61,13 +61,23 @@ class MailboxView extends GetWidget ); } + 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) { return Container( color: Colors.white, padding: EdgeInsets.only( - top: _responsiveUtils.isDesktop(context) ? 25 : 16, - bottom: _responsiveUtils.isDesktop(context) ? 25 : 16, - left: _responsiveUtils.isDesktop(context) ? 32 : 16), + top: _responsiveUtils.isDesktop(context) ? 25 : 16, + bottom: _responsiveUtils.isDesktop(context) ? 25 : 16, + left: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 32 : 16, + right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 32 : 16 : 0 + ), child: Row(children: [ (SloganBuilder(arrangedByHorizontal: true) ..setSloganText(AppLocalizations.of(context).app_name) @@ -102,7 +112,10 @@ class MailboxView extends GetWidget controller: controller.mailboxListScrollController, key: const PageStorageKey('mailbox_list'), 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: [ if (!_responsiveUtils.isDesktop(context)) _buildUserInformation(context), @@ -131,7 +144,8 @@ class MailboxView extends GetWidget const SizedBox(height: 13), Padding( 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 ), child: Row( @@ -143,7 +157,10 @@ class MailboxView extends GetWidget color: Colors.black, fontWeight: FontWeight.bold)), 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( children: [ buildIconWeb( @@ -293,8 +310,12 @@ class MailboxView extends GetWidget return TreeViewChild( context, key: const Key('children_tree_mailbox_child'), + isDirectionRTL: AppUtils.isDirectionRTL(context), 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( context, _imagePaths, diff --git a/lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart deleted file mode 100644 index f769d4aa1..000000000 --- a/lib/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart +++ /dev/null @@ -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), - )), - ) - ) - ) - ); - } -} \ No newline at end of file diff --git a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart index 7c0923869..c582fe9c1 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -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/utils/mailbox_method_action_define.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class MailBoxFolderTileBuilder { @@ -82,15 +83,15 @@ class MailBoxFolderTileBuilder { Widget build() { if (responsiveUtils?.isWebDesktop(_context) == true && mailboxDisplayed == MailboxDisplayed.mailbox) { return DragTarget>( - builder: (_, __, ___) => _buildMailboxItem(), + builder: (_, __, ___) => _buildMailboxItem(_context), onAccept: (emails) => _onDragItemAccepted?.call(emails, _mailboxNode.item), ); } else { - return _buildMailboxItem(); + return _buildMailboxItem(_context); } } - Widget _buildMailboxItem() { + Widget _buildMailboxItem(BuildContext context) { if (mailboxDisplayed == MailboxDisplayed.mailbox) { if (BuildUtils.isWeb) { return StatefulBuilder( @@ -108,11 +109,11 @@ class MailBoxFolderTileBuilder { ? CrossAxisAlignment.start : CrossAxisAlignment.center, children: [ - _buildLeadingMailboxItem(), + _buildLeadingMailboxItem(context), const SizedBox(width: 4), Expanded(child: _buildTitleFolderItem()), const SizedBox(width: 8), - _buildTrailingItemForMailboxView() + _buildTrailingItemForMailboxView(context) ]) ), ); @@ -141,12 +142,12 @@ class MailBoxFolderTileBuilder { ? CrossAxisAlignment.start : CrossAxisAlignment.center, children: [ - _buildLeadingMailboxItem(), + _buildLeadingMailboxItem(context), const SizedBox(width: 8), Expanded(child: _buildTitleFolderItem()), _buildSelectedIcon(), const SizedBox(width: 8), - _buildTrailingItemForMailboxView() + _buildTrailingItemForMailboxView(context) ]), ] ), @@ -171,7 +172,7 @@ class MailBoxFolderTileBuilder { ? AppColor.colorItemSelected : Colors.transparent, child: Row(children: [ - _buildLeadingMailboxItem(), + _buildLeadingMailboxItem(context), const SizedBox(width: 8), Expanded(child: _buildTitleFolderItem()), _buildSelectedIcon() @@ -184,7 +185,7 @@ class MailBoxFolderTileBuilder { } } - Widget _buildLeadingMailboxItem() { + Widget _buildLeadingMailboxItem(BuildContext context) { return Row(children: [ if (_mailboxNode.hasChildren()) Row(children: [ @@ -211,20 +212,27 @@ class MailBoxFolderTileBuilder { else const SizedBox(width: 32), 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() ), ]); } - Widget _buildTrailingItemForMailboxView() { + Widget _buildTrailingItemForMailboxView(BuildContext context) { if (BuildUtils.isWeb) { if (isHoverItem) { - return _buildMenuIcon(); + return _buildMenuIcon(context); } else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty && _mailboxNode.item.matchCountingRules()) { 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(), ); } else { @@ -233,7 +241,10 @@ class MailBoxFolderTileBuilder { } else { if (_mailboxNode.hasChildren()) { 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( children: [ if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty @@ -245,7 +256,10 @@ class MailBoxFolderTileBuilder { } else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty && _mailboxNode.item.matchCountingRules()) { 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(), ); } else { @@ -328,9 +342,12 @@ class MailBoxFolderTileBuilder { fit: BoxFit.fill); } - Widget _buildMenuIcon() { + Widget _buildMenuIcon(BuildContext context) { 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( onTapDown: (detail) { final screenSize = MediaQuery.of(_context).size; diff --git a/lib/features/mailbox/presentation/widgets/user_information_widget_builder.dart b/lib/features/mailbox/presentation/widgets/user_information_widget_builder.dart index 3d1fc19cf..88cde1997 100644 --- a/lib/features/mailbox/presentation/widgets/user_information_widget_builder.dart +++ b/lib/features/mailbox/presentation/widgets/user_information_widget_builder.dart @@ -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/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get_utils/src/platform/platform.dart'; import 'package:model/model.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(); @@ -49,7 +53,11 @@ class UserInformationWidgetBuilder extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ 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( _userProfile != null ? '${_userProfile?.email}' : '', maxLines: 1, @@ -60,7 +68,10 @@ class UserInformationWidgetBuilder extends StatelessWidget { ), subtitle != null ? Padding( - padding: const EdgeInsets.only(left: 10), + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 10, + right: AppUtils.isDirectionRTL(context) ? 10 : 0 + ), child: Material( borderRadius: BorderRadius.circular(20), color: Colors.transparent, @@ -80,10 +91,14 @@ class UserInformationWidgetBuilder extends StatelessWidget { ])), if (!kIsWeb) 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( icon: SvgPicture.asset( - _imagePaths.icCollapseFolder, + AppUtils.isDirectionRTL(context) ? _imagePaths.icBack : _imagePaths.icCollapseFolder, fit: BoxFit.fill, colorFilter: AppColor.colorCollapseMailbox.asFilter()), onPressed: () => {})) diff --git a/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart b/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart index e474f3638..13022e04b 100644 --- a/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart +++ b/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart @@ -205,7 +205,6 @@ class MailboxCreatorController extends BaseController { mailboxLocation: selectedMailbox.value); if (BuildUtils.isWeb) { - _disposeWidget(); onCreatedMailboxCallback?.call(newMailboxArguments); } else { popBack(result: newMailboxArguments); @@ -217,7 +216,6 @@ class MailboxCreatorController extends BaseController { FocusScope.of(context).unfocus(); if (BuildUtils.isWeb) { - _disposeWidget(); onDismissMailboxCreator?.call(); } else { popBack(); diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index d6f4a0cf2..32c470a21 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -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/routes/route_navigation.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'; @@ -61,7 +62,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Container( width: ResponsiveUtils.defaultSizeMenu, 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, height: 80, child: Row(children: [ @@ -95,7 +99,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Expanded(child: Container( color: Colors.white, 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, child: _buildRightHeader(context))) ]), @@ -118,8 +125,12 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Expanded(child: Column(children: [ const SpamReportBannerWebWidget(), _buildEmptyTrashButton(context), - const QuotasWarningBannerWidget( - margin: EdgeInsets.only(right: 16, top: 8), + QuotasWarningBannerWidget( + margin: EdgeInsets.only( + right: AppUtils.isDirectionRTL(context) ? 0 : 16, + left: AppUtils.isDirectionRTL(context) ? 16 : 0, + top: 8 + ), ), _buildVacationNotificationMessage(context), _buildListButtonQuickSearchFilter(context), @@ -212,7 +223,12 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Widget _buildThreadViewForWebDesktop(BuildContext context) { 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( borderRadius: BorderRadius.circular(20), border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), @@ -273,9 +289,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { behavior: HitTestBehavior.opaque, onTap: () => appGridDashboardController.toggleAppGridDashboard()), child: PortalTarget( - anchor: const Aligned( - follower: Alignment.topRight, - target: Alignment.bottomRight + anchor: Aligned( + follower: AppUtils.isDirectionRTL(context) + ? Alignment.topLeft + : Alignment.topRight, + target: AppUtils.isDirectionRTL(context) + ? Alignment.bottomLeft + : Alignment.bottomRight ), portalFollower: Obx(() { if (appGridDashboardController.linagoraApplications.value != null) { @@ -344,7 +364,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ..decoration(const BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(10)), 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) ..radiusSplash(10) ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) @@ -354,7 +377,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { .build(), if (mailBoxDashboardController.isAbleMarkAllAsRead()) 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) ..key(const Key('button_mark_all_as_read')) ..decoration(const BoxDecoration( @@ -378,13 +404,19 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ..decoration(BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(10)), 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) ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) ..radiusSplash(10) ..textStyle(controller.filterMessageOption.value.getTextStyle()) ..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))) ..addOnPressActionWithPositionClick((position) => controller.openPopupMenuAction( @@ -472,7 +504,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { return Obx(() { if (controller.vacationResponse.value?.vacationResponderIsValid == true) { 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!, actionGotoVacationSetting: () => controller.goToVacationSetting(), actionEndNow: () => controller.disableVacationResponder()); @@ -491,7 +527,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { return Obx(() { if (supportListButtonQuickSearchFilter(context)) { 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 .map((filter) => _buildQuickSearchFilterButton(context, filter)) .toList() @@ -514,7 +554,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ); 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( onTap: () { if (filter != QuickSearchFilter.last7Days) { @@ -613,11 +656,18 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { borderRadius: const BorderRadius.all(Radius.circular(14)), border: Border.all(color: AppColor.colorLineLeftEmailView), 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), child: Row(children: [ 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( imagePaths.icDeleteTrash, fit: BoxFit.fill)), @@ -626,7 +676,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.only(left: 8), + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 8, + right: AppUtils.isDirectionRTL(context) ? 8 : 0 + ), child: Text( AppLocalizations.of(context).message_delete_all_email_in_trash_button, style: const TextStyle( @@ -671,7 +724,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { 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) ..size(24) ..radiusSplash(10) diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart index 6495f409c..6a1f8b991 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart @@ -7,6 +7,7 @@ import 'package:flutter_svg/flutter_svg.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/search_controller.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class IconOpenAdvancedSearchWidget extends StatelessWidget { IconOpenAdvancedSearchWidget( @@ -23,11 +24,17 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget { Widget build(BuildContext context) { return Obx( () => Padding( - padding: const EdgeInsets.only(right: 8), + padding: EdgeInsets.only( + right: AppUtils.isDirectionRTL(context) ? 0 : 8, + left: AppUtils.isDirectionRTL(context) ? 8 : 0, + ), child: buildIconWeb( splashRadius: 15, 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, colorFilter: searchController.isAdvancedSearchViewOpen.isTrue || searchController.advancedSearchIsActivated.isTrue ? AppColor.colorFilterMessageEnabled.asFilter() diff --git a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart index 1e14d0a6c..310c13da4 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart @@ -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/recent_search_item_tile_widget.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 { final MailboxDashBoardController dashBoardController; @@ -189,7 +190,10 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { labelStyle: const TextStyle(color: Colors.black, fontSize: 16.0) ), 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( minSize: 40, iconPadding: EdgeInsets.zero, @@ -215,10 +219,12 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { final isFilterSelected = filter.isApplied(dashBoardController.searchController.listFilterOnSuggestionForm); return Chip( - labelPadding: const EdgeInsets.only( + labelPadding: EdgeInsets.only( top: 2, bottom: 2, - right: 10), + right: AppUtils.isDirectionRTL(context) ? 0 : 10, + left: AppUtils.isDirectionRTL(context) ? 10 : 0, + ), label: Text( filter.getName(context), maxLines: 1, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart index 8aba2a24a..3e1aeb6e8 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/spam_report_banner_web_widget.dart @@ -6,6 +6,7 @@ import 'package:flutter_svg/flutter_svg.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/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class SpamReportBannerWebWidget extends StatelessWidget { const SpamReportBannerWebWidget({ Key? key }) : super(key: key); @@ -22,7 +23,11 @@ class SpamReportBannerWebWidget extends StatelessWidget { } return Container( 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( borderRadius: BorderRadius.circular(12), border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), @@ -53,8 +58,9 @@ class SpamReportBannerWebWidget extends StatelessWidget { ], ), Padding( - padding: const EdgeInsets.only( - left: 32, + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 32, + right: AppUtils.isDirectionRTL(context) ? 32 : 0, ), child: buildTextButton( AppLocalizations.of(context).showDetails, @@ -71,14 +77,24 @@ class SpamReportBannerWebWidget extends StatelessWidget { ), ], ), - Positioned( - top: 16, - right: 16, - child: buildSVGIconButton( - icon: imagePaths.icCloseComposer, - onTap: () => spamReportController.dismissSpamReportAction(), - ), - ), + if (AppUtils.isDirectionRTL(context)) + Positioned( + top: 16, + left: 16, + child: buildSVGIconButton( + icon: imagePaths.icCloseComposer, + onTap: spamReportController.dismissSpamReportAction, + ), + ) + else + Positioned( + top: 16, + right: 16, + child: buildSVGIconButton( + icon: imagePaths.icCloseComposer, + onTap: spamReportController.dismissSpamReportAction, + ), + ) ], ), ); diff --git a/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart b/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart index 9e83ad604..2900aa85b 100644 --- a/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart +++ b/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart @@ -57,6 +57,7 @@ class EmailRulesHeaderWidget extends StatelessWidget { ..iconColor(Colors.white) ..size(20) ..radiusSplash(10) + ..addBoxConstraints(const BoxConstraints(minWidth: 130)) ..padding(const EdgeInsets.symmetric(vertical: 12,horizontal: 8)) ..textStyle(const TextStyle( fontSize: 17, @@ -68,7 +69,7 @@ class EmailRulesHeaderWidget extends StatelessWidget { AppLocalizations.of(context).addNewRule, isVertical: false, )).build(), - const Expanded(child: SizedBox()), + const Spacer(), ], ); } else { diff --git a/lib/features/manage_account/presentation/language_and_region/extensions/locale_extension.dart b/lib/features/manage_account/presentation/language_and_region/extensions/locale_extension.dart index 2f16a9f41..6bbd98c67 100644 --- a/lib/features/manage_account/presentation/language_and_region/extensions/locale_extension.dart +++ b/lib/features/manage_account/presentation/language_and_region/extensions/locale_extension.dart @@ -34,7 +34,7 @@ extension LocaleExtension on Locale { case 'ru': return 'Русский'; case 'ar': - return 'اَلْعَرَبِيَّةُ'; + return 'عربي'; case 'it': return 'Italiano'; default: diff --git a/lib/features/manage_account/presentation/language_and_region/language_and_region_view.dart b/lib/features/manage_account/presentation/language_and_region/language_and_region_view.dart index eb79140a4..20fdcfd1a 100644 --- a/lib/features/manage_account/presentation/language_and_region/language_and_region_view.dart +++ b/lib/features/manage_account/presentation/language_and_region/language_and_region_view.dart @@ -2,11 +2,13 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_portal/flutter_portal.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/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/menu/settings_utils.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class LanguageAndRegionView extends GetWidget { @@ -16,36 +18,44 @@ class LanguageAndRegionView extends GetWidget { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: _responsiveUtils.isWebDesktop(context) - ? AppColor.colorBgDesktop - : Colors.white, - body: Container( - width: double.infinity, - margin: _responsiveUtils.isWebDesktop(context) - ? const EdgeInsets.all(24) - : EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)), - color: _responsiveUtils.isWebDesktop(context) ? null : Colors.white, - decoration: _responsiveUtils.isWebDesktop(context) - ? BoxDecoration( - borderRadius: BorderRadius.circular(20), - border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), - color: Colors.white) - : null, - child: ClipRRect( - borderRadius: BorderRadius.circular( - _responsiveUtils.isWebDesktop(context) ? 20 : 0), - child: Padding( - padding: EdgeInsets.only( - left: _responsiveUtils.isWebDesktop(context) ? 24 : 0, - top: 24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const LanguageAndRegionHeaderWidget(), - const SizedBox(height: 22), - Expanded(child: ChangeLanguageButtonWidget()) - ] + return Portal( + child: Scaffold( + backgroundColor: _responsiveUtils.isWebDesktop(context) + ? AppColor.colorBgDesktop + : Colors.white, + body: Container( + width: double.infinity, + margin: _responsiveUtils.isWebDesktop(context) + ? const EdgeInsets.all(24) + : EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)), + color: _responsiveUtils.isWebDesktop(context) ? null : Colors.white, + decoration: _responsiveUtils.isWebDesktop(context) + ? BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: Border.all(color: AppColor.colorBorderBodyThread, width: 1), + color: Colors.white) + : null, + child: ClipRRect( + borderRadius: BorderRadius.circular( + _responsiveUtils.isWebDesktop(context) ? 20 : 0), + child: Padding( + padding: EdgeInsets.only( + right: AppUtils.isDirectionRTL(context) + ? _responsiveUtils.isWebDesktop(context) ? 24 : 0 + : 0, + left: AppUtils.isDirectionRTL(context) + ? 0 + : _responsiveUtils.isWebDesktop(context) ? 24 : 0, + top: 24 + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const LanguageAndRegionHeaderWidget(), + const SizedBox(height: 22), + Expanded(child: ChangeLanguageButtonWidget()) + ] + ), ), ), ), diff --git a/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart b/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart index 5e702b77f..00ac91354 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart @@ -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/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/main/utils/app_utils.dart'; class MailboxVisibilityView extends GetWidget with AppLoaderMixin, @@ -137,7 +138,11 @@ class MailboxVisibilityView extends GetWidget context, key: const Key('children_tree_mailbox_child'), 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( _imagePaths, mailboxNode, diff --git a/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart b/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart index 61c6cf3fb..ffbdc24e9 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart @@ -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/utils/mailbox_method_action_define.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 { @@ -75,7 +76,7 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget { else const SizedBox(width: 24), if (!_mailboxNode.item.isTeamMailboxes) - _buildMailboxIcon(), + _buildMailboxIcon(context), ] ); } @@ -113,9 +114,12 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget { ); } - Widget _buildMailboxIcon() { + Widget _buildMailboxIcon(BuildContext context) { 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( _mailboxNode.item.getMailboxIcon(_imagePaths), width: 20, diff --git a/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_header_widget.dart b/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_header_widget.dart index db732aeb4..6f5f69a0e 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_header_widget.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_header_widget.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.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 { @@ -9,7 +10,10 @@ class MailboxVisibilityHeaderWidget extends StatelessWidget { @override Widget build(BuildContext context) { 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( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart index e554325ea..dc5933161 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -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/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/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/email_rules/email_rules_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart'; @@ -46,7 +47,7 @@ class ManageAccountDashBoardView extends GetWidget { @@ -57,11 +58,18 @@ class ManageAccountMenuView extends GetWidget { color: _responsiveUtils.isWebDesktop(context) ? AppColor.colorBgDesktop : Colors.white, child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ 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) ..key(const Key('button_back')) ..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) ..maxWidth(100) ..size(16) @@ -72,14 +80,21 @@ class ManageAccountMenuView extends GetWidget { ..text(AppLocalizations.of(context).back, isVertical: false)) .build()), 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( AppLocalizations.of(context).manage_account, style: const TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 17))), const SizedBox(height: 12), Obx( () => 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'), shrinkWrap: true, itemCount: controller.listAccountMenuItem.length, @@ -95,21 +110,31 @@ class ManageAccountMenuView extends GetWidget { const Padding( padding: EdgeInsets.symmetric(vertical: 16), child: Divider(color: AppColor.lineItemListColor, height: 0.5, thickness: 0.2)), - Padding(padding: const EdgeInsets.only(left: 32), - child: InkWell( - onTap: () { - controller.logout( - controller.dashBoardController.sessionCurrent.value, - controller.dashBoardController.accountId.value - ); - }, - 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))) - ]) - ) + Padding( + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 32, + right: AppUtils.isDirectionRTL(context) ? 32 : 0, + ), + child: InkWell( + onTap: () { + controller.logout( + controller.dashBoardController.sessionCurrent.value, + controller.dashBoardController.accountId.value + ); + }, + 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 + ) + )) + ]) + ) ), ]), )), diff --git a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart index 15a0a82a6..d9d969810 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart @@ -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/model/account_menu_item.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 { SettingsFirstLevelView({Key? key}) : super(key: key); @@ -25,7 +26,10 @@ class SettingsFirstLevelView extends GetWidget { child: UserInformationWidgetBuilder( _imagePaths, 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( color: AppColor.colorDividerComposer, diff --git a/lib/features/manage_account/presentation/menu/settings/settings_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_view.dart index 3ef7b19f8..9b3b2ab37 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_view.dart @@ -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/widgets/vacation_notification_message_widget.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(); @@ -66,9 +67,12 @@ class SettingsView extends GetWidget { fromAccountDashBoard: true, vacationResponse: controller.manageAccountDashboardController.vacationResponse.value!, padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - leadingIcon: const Padding( - padding: EdgeInsets.only(right: 16), - child: Icon(Icons.timer, size: 20), + leadingIcon: Padding( + padding: EdgeInsets.only( + right: AppUtils.isDirectionRTL(context) ? 0 : 16, + left: AppUtils.isDirectionRTL(context) ? 16 : 0, + ), + child: const Icon(Icons.timer, size: 20), ) ); } else { @@ -131,13 +135,14 @@ class SettingsView extends GetWidget { padding: const EdgeInsets.symmetric(horizontal: 8), child: Row(mainAxisSize: MainAxisSize.min, children: [ SvgPicture.asset( - _imagePaths.icBack, - width: 18, - height: 18, + AppUtils.isDirectionRTL(context) ? _imagePaths.icCollapseFolder : _imagePaths.icBack, colorFilter: AppColor.colorTextButton.asFilter(), fit: BoxFit.fill), 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), child: Text( AppLocalizations.of(context).settings, diff --git a/lib/features/manage_account/presentation/menu/settings_utils.dart b/lib/features/manage_account/presentation/menu/settings_utils.dart index 1f785bcb9..b6c7a38d0 100644 --- a/lib/features/manage_account/presentation/menu/settings_utils.dart +++ b/lib/features/manage_account/presentation/menu/settings_utils.dart @@ -2,6 +2,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/utils/build_utils.dart'; import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class SettingsUtils { static double getHorizontalPadding(BuildContext context, ResponsiveUtils responsiveUtils) { @@ -142,4 +143,20 @@ class SettingsUtils { 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); + } + } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart b/lib/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart index 63d74ef9c..faaa31a7b 100644 --- a/lib/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart +++ b/lib/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.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(); @@ -41,7 +42,10 @@ class SettingFirstLevelTileBuilder extends StatelessWidget { Row( children: [ 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)), Expanded(child: Padding( padding: const EdgeInsets.only(left: 12, right: 12), @@ -61,7 +65,11 @@ class SettingFirstLevelTileBuilder extends StatelessWidget { ), subtitle != null ? 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( subtitle!, style: const TextStyle( @@ -72,9 +80,12 @@ class SettingFirstLevelTileBuilder extends StatelessWidget { ] )), 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( - _imagePath.icCollapseFolder, + AppUtils.isDirectionRTL(context) ? _imagePath.icBack : _imagePath.icCollapseFolder, fit: BoxFit.fill, colorFilter: AppColor.colorCollapseMailbox.asFilter()), onPressed: clickAction diff --git a/lib/features/manage_account/presentation/vacation/vacation_view.dart b/lib/features/manage_account/presentation/vacation/vacation_view.dart index 9557b2ded..fa92e734d 100644 --- a/lib/features/manage_account/presentation/vacation/vacation_view.dart +++ b/lib/features/manage_account/presentation/vacation/vacation_view.dart @@ -419,10 +419,9 @@ class VacationView extends GetWidget with RichTextButtonMixi Widget _buildMessagePlainTextEditor(BuildContext context) { return (TextFieldBuilder() ..onChange((value) => controller.updateMessageBody(context, value)) - ..textInputAction(TextInputAction.next) + ..keyboardType(TextInputType.multiline) ..addController(controller.messageTextController) ..textStyle(const TextStyle(color: Colors.black, fontSize: 16)) - ..keyboardType(TextInputType.text) ..minLines(10) ..maxLines(null) ..textDecoration((TextInputDecorationBuilder() diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart index bd4140b5d..b9331d172 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart @@ -88,7 +88,6 @@ class RulesFilterCreatorController extends BaseMailboxController { inputConditionValueController = TextEditingController(); inputRuleNameFocusNode = FocusNode(); inputRuleConditionFocusNode = FocusNode(); - } @override @@ -319,7 +318,6 @@ class RulesFilterCreatorController extends BaseMailboxController { newTMailRule); if (BuildUtils.isWeb) { - _disposeWidget(); onCreatedRuleFilterCallback?.call(ruleFilterRequest); } else { popBack(result: ruleFilterRequest); @@ -330,7 +328,6 @@ class RulesFilterCreatorController extends BaseMailboxController { newTMailRule); if (BuildUtils.isWeb) { - _disposeWidget(); onCreatedRuleFilterCallback?.call(ruleFilterRequest); } else { popBack(result: ruleFilterRequest); @@ -359,7 +356,6 @@ class RulesFilterCreatorController extends BaseMailboxController { FocusScope.of(context).unfocus(); if (BuildUtils.isWeb) { - _disposeWidget(); onDismissRuleFilterCreator?.call(); } else { popBack(); diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index ad463fb95..8babdc7a2 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -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/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'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class SearchEmailView extends GetWidget with AppLoaderMixin { @@ -108,11 +109,11 @@ class SearchEmailView extends GetWidget return Row( children: [ buildIconWeb( - icon: SvgPicture.asset(_imagePaths.icBack, - width: 18, - height: 18, - colorFilter: AppColor.colorTextButton.asFilter(), - fit: BoxFit.fill), + icon: SvgPicture.asset( + AppUtils.isDirectionRTL(context) ? _imagePaths.icCollapseFolder : _imagePaths.icBack, + colorFilter: AppColor.colorTextButton.asFilter(), + fit: BoxFit.fill + ), tooltip: AppLocalizations.of(context).back, onTap: () => controller.closeSearchView(context) ), diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 4b4c6a340..f1db91b0f 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -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/main/localizations/app_localizations.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 with AppLoaderMixin, @@ -187,11 +188,16 @@ class ThreadView extends GetWidget ? EdgeInsets.zero : controller.listEmailSelected.isNotEmpty ? const EdgeInsets.only(bottom: 70) : EdgeInsets.zero, child: Align( - alignment: Alignment.bottomRight, + alignment: AppUtils.isDirectionRTL(context) + ? Alignment.bottomLeft + : Alignment.bottomRight, child: ScrollingFloatingButtonAnimated( icon: SvgPicture.asset(_imagePaths.icCompose, width: 20, height: 20, fit: BoxFit.fill), 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, overflow: CommonTextStyle.defaultTextOverFlow, softWrap: CommonTextStyle.defaultSoftWrap, @@ -532,14 +538,17 @@ class ThreadView extends GetWidget border: Border.all(color: AppColor.colorLineLeftEmailView), color: Colors.white), margin: EdgeInsets.only( - left: _responsiveUtils.isWebDesktop(context) ? 0 : 16, - right: 16, + left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isWebDesktop(context) ? 0 : 16, + right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isWebDesktop(context) ? 0 : 16 : 16, bottom: _responsiveUtils.isWebDesktop(context) ? 0 : 16, top: _responsiveUtils.isWebDesktop(context) ? 16 : 0), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: Row(children: [ 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( _imagePaths.icDeleteTrash, fit: BoxFit.fill)), @@ -548,7 +557,10 @@ class ThreadView extends GetWidget crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.only(left: 8), + padding: EdgeInsets.only( + left: AppUtils.isDirectionRTL(context) ? 0 : 8, + right: AppUtils.isDirectionRTL(context) ? 0 : 8, + ), child: Text( AppLocalizations.of(context).message_delete_all_email_in_trash_button, style: const TextStyle( diff --git a/lib/main.dart b/lib/main.dart index 9d4c9a3bc..871052cc6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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_localizations/flutter_localizations.dart'; import 'package:get/get.dart'; diff --git a/lib/main/utils/app_utils.dart b/lib/main/utils/app_utils.dart index cfa6ebbb0..6ea513931 100644 --- a/lib/main/utils/app_utils.dart +++ b/lib/main/utils/app_utils.dart @@ -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:tmail_ui_user/main/utils/app_config.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:intl/intl.dart' as intl; class AppUtils { @@ -26,4 +28,8 @@ class AppUtils { } static String? get fcmVapidPublicKey => BuildUtils.isWeb ? AppConfig.fcmVapidPublicKeyWeb : null; + + static bool isDirectionRTL(BuildContext context) { + return intl.Bidi.isRtlLanguage(Localizations.localeOf(context).languageCode); + } } \ No newline at end of file