From 2e68e7df7daf5dc7f9646ec33bbc317282b4d746 Mon Sep 17 00:00:00 2001 From: DatDang Date: Fri, 17 May 2024 14:44:36 +0700 Subject: [PATCH] TF-2859 Add language when reply calendar invitation --- .../datasource/calendar_event_datasource.dart | 15 ++++-- .../calendar_event_datasource_impl.dart | 21 ++++++--- .../data/network/calendar_event_api.dart | 27 +++++++++-- .../calendar_event_repository_impl.dart | 27 ++++++++--- .../repository/calendar_event_repository.dart | 15 ++++-- .../calendar_event_accept_interactor.dart | 4 +- .../calendar_event_reject_interactor.dart | 4 +- .../maybe_calendar_event_interactor.dart | 4 +- .../controller/single_email_controller.dart | 46 ++++++++++++++----- model/lib/extensions/session_extension.dart | 34 ++++++++++++++ 10 files changed, 161 insertions(+), 36 deletions(-) diff --git a/lib/features/email/data/datasource/calendar_event_datasource.dart b/lib/features/email/data/datasource/calendar_event_datasource.dart index 8e12a76ec..7097a82b4 100644 --- a/lib/features/email/data/datasource/calendar_event_datasource.dart +++ b/lib/features/email/data/datasource/calendar_event_datasource.dart @@ -9,9 +9,18 @@ import 'package:tmail_ui_user/features/email/presentation/model/blob_calendar_ev abstract class CalendarEventDataSource { Future> parse(AccountId accountId, Set blobIds); - Future acceptEventInvitation(AccountId accountId, Set blobIds); + Future acceptEventInvitation( + AccountId accountId, + Set blobIds, + String? language); - Future maybeEventInvitation(AccountId accountId, Set blobIds); + Future maybeEventInvitation( + AccountId accountId, + Set blobIds, + String? language); - Future rejectEventInvitation(AccountId accountId, Set blobIds); + Future rejectEventInvitation( + AccountId accountId, + Set blobIds, + String? language); } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/calendar_event_datasource_impl.dart b/lib/features/email/data/datasource_impl/calendar_event_datasource_impl.dart index de1c14e7d..f969482d4 100644 --- a/lib/features/email/data/datasource_impl/calendar_event_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/calendar_event_datasource_impl.dart @@ -24,23 +24,32 @@ class CalendarEventDataSourceImpl extends CalendarEventDataSource { } @override - Future acceptEventInvitation(AccountId accountId, Set blobIds) { + Future acceptEventInvitation( + AccountId accountId, + Set blobIds, + String? language) { return Future.sync(() async { - return await _calendarEventAPI.acceptEventInvitation(accountId, blobIds); + return await _calendarEventAPI.acceptEventInvitation(accountId, blobIds, language); }).catchError(_exceptionThrower.throwException); } @override - Future maybeEventInvitation(AccountId accountId, Set blobIds) { + Future maybeEventInvitation( + AccountId accountId, + Set blobIds, + String? language) { return Future.sync(() async { - return await _calendarEventAPI.maybe(accountId, blobIds); + return await _calendarEventAPI.maybeEventInvitation(accountId, blobIds, language); }).catchError(_exceptionThrower.throwException); } @override - Future rejectEventInvitation(AccountId accountId, Set blobIds) { + Future rejectEventInvitation( + AccountId accountId, + Set blobIds, + String? language) { return Future.sync(() async { - return await _calendarEventAPI.reject(accountId, blobIds); + return await _calendarEventAPI.rejectEventInvitation(accountId, blobIds, language); }).catchError(_exceptionThrower.throwException); } } \ No newline at end of file diff --git a/lib/features/email/data/network/calendar_event_api.dart b/lib/features/email/data/network/calendar_event_api.dart index 9c71693fd..002ef5086 100644 --- a/lib/features/email/data/network/calendar_event_api.dart +++ b/lib/features/email/data/network/calendar_event_api.dart @@ -49,11 +49,18 @@ class CalendarEventAPI { } } - Future acceptEventInvitation(AccountId accountId, Set blobIds) async { + Future acceptEventInvitation( + AccountId accountId, + Set blobIds, + String? language + ) async { final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final calendarEventAcceptMethod = CalendarEventAcceptMethod( accountId, blobIds: blobIds.toList()); + if (language != null) { + calendarEventAcceptMethod.addLanguage(language); + } final calendarEventAcceptInvocation = requestBuilder.invocation(calendarEventAcceptMethod); final response = await (requestBuilder..usings(calendarEventAcceptMethod.requiredCapabilities)) .build() @@ -70,11 +77,18 @@ class CalendarEventAPI { return calendarEventAcceptResponse; } - Future maybe(AccountId accountId, Set blobIds) async { + Future maybeEventInvitation( + AccountId accountId, + Set blobIds, + String? language + ) async { final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final calendarEventMaybeMethod = CalendarEventMaybeMethod( accountId, blobIds: blobIds.toList()); + if (language != null) { + calendarEventMaybeMethod.addLanguage(language); + } final calendarEventMaybeInvocation = requestBuilder.invocation(calendarEventMaybeMethod); final response = await (requestBuilder..usings(calendarEventMaybeMethod.requiredCapabilities)) .build() @@ -91,11 +105,18 @@ class CalendarEventAPI { return calendarEventMaybeResponse; } - Future reject(AccountId accountId, Set blobIds) async { + Future rejectEventInvitation( + AccountId accountId, + Set blobIds, + String? language + ) async { final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final calendarEventRejectMethod = CalendarEventRejectMethod( accountId, blobIds: blobIds.toList()); + if (language != null) { + calendarEventRejectMethod.addLanguage(language); + } final calendarEventRejectInvocation = requestBuilder.invocation(calendarEventRejectMethod); final response = await (requestBuilder..usings(calendarEventRejectMethod.requiredCapabilities)) .build() diff --git a/lib/features/email/data/repository/calendar_event_repository_impl.dart b/lib/features/email/data/repository/calendar_event_repository_impl.dart index 7b0b515a6..49c59dce7 100644 --- a/lib/features/email/data/repository/calendar_event_repository_impl.dart +++ b/lib/features/email/data/repository/calendar_event_repository_impl.dart @@ -21,17 +21,32 @@ class CalendarEventRepositoryImpl extends CalendarEventRepository { } @override - Future acceptEventInvitation(AccountId accountId, Set blobIds) { - return _calendarEventDataSource[DataSourceType.network]!.acceptEventInvitation(accountId, blobIds); + Future acceptEventInvitation( + AccountId accountId, + Set blobIds, + String? language + ) { + return _calendarEventDataSource[DataSourceType.network]! + .acceptEventInvitation(accountId, blobIds, language); } @override - Future maybeEventInvitation(AccountId accountId, Set blobIds) { - return _calendarEventDataSource[DataSourceType.network]!.maybeEventInvitation(accountId, blobIds); + Future maybeEventInvitation( + AccountId accountId, + Set blobIds, + String? language + ) { + return _calendarEventDataSource[DataSourceType.network]! + .maybeEventInvitation(accountId, blobIds, language); } @override - Future rejectEventInvitation(AccountId accountId, Set blobIds) { - return _calendarEventDataSource[DataSourceType.network]!.rejectEventInvitation(accountId, blobIds); + Future rejectEventInvitation( + AccountId accountId, + Set blobIds, + String? language + ) { + return _calendarEventDataSource[DataSourceType.network]! + .rejectEventInvitation(accountId, blobIds, language); } } \ No newline at end of file diff --git a/lib/features/email/domain/repository/calendar_event_repository.dart b/lib/features/email/domain/repository/calendar_event_repository.dart index 903bc7339..de287e0e4 100644 --- a/lib/features/email/domain/repository/calendar_event_repository.dart +++ b/lib/features/email/domain/repository/calendar_event_repository.dart @@ -9,9 +9,18 @@ import 'package:jmap_dart_client/jmap/mail/calendar/reply/calendar_event_reject_ abstract class CalendarEventRepository { Future> parse(AccountId accountId, Set blobIds); - Future acceptEventInvitation(AccountId accountId, Set blobIds); + Future acceptEventInvitation( + AccountId accountId, + Set blobIds, + String? language); - Future maybeEventInvitation(AccountId accountId, Set blobIds); + Future maybeEventInvitation( + AccountId accountId, + Set blobIds, + String? language); - Future rejectEventInvitation(AccountId accountId, Set blobIds); + Future rejectEventInvitation( + AccountId accountId, + Set blobIds, + String? language); } \ No newline at end of file diff --git a/lib/features/email/domain/usecases/calendar_event_accept_interactor.dart b/lib/features/email/domain/usecases/calendar_event_accept_interactor.dart index 75abe8236..77db8b204 100644 --- a/lib/features/email/domain/usecases/calendar_event_accept_interactor.dart +++ b/lib/features/email/domain/usecases/calendar_event_accept_interactor.dart @@ -16,10 +16,12 @@ class AcceptCalendarEventInteractor { AccountId accountId, Set blobIds, EmailId emailId, + String? language ) async* { try { yield Right(CalendarEventAccepting()); - final result = await _calendarEventRepository.acceptEventInvitation(accountId, blobIds); + final result = await _calendarEventRepository + .acceptEventInvitation(accountId, blobIds, language); yield Right(CalendarEventAccepted(result, emailId)); } catch (e) { yield Left(CalendarEventAcceptFailure(exception: e)); diff --git a/lib/features/email/domain/usecases/calendar_event_reject_interactor.dart b/lib/features/email/domain/usecases/calendar_event_reject_interactor.dart index a86c90823..bd31cc75f 100644 --- a/lib/features/email/domain/usecases/calendar_event_reject_interactor.dart +++ b/lib/features/email/domain/usecases/calendar_event_reject_interactor.dart @@ -16,10 +16,12 @@ class RejectCalendarEventInteractor { AccountId accountId, Set blobIds, EmailId emailId, + String? language ) async* { try { yield Right(CalendarEventRejecting()); - final result = await _calendarEventRepository.rejectEventInvitation(accountId, blobIds); + final result = await _calendarEventRepository + .rejectEventInvitation(accountId, blobIds, language); yield Right(CalendarEventRejected(result, emailId)); } catch (e) { yield Left(CalendarEventRejectFailure(exception: e)); diff --git a/lib/features/email/domain/usecases/maybe_calendar_event_interactor.dart b/lib/features/email/domain/usecases/maybe_calendar_event_interactor.dart index aa96df53a..aa9838dd0 100644 --- a/lib/features/email/domain/usecases/maybe_calendar_event_interactor.dart +++ b/lib/features/email/domain/usecases/maybe_calendar_event_interactor.dart @@ -16,10 +16,12 @@ class MaybeCalendarEventInteractor { AccountId accountId, Set blobIds, EmailId emailId, + String? language ) async* { try { yield Right(CalendarEventMaybeReplying()); - final result = await _calendarEventRepository.maybeEventInvitation(accountId, blobIds); + final result = await _calendarEventRepository + .maybeEventInvitation(accountId, blobIds, language); yield Right(CalendarEventMaybeSuccess(result, emailId)); } catch (e) { yield Left(CalendarEventMaybeFailure(exception: e)); diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 55d49f7d5..645ad5b1d 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -100,6 +100,7 @@ import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants. import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/localizations/localization_service.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/dialog_router.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart'; @@ -1729,42 +1730,63 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void _acceptCalendarEventAction(EmailId emailId) { if (_acceptCalendarEventInteractor == null || _displayingEventBlobId == null - || mailboxDashBoardController.accountId.value == null) { - consumeState(Stream.value(Left(CalendarEventAcceptFailure()))); + || mailboxDashBoardController.accountId.value == null + || mailboxDashBoardController.sessionCurrent == null + || mailboxDashBoardController.sessionCurrent + !.validateCalendarEventCapability(mailboxDashBoardController.accountId.value!) + .isAvailable == false + ) { + consumeState(Stream.value(Left(CalendarEventAcceptFailure()))); } else { consumeState(_acceptCalendarEventInteractor!.execute( mailboxDashBoardController.accountId.value!, {_displayingEventBlobId!}, - emailId - )); + emailId, + mailboxDashBoardController.sessionCurrent!.getLanguageForCalendarEvent( + LocalizationService.getLocaleFromLanguage(), + mailboxDashBoardController.accountId.value!))); } } void _rejectCalendarEventAction(EmailId emailId) { if (_rejectCalendarEventInteractor == null || _displayingEventBlobId == null - || mailboxDashBoardController.accountId.value == null) { - consumeState(Stream.value(Left(CalendarEventRejectFailure()))); + || mailboxDashBoardController.accountId.value == null + || mailboxDashBoardController.sessionCurrent == null + || mailboxDashBoardController.sessionCurrent + !.validateCalendarEventCapability(mailboxDashBoardController.accountId.value!) + .isAvailable == false + ) { + consumeState(Stream.value(Left(CalendarEventRejectFailure()))); } else { consumeState(_rejectCalendarEventInteractor!.execute( mailboxDashBoardController.accountId.value!, {_displayingEventBlobId!}, - emailId - )); + emailId, + mailboxDashBoardController.sessionCurrent!.getLanguageForCalendarEvent( + LocalizationService.getLocaleFromLanguage(), + mailboxDashBoardController.accountId.value!))); } } void _maybeCalendarEventAction(EmailId emailId) { if (_maybeCalendarEventInteractor == null || _displayingEventBlobId == null - || mailboxDashBoardController.accountId.value == null) { - consumeState(Stream.value(Left(CalendarEventMaybeFailure()))); + || mailboxDashBoardController.accountId.value == null + || mailboxDashBoardController.sessionCurrent == null + || mailboxDashBoardController.sessionCurrent + !.validateCalendarEventCapability(mailboxDashBoardController.accountId.value!) + .isAvailable == false + ) { + consumeState(Stream.value(Left(CalendarEventMaybeFailure()))); } else { consumeState(_maybeCalendarEventInteractor!.execute( mailboxDashBoardController.accountId.value!, {_displayingEventBlobId!}, - emailId - )); + emailId, + mailboxDashBoardController.sessionCurrent!.getLanguageForCalendarEvent( + LocalizationService.getLocaleFromLanguage(), + mailboxDashBoardController.accountId.value!))); } } diff --git a/model/lib/extensions/session_extension.dart b/model/lib/extensions/session_extension.dart index 03b9e6ecf..48126265c 100644 --- a/model/lib/extensions/session_extension.dart +++ b/model/lib/extensions/session_extension.dart @@ -1,6 +1,9 @@ +import 'dart:ui'; + import 'package:core/presentation/extensions/uri_extension.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/capability/calendar_event_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart'; import 'package:jmap_dart_client/jmap/core/capability/empty_capability.dart'; @@ -63,4 +66,35 @@ extension SessionExtension on Session { } throw NotFoundPersonalAccountException(); } + + ({ + bool isAvailable, + CalendarEventCapability? calendarEventCapability + }) validateCalendarEventCapability(AccountId accountId) { + final capability = getCapabilityProperties( + accountId, + CapabilityIdentifier.jamesCalendarEvent); + + return (isAvailable: capability != null, calendarEventCapability: capability); + } + + String? getLanguageForCalendarEvent( + Locale locale, + AccountId accountId, + ) { + final validation = validateCalendarEventCapability(accountId); + if (!validation.isAvailable) return null; + + final supportedLanguages = validation.calendarEventCapability!.replySupportedLanguage; + if (supportedLanguages == null) return null; + + final currentLanguage = locale.languageCode; + if (supportedLanguages.contains(currentLanguage)) { + return currentLanguage; + } else if (supportedLanguages.contains('en')) { + return 'en'; + } else { + return supportedLanguages.firstOrNull; + } + } } \ No newline at end of file