TF-2078 Display calendar event action
(cherry picked from commit 9949b4decc0628487e96f1e9a3c19f3ca94e4c50)
This commit is contained in:
@@ -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,
|
||||||
),
|
),
|
||||||
|
|||||||
+6
@@ -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),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user