From 9529c6c5900ac5643bae27e2a41ca3e1e5c4b65c Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 10 Aug 2023 18:14:45 +0700 Subject: [PATCH] TF-2078 Display calendar event action (cherry picked from commit 9949b4decc0628487e96f1e9a3c19f3ca94e4c50) --- .../views/button/tmail_button_widget.dart | 7 +++ .../container/tmail_container_widget.dart | 4 ++ .../controller/single_email_controller.dart | 56 ++++++++++++------- .../email/presentation/email_view.dart | 1 + .../calendar_event_detail_widget.dart | 6 ++ 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/core/lib/presentation/views/button/tmail_button_widget.dart b/core/lib/presentation/views/button/tmail_button_widget.dart index 14cb55221..05a538b95 100644 --- a/core/lib/presentation/views/button/tmail_button_widget.dart +++ b/core/lib/presentation/views/button/tmail_button_widget.dart @@ -32,6 +32,7 @@ class TMailButtonWidget extends StatelessWidget { final List? boxShadow; final TextAlign? textAlign; final bool flexibleText; + final BoxBorder? border; const TMailButtonWidget({ super.key, @@ -59,6 +60,7 @@ class TMailButtonWidget extends StatelessWidget { this.margin, this.textAlign, this.flexibleText = false, + this.border, }); factory TMailButtonWidget.fromIcon({ @@ -125,6 +127,8 @@ class TMailButtonWidget extends StatelessWidget { List? boxShadow, EdgeInsetsGeometry? margin, TextAlign? textAlign, + bool flexibleText = false, + BoxBorder? border, }) { return TMailButtonWidget( key: key, @@ -143,6 +147,8 @@ class TMailButtonWidget extends StatelessWidget { boxShadow: boxShadow, margin: margin, textAlign: textAlign, + flexibleText: flexibleText, + border: border, ); } @@ -261,6 +267,7 @@ class TMailButtonWidget extends StatelessWidget { padding: padding, margin: margin, boxShadow: boxShadow, + border: border, child: childWidget, ); } diff --git a/core/lib/presentation/views/container/tmail_container_widget.dart b/core/lib/presentation/views/container/tmail_container_widget.dart index 0ab8215b1..307bdc3df 100644 --- a/core/lib/presentation/views/container/tmail_container_widget.dart +++ b/core/lib/presentation/views/container/tmail_container_widget.dart @@ -19,6 +19,7 @@ class TMailContainerWidget extends StatelessWidget { final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? margin; final List? boxShadow; + final BoxBorder? border; const TMailContainerWidget({ super.key, @@ -35,6 +36,7 @@ class TMailContainerWidget extends StatelessWidget { this.padding, this.boxShadow, this.margin, + this.border, }); @override @@ -64,6 +66,7 @@ class TMailContainerWidget extends StatelessWidget { decoration: BoxDecoration( color: backgroundColor ?? AppColor.colorButtonHeaderThread, borderRadius: BorderRadius.all(Radius.circular(borderRadius)), + border: border, boxShadow: boxShadow ), width: width, @@ -80,6 +83,7 @@ class TMailContainerWidget extends StatelessWidget { decoration: BoxDecoration( color: backgroundColor ?? AppColor.colorButtonHeaderThread, borderRadius: BorderRadius.all(Radius.circular(borderRadius)), + border: border, boxShadow: boxShadow ), width: width, diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index b4196c76c..68277eb13 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -29,6 +29,7 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/email_ac import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/email/domain/extensions/list_attachments_extension.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_interactor.dart'; @@ -112,6 +113,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { final emailContents = RxnString(); final attachments = [].obs; final calendarEvent = Rxn(); + final eventActions = [].obs; EmailId? _currentEmailId; Identity? _identitySelected; @@ -394,7 +396,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin { initialEmailContents = success.emailContent; attachments.value = success.attachments; - _loadCalendarEventAction(success.attachments.calendarEventBlobIds); + _loadCalendarEventAction( + blobIds: success.attachments.calendarEventBlobIds, + emailContents: success.emailContent + ); final isShowMessageReadReceipt = success.emailCurrent?.hasReadReceipt(mailboxDashBoardController.mapMailboxById) == true; if (isShowMessageReadReceipt) { @@ -421,7 +426,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin { initialEmailContents = success.emailContent; attachments.value = success.attachments; - _loadCalendarEventAction(success.attachments.calendarEventBlobIds); + _loadCalendarEventAction( + blobIds: success.attachments.calendarEventBlobIds, + emailContents: success.emailContent + ); if (PlatformInfo.isMobile) { final detailedEmail = DetailedEmail( @@ -469,6 +477,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { initialEmailContents = null; attachments.clear(); calendarEvent.value = null; + eventActions.clear(); } PresentationMailbox? getMailboxContain(PresentationEmail email) { @@ -1238,19 +1247,21 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } } - void _loadCalendarEventAction(Set blobIds) { + void _loadCalendarEventAction({ + required Set blobIds, + required String emailContents + }) { log('SingleEmailController::_loadCalendarEventAction:blobIds: $blobIds'); - if (_isCalendarEventSupported) { - if (currentEmail?.hasCalendarEvent == true && - blobIds.isNotEmpty && - mailboxDashBoardController.accountId.value != null) { - _parseCalendarEventAction( - mailboxDashBoardController.accountId.value!, - blobIds - ); - } else { - logError('SingleEmailController::_loadCalendarEventAction: not found calendar event header'); - } + if (_isCalendarEventSupported && + currentEmail?.hasCalendarEvent == true && + blobIds.isNotEmpty && + mailboxDashBoardController.accountId.value != null + ) { + _parseCalendarEventAction( + accountId: mailboxDashBoardController.accountId.value!, + blobIds: blobIds, + emailContents: emailContents + ); } else { logError('SingleEmailController::_loadCalendarEventAction: calendar event not supported'); } @@ -1264,21 +1275,24 @@ class SingleEmailController extends BaseController with AppLoaderMixin { CapabilityIdentifier.jamesCalendarEvent.isSupported(session, accountId); } - void _parseCalendarEventAction(AccountId accountId, Set blobIds) { + void _parseCalendarEventAction({ + required AccountId accountId, + required Set blobIds, + required String emailContents + }) { log("SingleEmailController::_parseCalendarEventAction:blobIds: $blobIds"); if (_parseCalendarEventInteractor != null) { - consumeState(_parseCalendarEventInteractor!.execute(accountId, blobIds)); + consumeState(_parseCalendarEventInteractor!.execute(accountId, blobIds, emailContents)); } else { logError("SingleEmailController::_parseCalendarEventAction: _parseCalendarEventInteractor is NULL"); } } void _handleParseCalendarEventSuccess(ParseCalendarEventSuccess success) { - if (success.calendarEventList.isNotEmpty) { - calendarEvent.value = success.calendarEventList.first; - if (PlatformInfo.isMobile) { - _enableScrollPageView(); - } + calendarEvent.value = success.calendarEventList.first; + eventActions.value = success.eventActionList; + if (PlatformInfo.isMobile) { + _enableScrollPageView(); } } diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 204647953..bc2ec8fc1 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -308,6 +308,7 @@ class EmailView extends GetWidget with AppLoaderMixin { ), CalendarEventDetailWidget( calendarEvent: calendarEvent, + eventActions: controller.eventActions, onOpenComposerAction: controller.openNewComposerAction, onOpenNewTabAction: controller.openNewTabAction, ), diff --git a/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart index d54ec519c..122cfdf60 100644 --- a/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/calendar_event_detail_widget_styles.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_button_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart'; @@ -13,12 +15,14 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event class CalendarEventDetailWidget extends StatelessWidget { final CalendarEvent calendarEvent; + final List eventActions; final OnOpenNewTabAction? onOpenNewTabAction; final OnOpenComposerAction? onOpenComposerAction; const CalendarEventDetailWidget({ super.key, required this.calendarEvent, + required this.eventActions, this.onOpenNewTabAction, this.onOpenComposerAction, }); @@ -79,6 +83,8 @@ class CalendarEventDetailWidget extends StatelessWidget { organizer: calendarEvent.organizer!, ), ), + if (eventActions.isNotEmpty) + CalendarEventActionButtonWidget(eventActions: eventActions), ], ), );