TF-2078 Display calendar event action

(cherry picked from commit 9949b4decc0628487e96f1e9a3c19f3ca94e4c50)
This commit is contained in:
dab246
2023-08-10 18:14:45 +07:00
committed by Dat Vu
parent c598f47948
commit 9529c6c590
5 changed files with 53 additions and 21 deletions
@@ -32,6 +32,7 @@ class TMailButtonWidget extends StatelessWidget {
final List<BoxShadow>? boxShadow; final List<BoxShadow>? boxShadow;
final TextAlign? textAlign; final TextAlign? textAlign;
final bool flexibleText; final bool flexibleText;
final BoxBorder? border;
const TMailButtonWidget({ const TMailButtonWidget({
super.key, super.key,
@@ -59,6 +60,7 @@ class TMailButtonWidget extends StatelessWidget {
this.margin, this.margin,
this.textAlign, this.textAlign,
this.flexibleText = false, this.flexibleText = false,
this.border,
}); });
factory TMailButtonWidget.fromIcon({ factory TMailButtonWidget.fromIcon({
@@ -125,6 +127,8 @@ class TMailButtonWidget extends StatelessWidget {
List<BoxShadow>? boxShadow, List<BoxShadow>? boxShadow,
EdgeInsetsGeometry? margin, EdgeInsetsGeometry? margin,
TextAlign? textAlign, TextAlign? textAlign,
bool flexibleText = false,
BoxBorder? border,
}) { }) {
return TMailButtonWidget( return TMailButtonWidget(
key: key, key: key,
@@ -143,6 +147,8 @@ class TMailButtonWidget extends StatelessWidget {
boxShadow: boxShadow, boxShadow: boxShadow,
margin: margin, margin: margin,
textAlign: textAlign, textAlign: textAlign,
flexibleText: flexibleText,
border: border,
); );
} }
@@ -261,6 +267,7 @@ class TMailButtonWidget extends StatelessWidget {
padding: padding, padding: padding,
margin: margin, margin: margin,
boxShadow: boxShadow, boxShadow: boxShadow,
border: border,
child: childWidget, child: childWidget,
); );
} }
@@ -19,6 +19,7 @@ class TMailContainerWidget extends StatelessWidget {
final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? padding;
final EdgeInsetsGeometry? margin; final EdgeInsetsGeometry? margin;
final List<BoxShadow>? boxShadow; final List<BoxShadow>? boxShadow;
final BoxBorder? border;
const TMailContainerWidget({ const TMailContainerWidget({
super.key, super.key,
@@ -35,6 +36,7 @@ class TMailContainerWidget extends StatelessWidget {
this.padding, this.padding,
this.boxShadow, this.boxShadow,
this.margin, this.margin,
this.border,
}); });
@override @override
@@ -64,6 +66,7 @@ class TMailContainerWidget extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: backgroundColor ?? AppColor.colorButtonHeaderThread, color: backgroundColor ?? AppColor.colorButtonHeaderThread,
borderRadius: BorderRadius.all(Radius.circular(borderRadius)), borderRadius: BorderRadius.all(Radius.circular(borderRadius)),
border: border,
boxShadow: boxShadow boxShadow: boxShadow
), ),
width: width, width: width,
@@ -80,6 +83,7 @@ class TMailContainerWidget extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: backgroundColor ?? AppColor.colorButtonHeaderThread, color: backgroundColor ?? AppColor.colorButtonHeaderThread,
borderRadius: BorderRadius.all(Radius.circular(borderRadius)), borderRadius: BorderRadius.all(Radius.circular(borderRadius)),
border: border,
boxShadow: boxShadow boxShadow: boxShadow
), ),
width: width, width: width,
@@ -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/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/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/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/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/parse_calendar_event_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_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 emailContents = RxnString();
final attachments = <Attachment>[].obs; final attachments = <Attachment>[].obs;
final calendarEvent = Rxn<CalendarEvent>(); final calendarEvent = Rxn<CalendarEvent>();
final eventActions = <EventAction>[].obs;
EmailId? _currentEmailId; EmailId? _currentEmailId;
Identity? _identitySelected; Identity? _identitySelected;
@@ -394,7 +396,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
initialEmailContents = success.emailContent; initialEmailContents = success.emailContent;
attachments.value = success.attachments; attachments.value = success.attachments;
_loadCalendarEventAction(success.attachments.calendarEventBlobIds); _loadCalendarEventAction(
blobIds: success.attachments.calendarEventBlobIds,
emailContents: success.emailContent
);
final isShowMessageReadReceipt = success.emailCurrent?.hasReadReceipt(mailboxDashBoardController.mapMailboxById) == true; final isShowMessageReadReceipt = success.emailCurrent?.hasReadReceipt(mailboxDashBoardController.mapMailboxById) == true;
if (isShowMessageReadReceipt) { if (isShowMessageReadReceipt) {
@@ -421,7 +426,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
initialEmailContents = success.emailContent; initialEmailContents = success.emailContent;
attachments.value = success.attachments; attachments.value = success.attachments;
_loadCalendarEventAction(success.attachments.calendarEventBlobIds); _loadCalendarEventAction(
blobIds: success.attachments.calendarEventBlobIds,
emailContents: success.emailContent
);
if (PlatformInfo.isMobile) { if (PlatformInfo.isMobile) {
final detailedEmail = DetailedEmail( final detailedEmail = DetailedEmail(
@@ -469,6 +477,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
initialEmailContents = null; initialEmailContents = null;
attachments.clear(); attachments.clear();
calendarEvent.value = null; calendarEvent.value = null;
eventActions.clear();
} }
PresentationMailbox? getMailboxContain(PresentationEmail email) { PresentationMailbox? getMailboxContain(PresentationEmail email) {
@@ -1238,19 +1247,21 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
} }
void _loadCalendarEventAction(Set<Id> blobIds) { void _loadCalendarEventAction({
required Set<Id> blobIds,
required String emailContents
}) {
log('SingleEmailController::_loadCalendarEventAction:blobIds: $blobIds'); log('SingleEmailController::_loadCalendarEventAction:blobIds: $blobIds');
if (_isCalendarEventSupported) { if (_isCalendarEventSupported &&
if (currentEmail?.hasCalendarEvent == true && currentEmail?.hasCalendarEvent == true &&
blobIds.isNotEmpty && blobIds.isNotEmpty &&
mailboxDashBoardController.accountId.value != null) { mailboxDashBoardController.accountId.value != null
_parseCalendarEventAction( ) {
mailboxDashBoardController.accountId.value!, _parseCalendarEventAction(
blobIds accountId: mailboxDashBoardController.accountId.value!,
); blobIds: blobIds,
} else { emailContents: emailContents
logError('SingleEmailController::_loadCalendarEventAction: not found calendar event header'); );
}
} else { } else {
logError('SingleEmailController::_loadCalendarEventAction: calendar event not supported'); logError('SingleEmailController::_loadCalendarEventAction: calendar event not supported');
} }
@@ -1264,21 +1275,24 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
CapabilityIdentifier.jamesCalendarEvent.isSupported(session, accountId); CapabilityIdentifier.jamesCalendarEvent.isSupported(session, accountId);
} }
void _parseCalendarEventAction(AccountId accountId, Set<Id> blobIds) { void _parseCalendarEventAction({
required AccountId accountId,
required Set<Id> blobIds,
required String emailContents
}) {
log("SingleEmailController::_parseCalendarEventAction:blobIds: $blobIds"); log("SingleEmailController::_parseCalendarEventAction:blobIds: $blobIds");
if (_parseCalendarEventInteractor != null) { if (_parseCalendarEventInteractor != null) {
consumeState(_parseCalendarEventInteractor!.execute(accountId, blobIds)); consumeState(_parseCalendarEventInteractor!.execute(accountId, blobIds, emailContents));
} else { } else {
logError("SingleEmailController::_parseCalendarEventAction: _parseCalendarEventInteractor is NULL"); logError("SingleEmailController::_parseCalendarEventAction: _parseCalendarEventInteractor is NULL");
} }
} }
void _handleParseCalendarEventSuccess(ParseCalendarEventSuccess success) { void _handleParseCalendarEventSuccess(ParseCalendarEventSuccess success) {
if (success.calendarEventList.isNotEmpty) { calendarEvent.value = success.calendarEventList.first;
calendarEvent.value = success.calendarEventList.first; eventActions.value = success.eventActionList;
if (PlatformInfo.isMobile) { if (PlatformInfo.isMobile) {
_enableScrollPageView(); _enableScrollPageView();
}
} }
} }
@@ -308,6 +308,7 @@ class EmailView extends GetWidget<SingleEmailController> with AppLoaderMixin {
), ),
CalendarEventDetailWidget( CalendarEventDetailWidget(
calendarEvent: calendarEvent, calendarEvent: calendarEvent,
eventActions: controller.eventActions,
onOpenComposerAction: controller.openNewComposerAction, onOpenComposerAction: controller.openNewComposerAction,
onOpenNewTabAction: controller.openNewTabAction, onOpenNewTabAction: controller.openNewTabAction,
), ),
@@ -1,8 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.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/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/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_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_description_detail_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_link_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 { class CalendarEventDetailWidget extends StatelessWidget {
final CalendarEvent calendarEvent; final CalendarEvent calendarEvent;
final List<EventAction> eventActions;
final OnOpenNewTabAction? onOpenNewTabAction; final OnOpenNewTabAction? onOpenNewTabAction;
final OnOpenComposerAction? onOpenComposerAction; final OnOpenComposerAction? onOpenComposerAction;
const CalendarEventDetailWidget({ const CalendarEventDetailWidget({
super.key, super.key,
required this.calendarEvent, required this.calendarEvent,
required this.eventActions,
this.onOpenNewTabAction, this.onOpenNewTabAction,
this.onOpenComposerAction, this.onOpenComposerAction,
}); });
@@ -79,6 +83,8 @@ class CalendarEventDetailWidget extends StatelessWidget {
organizer: calendarEvent.organizer!, organizer: calendarEvent.organizer!,
), ),
), ),
if (eventActions.isNotEmpty)
CalendarEventActionButtonWidget(eventActions: eventActions),
], ],
), ),
); );