TF-3181 Handle on click contact support

(cherry picked from commit 7a6a02f58f5194c7f8c8ad3c047a5b8938ba598e)
This commit is contained in:
dab246
2024-12-06 02:28:59 +07:00
committed by Dat H. Pham
parent 2da1e555bb
commit 360027d7a1
10 changed files with 176 additions and 6 deletions
@@ -0,0 +1,38 @@
import 'package:core/utils/app_logger.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/contact_support_capability_extension.dart';
import 'package:model/support/contact_support_capability.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnTapContactSupportAction = Function(ContactSupportCapability contactSupport);
mixin ContactSupportMixin {
void onGetHelpOrReportBug(
ContactSupportCapability contactSupport,
MailboxDashBoardController mailboxDashBoardController,
) {
log('ContactSupportMixin::onGetHelpOrReportBug:contactSupport = $contactSupport');
if (contactSupport.isMailAddressSupported) {
_handleMailAddress(contactSupport.supportMailAddress!, mailboxDashBoardController);
} else if (contactSupport.isHttpLinkSupported) {
_handleHttpLink(contactSupport.httpLink!);
}
}
void _handleMailAddress(
String mailAddress,
MailboxDashBoardController mailboxDashBoardController,
) {
mailboxDashBoardController.goToComposer(
ComposerArguments.fromEmailAddress(EmailAddress(null, mailAddress)),
);
}
void _handleHttpLink(String httpLink) {
AppUtils.launchLink(httpLink);
}
}
@@ -17,6 +17,7 @@ import 'package:model/model.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:rxdart/transformers.dart';
import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart';
import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/mailbox_action_handler_mixin.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
@@ -77,7 +78,8 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart';
class MailboxController extends BaseMailboxController with MailboxActionHandlerMixin {
class MailboxController extends BaseMailboxController
with MailboxActionHandlerMixin, ContactSupportMixin {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final isMailboxListScrollable = false.obs;
@@ -118,7 +118,11 @@ class MailboxView extends BaseMailboxView {
fontWeight: FontWeight.w500,
color: AppColor.primaryColor,
),
onTapActionCallback: () {},
onTapActionCallback: () =>
controller.onGetHelpOrReportBug(
controller.contactSupportCapability!,
controller.mailboxDashBoardController,
),
),
),
],
@@ -101,7 +101,11 @@ class MailboxView extends BaseMailboxView {
fontWeight: FontWeight.w500,
color: AppColor.primaryColor,
),
onTapActionCallback: () {},
onTapActionCallback: () =>
controller.onGetHelpOrReportBug(
controller.contactSupportCapability!,
controller.mailboxDashBoardController,
),
),
),
],
@@ -28,6 +28,7 @@ import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
import 'package:rxdart/transformers.dart';
import 'package:tmail_ui_user/features/base/action/ui_action.dart';
import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart';
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart';
import 'package:tmail_ui_user/features/composer/domain/extensions/email_request_extension.dart';
@@ -166,7 +167,8 @@ import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
import 'package:tmail_ui_user/main/utils/ios_notification_manager.dart';
import 'package:uuid/uuid.dart';
class MailboxDashBoardController extends ReloadableController with UserSettingPopupMenuMixin {
class MailboxDashBoardController extends ReloadableController
with UserSettingPopupMenuMixin, ContactSupportMixin {
final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find<RemoveEmailDraftsInteractor>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
@@ -75,6 +75,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
onShowAppDashboardAction: controller.showAppDashboardAction,
onTapApplicationLogoAction: controller.redirectToInboxAction,
onTapAvatarAction: (position) => controller.handleClickAvatarAction(context, position),
onTapContactSupportAction: (contactSupport) =>
controller.onGetHelpOrReportBug(
contactSupport,
controller,
),
);
}
}),
@@ -5,6 +5,7 @@ import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/presentation/views/image/avatar_builder.dart';
import 'package:flutter/material.dart';
import 'package:model/support/contact_support_capability.dart';
import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart';
import 'package:tmail_ui_user/features/base/widget/application_logo_with_text_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/navigation_bar_style.dart';
@@ -22,6 +23,7 @@ class NavigationBarWidget extends StatelessWidget {
final VoidCallback? onTapApplicationLogoAction;
final VoidCallback? onShowAppDashboardAction;
final OnTapAvatarActionWithPositionClick? onTapAvatarAction;
final OnTapContactSupportAction? onTapContactSupportAction;
const NavigationBarWidget({
super.key,
@@ -33,6 +35,7 @@ class NavigationBarWidget extends StatelessWidget {
this.onShowAppDashboardAction,
this.onTapApplicationLogoAction,
this.onTapAvatarAction,
this.onTapContactSupportAction,
});
@override
@@ -69,7 +72,7 @@ class NavigationBarWidget extends StatelessWidget {
backgroundColor: Colors.transparent,
margin: const EdgeInsetsDirectional.only(end: 8),
tooltipMessage: AppLocalizations.of(context).getHelpOrReportABug,
onTapActionCallback: () {},
onTapActionCallback: () => onTapContactSupportAction?.call(contactSupportCapability!),
),
if (AppConfig.appGridDashboardAvailable && appGridController != null)
Padding(
@@ -109,7 +112,7 @@ class NavigationBarWidget extends StatelessWidget {
backgroundColor: Colors.transparent,
margin: const EdgeInsetsDirectional.only(end: 8),
tooltipMessage: AppLocalizations.of(context).getHelpOrReportABug,
onTapActionCallback: () {},
onTapActionCallback: () => onTapContactSupportAction?.call(contactSupportCapability!),
),
if (AppConfig.appGridDashboardAvailable && appGridController != null)
Padding(
@@ -0,0 +1,11 @@
import 'package:model/support/contact_support_capability.dart';
extension ContactSupportCapabilityExtension on ContactSupportCapability {
bool get isMailAddressSupported =>
supportMailAddress?.trim().isNotEmpty == true;
bool get isHttpLinkSupported =>
httpLink?.trim().isNotEmpty == true;
}
+1
View File
@@ -59,6 +59,7 @@ export 'extensions/properties_extension.dart';
export 'extensions/session_extension.dart';
export 'extensions/username_extension.dart';
export 'extensions/utc_date_extension.dart';
export 'extensions/contact_support_capability_extension.dart';
// Identity
export 'identity/identity_request_dto.dart';
export 'mailbox/expand_mode.dart';
@@ -6,6 +6,7 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/support/contact_support_capability.dart';
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
import '../../fixtures/account_fixtures.dart';
@@ -102,4 +103,103 @@ void main() {
expect(result, isNull);
});
});
group('getContactSupportCapability::test', () {
test('SHOULD return ContactSupportCapability WHEN ContactSupportCapability is available', () {
// Arrange
final contactSupportCapability = ContactSupportCapability(
supportMailAddress: 'contact.support@example.com',
httpLink: 'https://contact.support',
);
final session = Session(
{
SessionExtensions.linagoraContactSupportCapability: contactSupportCapability
},
{
AccountFixtures.aliceAccountId: Account(
AccountName('Alice'),
true,
false,
{
SessionExtensions.linagoraContactSupportCapability: contactSupportCapability
},
)
},
{},
UserName(''),
Uri(),
Uri(),
Uri(),
Uri(),
State(''),
);
// Act
final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId);
// Assert
expect(result?.supportMailAddress, equals(contactSupportCapability.supportMailAddress));
expect(result?.httpLink, equals(contactSupportCapability.httpLink));
});
test('SHOULD return null WHEN ContactSupportCapability is not available', () {
// Arrange
final session = Session(
{
SessionExtensions.linagoraContactSupportCapability: EmptyCapability()
},
{
AccountFixtures.aliceAccountId: Account(
AccountName('Alice'),
true,
false,
{
SessionExtensions.linagoraContactSupportCapability: EmptyCapability()
},
)
},
{},
UserName(''),
Uri(),
Uri(),
Uri(),
Uri(),
State(''),
);
// Act
final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId);
// Assert
expect(result, isNull);
});
test('SHOULD return null WHEN ContactSupportCapability is not supported', () {
// Arrange
final session = Session(
{},
{
AccountFixtures.aliceAccountId: Account(
AccountName('Alice'),
true,
false,
{},
)
},
{},
UserName(''),
Uri(),
Uri(),
Uri(),
Uri(),
State(''),
);
// Act
final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId);
// Assert
expect(result, isNull);
});
});
}