Skip to content

Commit 4097ab0

Browse files
dab246hoangdat
authored andcommitted
Handle contact support on mobile
Signed-off-by: dab246 <tdvu@linagora.com>
1 parent 6b9f869 commit 4097ab0

File tree

7 files changed

+103
-129
lines changed

7 files changed

+103
-129
lines changed

lib/features/base/mixin/contact_support_mixin.dart

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11

2+
import 'package:core/utils/platform_info.dart';
23
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
34
import 'package:model/extensions/contact_support_capability_extension.dart';
45
import 'package:model/support/contact_support_capability.dart';
56
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
67
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
8+
import 'package:tmail_ui_user/main/routes/app_routes.dart';
79
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
810
import 'package:tmail_ui_user/main/routes/route_utils.dart';
911
import 'package:tmail_ui_user/main/utils/app_utils.dart';
@@ -12,22 +14,26 @@ typedef OnTapContactSupportAction = Function(ContactSupportCapability contactSup
1214

1315
mixin ContactSupportMixin {
1416

15-
void onGetHelpOrReportBug(ContactSupportCapability contactSupport) {
17+
void onGetHelpOrReportBug(
18+
ContactSupportCapability contactSupport,
19+
{String route = AppRoutes.dashboard}
20+
) {
1621
if (contactSupport.isMailAddressSupported) {
17-
_handleMailAddress(contactSupport.supportMailAddress!);
22+
_handleMailAddress(contactSupport.supportMailAddress!, route: route);
1823
} else if (contactSupport.isHttpLinkSupported) {
1924
_handleHttpLink(contactSupport.httpLink!);
2025
}
2126
}
2227

23-
void _handleMailAddress(String mailAddress) {
24-
final mailboxDashBoardController = getBinding<MailboxDashBoardController>();
25-
if (mailboxDashBoardController != null) {
26-
mailboxDashBoardController.goToComposer(
28+
void _handleMailAddress(String mailAddress, {String route = AppRoutes.dashboard}) {
29+
if (route == AppRoutes.settings && PlatformInfo.isWeb) {
30+
final mailtoLink = RouteUtils.generateMailtoLink(mailAddress);
31+
AppUtils.launchLink(mailtoLink);
32+
} else {
33+
final mailboxDashBoardController = getBinding<MailboxDashBoardController>();
34+
mailboxDashBoardController?.goToComposer(
2735
ComposerArguments.fromEmailAddress(EmailAddress(null, mailAddress)),
2836
);
29-
} else {
30-
AppUtils.launchLink('${RouteUtils.mailtoPrefix}:$mailAddress');
3137
}
3238
}
3339

lib/features/manage_account/presentation/manage_account_dashboard_controller.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,7 @@ class ManageAccountDashBoardController extends ReloadableController with UserSet
195195
case AccountMenuItem.notification:
196196
NotificationBinding().dependencies();
197197
break;
198-
case AccountMenuItem.vacation:
199-
case AccountMenuItem.contactSupport:
200-
case AccountMenuItem.none:
198+
default:
201199
break;
202200
}
203201
}

lib/features/manage_account/presentation/menu/manage_account_menu_view.dart

Lines changed: 31 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11

2-
import 'package:core/core.dart';
2+
import 'package:core/presentation/extensions/color_extension.dart';
3+
import 'package:core/presentation/views/button/tmail_button_widget.dart';
34
import 'package:core/utils/direction_utils.dart';
45
import 'package:flutter/material.dart';
5-
import 'package:flutter_svg/flutter_svg.dart';
66
import 'package:get/get.dart';
77
import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart';
88
import 'package:tmail_ui_user/features/base/widget/application_logo_with_text_widget.dart';
99
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
1010
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart';
1111
import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/account_menu_item_tile_builder.dart';
12+
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
1213
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
14+
import 'package:tmail_ui_user/main/routes/app_routes.dart';
1315

1416
class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
1517

@@ -84,8 +86,10 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
8486
itemBuilder: (context, index) => Obx(() {
8587
final menuItem = controller.listAccountMenuItem[index];
8688
return AccountMenuItemTileBuilder(
87-
menuItem,
88-
controller.dashBoardController.accountMenuItemSelected.value,
89+
imagePaths: controller.imagePaths,
90+
responsiveUtils: controller.responsiveUtils,
91+
menuItem: menuItem,
92+
menuItemSelected: controller.dashBoardController.accountMenuItemSelected.value,
8993
onSelectAccountMenuItemAction: controller.selectAccountMenuItem
9094
);
9195
})
@@ -112,72 +116,31 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
112116

113117
if (contactSupportCapability?.isAvailable != true) return const SizedBox.shrink();
114118

115-
return Padding(
116-
padding: const EdgeInsetsDirectional.only(start: 20, end: 10),
117-
child: Material(
118-
color: Colors.transparent,
119-
child: InkWell(
120-
onTap: () => controller.onGetHelpOrReportBug(contactSupportCapability!),
121-
borderRadius: const BorderRadius.all(Radius.circular(10)),
122-
child: Padding(
123-
padding: const EdgeInsets.symmetric(
124-
horizontal: 12,
125-
vertical: 6,
126-
),
127-
child: Row(children: [
128-
SvgPicture.asset(
129-
controller.imagePaths.icHelp,
130-
width: 20,
131-
height: 20,
132-
fit: BoxFit.fill,
133-
),
134-
const SizedBox(width: 12),
135-
Expanded(
136-
child: Text(
137-
AppLocalizations.of(context).contactSupport,
138-
style: const TextStyle(
139-
fontWeight: FontWeight.normal,
140-
fontSize: 15,
141-
color: Colors.black,
142-
),
143-
),
144-
)
145-
]),
146-
)
147-
),
148-
),
119+
return AccountMenuItemTileBuilder(
120+
imagePaths: controller.imagePaths,
121+
responsiveUtils: controller.responsiveUtils,
122+
menuItem: AccountMenuItem.contactSupport,
123+
padding: const EdgeInsetsDirectional.only(start: 16, end: 8, bottom: 6),
124+
onSelectAccountMenuItemAction: (_) {
125+
controller.onGetHelpOrReportBug(
126+
contactSupportCapability!,
127+
route: AppRoutes.settings,
128+
);
129+
},
149130
);
150131
}),
151-
Padding(
152-
padding: const EdgeInsetsDirectional.only(start: 20, end: 10),
153-
child: Material(
154-
color: Colors.transparent,
155-
child: InkWell(
156-
onTap: () {
157-
controller.dashBoardController.logout(
158-
context,
159-
controller.dashBoardController.sessionCurrent,
160-
controller.dashBoardController.accountId.value
161-
);
162-
},
163-
borderRadius: BorderRadius.circular(10),
164-
child: Padding(
165-
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
166-
child: Row(children: [
167-
SvgPicture.asset(controller.imagePaths.icSignOut, width: 20, height: 20, fit: BoxFit.fill),
168-
const SizedBox(width: 12),
169-
Expanded(child: Text(
170-
AppLocalizations.of(context).sign_out,
171-
style: const TextStyle(
172-
fontWeight: FontWeight.normal,
173-
fontSize: 15,
174-
color: Colors.black
175-
)
176-
))
177-
]),
178-
)
179-
),
180-
)
132+
AccountMenuItemTileBuilder(
133+
imagePaths: controller.imagePaths,
134+
responsiveUtils: controller.responsiveUtils,
135+
menuItem: AccountMenuItem.signOut,
136+
padding: const EdgeInsetsDirectional.only(start: 16, end: 8),
137+
onSelectAccountMenuItemAction: (_) {
138+
controller.dashBoardController.logout(
139+
context,
140+
controller.dashBoardController.sessionCurrent,
141+
controller.dashBoardController.accountId.value,
142+
);
143+
}
181144
),
182145
]
183146
),

lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings
99
import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart';
1010
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
1111
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
12+
import 'package:tmail_ui_user/main/routes/app_routes.dart';
1213

1314
class SettingsFirstLevelView extends GetWidget<SettingsController> {
1415
const SettingsFirstLevelView({Key? key}) : super(key: key);
@@ -121,20 +122,18 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
121122
return const SizedBox.shrink();
122123
}
123124
}),
124-
Column(children: [
125-
SettingFirstLevelTileBuilder(
126-
AccountMenuItem.mailboxVisibility.getName(context),
127-
AccountMenuItem.mailboxVisibility.getIcon(controller.imagePaths),
128-
subtitle: AppLocalizations.of(context).folderVisibilitySubtitle,
129-
() => controller.selectSettings(AccountMenuItem.mailboxVisibility)
130-
),
131-
Divider(
132-
color: AppColor.colorDividerHorizontal,
133-
height: 1,
134-
indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
135-
endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
136-
),
137-
]),
125+
SettingFirstLevelTileBuilder(
126+
AccountMenuItem.mailboxVisibility.getName(context),
127+
AccountMenuItem.mailboxVisibility.getIcon(controller.imagePaths),
128+
subtitle: AppLocalizations.of(context).folderVisibilitySubtitle,
129+
() => controller.selectSettings(AccountMenuItem.mailboxVisibility)
130+
),
131+
Divider(
132+
color: AppColor.colorDividerHorizontal,
133+
height: 1,
134+
indent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils),
135+
endIndent: SettingsUtils.getHorizontalPadding(context, controller.responsiveUtils)
136+
),
138137
SettingFirstLevelTileBuilder(
139138
AccountMenuItem.languageAndRegion.getName(context),
140139
AccountMenuItem.languageAndRegion.getIcon(controller.imagePaths),
@@ -185,7 +184,10 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
185184
SettingFirstLevelTileBuilder(
186185
AccountMenuItem.contactSupport.getName(context),
187186
AccountMenuItem.contactSupport.getIcon(controller.imagePaths),
188-
() => controller.onGetHelpOrReportBug(contactSupportCapability!),
187+
() => controller.onGetHelpOrReportBug(
188+
contactSupportCapability!,
189+
route: AppRoutes.settings,
190+
),
189191
),
190192
]);
191193
}),
Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,59 @@
1-
import 'package:core/core.dart';
1+
import 'package:core/presentation/extensions/color_extension.dart';
2+
import 'package:core/presentation/resources/image_paths.dart';
3+
import 'package:core/presentation/utils/responsive_utils.dart';
24
import 'package:flutter/material.dart';
35
import 'package:flutter_svg/flutter_svg.dart';
4-
import 'package:get/get.dart';
56
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
67

78
typedef OnSelectAccountMenuItemAction = void Function(AccountMenuItem);
89

910
class AccountMenuItemTileBuilder extends StatelessWidget {
1011

11-
final AccountMenuItem _menuItem;
12-
final AccountMenuItem? _menuItemSelected;
13-
final OnSelectAccountMenuItemAction? onSelectAccountMenuItemAction;
12+
final ImagePaths imagePaths;
13+
final ResponsiveUtils responsiveUtils;
14+
final AccountMenuItem menuItem;
15+
final AccountMenuItem? menuItemSelected;
16+
final EdgeInsetsGeometry? padding;
17+
final OnSelectAccountMenuItemAction onSelectAccountMenuItemAction;
1418

15-
const AccountMenuItemTileBuilder(
16-
this._menuItem,
17-
this._menuItemSelected,
18-
{
19-
Key? key,
20-
this.onSelectAccountMenuItemAction
21-
}
22-
) : super(key: key);
19+
const AccountMenuItemTileBuilder({
20+
Key? key,
21+
required this.imagePaths,
22+
required this.responsiveUtils,
23+
required this.menuItem,
24+
required this.onSelectAccountMenuItemAction,
25+
this.menuItemSelected,
26+
this.padding,
27+
}) : super(key: key);
2328

2429
@override
2530
Widget build(BuildContext context) {
26-
final imagePaths = Get.find<ImagePaths>();
27-
2831
return Padding(
29-
key: const Key('account_menu_item_tile'),
30-
padding: const EdgeInsets.only(top: 6),
32+
key: Key('${menuItem.getAliasBrowser()}_account_menu_item_tile'),
33+
padding: padding ?? const EdgeInsets.only(top: 6),
3134
child: Material(
3235
color: Colors.transparent,
3336
child: InkWell(
34-
onTap: () => onSelectAccountMenuItemAction?.call(_menuItem),
35-
borderRadius: BorderRadius.circular(10),
37+
onTap: () => onSelectAccountMenuItemAction.call(menuItem),
38+
borderRadius: const BorderRadius.all(Radius.circular(10)),
3639
child: Container(
3740
decoration: BoxDecoration(
38-
borderRadius: BorderRadius.circular(10),
39-
color: _getBackgroundColorItem(context)),
41+
borderRadius: const BorderRadius.all(Radius.circular(10)),
42+
color: menuItemSelected == menuItem
43+
? AppColor.colorBgMailboxSelected
44+
: Colors.transparent,
45+
),
4046
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
4147
child: Column(children: [
4248
Row(children: [
4349
SvgPicture.asset(
44-
_menuItem.getIcon(imagePaths),
50+
menuItem.getIcon(imagePaths),
4551
width: 20,
4652
height: 20,
4753
fit: BoxFit.fill),
4854
const SizedBox(width: 12),
4955
Expanded(child: Text(
50-
_menuItem.getName(context),
56+
menuItem.getName(context),
5157
style: const TextStyle(
5258
fontWeight: FontWeight.normal,
5359
fontSize: 15,
@@ -60,16 +66,4 @@ class AccountMenuItemTileBuilder extends StatelessWidget {
6066
),
6167
);
6268
}
63-
64-
Color _getBackgroundColorItem(BuildContext context) {
65-
final responsiveUtils = Get.find<ResponsiveUtils>();
66-
67-
if (_menuItemSelected == _menuItem) {
68-
return AppColor.colorBgMailboxSelected;
69-
} else {
70-
return responsiveUtils.isWebDesktop(context)
71-
? Colors.transparent
72-
: Colors.transparent;
73-
}
74-
}
7569
}

lib/features/manage_account/presentation/model/account_menu_item.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ enum AccountMenuItem {
1313
mailboxVisibility,
1414
notification,
1515
contactSupport,
16+
signOut,
1617
none;
1718

1819
String getIcon(ImagePaths imagePaths) {
@@ -35,6 +36,8 @@ enum AccountMenuItem {
3536
return imagePaths.icNotification;
3637
case AccountMenuItem.contactSupport:
3738
return imagePaths.icHelp;
39+
case AccountMenuItem.signOut:
40+
return imagePaths.icSignOut;
3841
case AccountMenuItem.none:
3942
return imagePaths.icProfiles;
4043
}
@@ -60,6 +63,8 @@ enum AccountMenuItem {
6063
return AppLocalizations.of(context).notification;
6164
case AccountMenuItem.contactSupport:
6265
return AppLocalizations.of(context).contactSupport;
66+
case AccountMenuItem.signOut:
67+
return AppLocalizations.of(context).sign_out;
6368
case AccountMenuItem.none:
6469
return AppLocalizations.of(context).profiles;
6570
}
@@ -85,6 +90,8 @@ enum AccountMenuItem {
8590
return 'notification';
8691
case AccountMenuItem.contactSupport:
8792
return 'contact-support';
93+
case AccountMenuItem.signOut:
94+
return 'sign-out';
8895
case AccountMenuItem.none:
8996
return 'profiles';
9097
}

lib/main/routes/route_utils.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,4 +255,8 @@ abstract class RouteUtils {
255255

256256
static String get emailEMLPreviewerRoutePath =>
257257
_createEmailEMLPreviewerServicePath('$baseOriginUrl${AppRoutes.emailEMLPreviewer}').path;
258+
259+
static String generateMailtoLink(String mailAddress) {
260+
return '$baseOriginUrl/$mailtoPrefix/?uri=$mailtoPrefix:$mailAddress';
261+
}
258262
}

0 commit comments

Comments
 (0)