TF-3591 Implement CalendarEventCounter/accept method

This commit is contained in:
DatDang
2025-04-16 09:37:42 +07:00
committed by Dat H. Pham
parent 037fcc03a1
commit 9df53ef6b9
27 changed files with 256 additions and 21 deletions
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/email/data/network/calendar_event_api.dar
import 'package:tmail_ui_user/features/email/data/repository/calendar_event_repository_impl.dart';
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_accept_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_counter_accept_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/maybe_calendar_event_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_reject_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart';
@@ -42,6 +43,7 @@ class CalendarEventInteractorBindings extends InteractorsBindings {
Get.lazyPut(() => AcceptCalendarEventInteractor(Get.find<CalendarEventRepository>()));
Get.lazyPut(() => MaybeCalendarEventInteractor(Get.find<CalendarEventRepository>()));
Get.lazyPut(() => RejectCalendarEventInteractor(Get.find<CalendarEventRepository>()));
Get.lazyPut(() => AcceptCounterCalendarEventInteractor(Get.find<CalendarEventRepository>()));
}
@override
@@ -58,6 +58,7 @@ import 'package:tmail_ui_user/features/email/domain/model/preview_email_eml_requ
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
import 'package:tmail_ui_user/features/email/domain/model/view_entire_message_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_accept_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_counter_accept_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_maybe_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reject_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reply_state.dart';
@@ -80,6 +81,7 @@ import 'package:tmail_ui_user/features/email/domain/state/print_email_state.dart
import 'package:tmail_ui_user/features/email/domain/state/send_receipt_to_sender_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_accept_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_counter_accept_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_all_attachments_for_web_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/export_all_attachments_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/get_entire_message_as_document_interactor.dart';
@@ -184,6 +186,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
AcceptCalendarEventInteractor? _acceptCalendarEventInteractor;
MaybeCalendarEventInteractor? _maybeCalendarEventInteractor;
RejectCalendarEventInteractor? _rejectCalendarEventInteractor;
AcceptCounterCalendarEventInteractor? _acceptCounterCalendarEventInteractor;
final emailContents = RxnString();
final attachments = <Attachment>[].obs;
@@ -535,6 +538,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
_acceptCalendarEventInteractor = getBinding<AcceptCalendarEventInteractor>();
_maybeCalendarEventInteractor = getBinding<MaybeCalendarEventInteractor>();
_rejectCalendarEventInteractor = getBinding<RejectCalendarEventInteractor>();
_acceptCounterCalendarEventInteractor = getBinding<AcceptCounterCalendarEventInteractor>();
}
void _injectCalendarEventBindings(Session? session, AccountId? accountId) {
@@ -2084,6 +2088,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
case EventActionType.yes:
_acceptCalendarEventAction(emailId);
break;
case EventActionType.acceptCounter:
_acceptCounterCalendarEventAction(emailId);
case EventActionType.maybe:
_maybeCalendarEventAction(emailId);
break;
@@ -2095,6 +2101,25 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
}
}
void _acceptCounterCalendarEventAction(EmailId emailId) {
if (canNotAcceptCounterCalendarEvent) {
consumeState(Stream.value(Left(CalendarEventCounterAcceptFailure())));
} else {
consumeState(_acceptCounterCalendarEventInteractor!.execute(
accountId!,
{_displayingEventBlobId!},
emailId,
));
}
}
bool get canNotAcceptCounterCalendarEvent => _acceptCounterCalendarEventInteractor == null
|| _displayingEventBlobId == null
|| accountId == null
|| session == null
|| session!.validateCalendarEventCapability(accountId!).isAvailable == false
|| !session!.validateAcceptCounterCalendarEventCapability(accountId!);
void _acceptCalendarEventAction(EmailId emailId) {
if (_acceptCalendarEventInteractor == null
|| _displayingEventBlobId == null
@@ -2167,7 +2192,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
appToast.showToastSuccessMessage(
currentOverlayContext!,
success.getEventActionType().getToastMessageSuccess(currentContext!));
success.getEventActionType().getToastMessageSuccess(currentContext!),
);
}
void _calendarEventFailure(Failure failure) {
@@ -366,12 +366,13 @@ class EmailView extends GetWidget<SingleEmailController> {
onOpenComposerAction: controller.openNewComposerAction,
onOpenNewTabAction: controller.openNewTabAction,
onCalendarEventReplyActionClick: (eventActionType) =>
controller.onCalendarEventReplyAction(eventActionType, presentationEmail.id!),
controller.onCalendarEventReplyAction(eventActionType, presentationEmail.id!),
calendarEventReplying: controller.calendarEventProcessing,
attendanceStatus: controller.attendanceStatus.value,
onMailtoAttendeesAction: controller.handleMailToAttendees,
openEmailAddressDetailAction: controller.openEmailAddressDialog,
isFree: controller.isCalendarEventFree,
listEmailAddressSender: emailAddressSender ?? [],
)),
if (_validateDisplayEventActionBanner(
context: context,
@@ -1,6 +1,7 @@
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/attendance/calendar_event_attendance.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_accept_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_counter_accept_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_maybe_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reject_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart';
@@ -15,6 +16,7 @@ extension UpdateAttendanceStatusExtension on SingleEmailController {
CalendarEventAccepted() => AttendanceStatus.accepted,
CalendarEventMaybeSuccess() => AttendanceStatus.tentativelyAccepted,
CalendarEventRejected() => AttendanceStatus.rejected,
CalendarEventCounterAccepted() => AttendanceStatus.accepted,
_ => attendanceStatus.value,
};
}
@@ -3,6 +3,8 @@ import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/attendance/calendar_event_attendance.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/properties/event_method.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/list_event_actions_extension.dart';
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
import 'package:tmail_ui_user/features/email/presentation/styles/calendar_event_action_button_widget_styles.dart';
@@ -13,6 +15,7 @@ class CalendarEventActionButtonWidget extends StatelessWidget {
final EdgeInsetsGeometry? margin;
final OnCalendarEventReplyActionClick onCalendarEventReplyActionClick;
final bool calendarEventReplying;
final EventMethod? eventMethod;
final AttendanceStatus? attendanceStatus;
final VoidCallback? onMailToAttendeesAction;
@@ -22,6 +25,7 @@ class CalendarEventActionButtonWidget extends StatelessWidget {
super.key,
required this.onCalendarEventReplyActionClick,
required this.calendarEventReplying,
required this.eventMethod,
this.margin,
this.attendanceStatus,
this.onMailToAttendeesAction,
@@ -39,6 +43,7 @@ class CalendarEventActionButtonWidget extends StatelessWidget {
spacing: CalendarEventActionButtonWidgetStyles.space,
runSpacing: CalendarEventActionButtonWidgetStyles.space,
children: EventActionType.values
.validActionsOfEventMethod(eventMethod)
.map((action) => AbsorbPointer(
absorbing: _getCallbackFunction(action) == null,
child: TMailButtonWidget(
@@ -99,6 +104,7 @@ class CalendarEventActionButtonWidget extends StatelessWidget {
return CalendarEventActionButtonWidgetStyles.backgroundColor;
case EventActionType.mailToAttendees:
case EventActionType.acceptCounter:
return CalendarEventActionButtonWidgetStyles.backgroundColor;
}
}
@@ -124,6 +130,7 @@ class CalendarEventActionButtonWidget extends StatelessWidget {
return CalendarEventActionButtonWidgetStyles.textColor;
case EventActionType.mailToAttendees:
case EventActionType.acceptCounter:
return CalendarEventActionButtonWidgetStyles.textColor;
}
}
@@ -149,6 +156,7 @@ class CalendarEventActionButtonWidget extends StatelessWidget {
return CalendarEventActionButtonWidgetStyles.textColor;
case EventActionType.mailToAttendees:
case EventActionType.acceptCounter:
return CalendarEventActionButtonWidgetStyles.textColor;
}
}
@@ -160,6 +168,8 @@ class CalendarEventActionButtonWidget extends StatelessWidget {
return null;
}
return () => onCalendarEventReplyActionClick(eventActionType);
case EventActionType.acceptCounter:
return () => onCalendarEventReplyActionClick(eventActionType);
case EventActionType.maybe:
if (attendanceStatus == AttendanceStatus.tentativelyAccepted || calendarEventReplying) {
return null;
@@ -16,7 +16,6 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_time_information_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_title_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_sender_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnOpenNewTabAction = void Function(String link);
@@ -33,6 +32,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
final OnMailtoAttendeesAction? onMailtoAttendeesAction;
final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction;
final bool isFree;
final List<String> listEmailAddressSender;
final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -47,6 +47,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
this.attendanceStatus,
this.onMailtoAttendeesAction,
this.openEmailAddressDetailAction,
this.listEmailAddressSender = const [],
});
@override
@@ -107,7 +108,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
fontWeight: FontWeight.w700
),
),
TextSpan(text: AppLocalizations.of(context).invitationMessageCalendarInformation)
TextSpan(text: calendarEvent.getTitleEventAction(context, listEmailAddressSender))
]
)
),
@@ -142,6 +143,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
CalendarEventActionButtonWidget(
margin: EdgeInsetsDirectional.zero,
onCalendarEventReplyActionClick: onCalendarEventReplyActionClick,
eventMethod: calendarEvent.method,
calendarEventReplying: calendarEventReplying,
attendanceStatus: attendanceStatus,
onMailToAttendeesAction: () => onMailtoAttendeesAction?.call(
@@ -193,7 +195,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
fontWeight: FontWeight.w700
),
),
TextSpan(text: AppLocalizations.of(context).invitationMessageCalendarInformation)
TextSpan(text: calendarEvent.getTitleEventAction(context, listEmailAddressSender))
]
)
),
@@ -228,6 +230,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
CalendarEventActionButtonWidget(
margin: EdgeInsetsDirectional.zero,
onCalendarEventReplyActionClick: onCalendarEventReplyActionClick,
eventMethod: calendarEvent.method,
calendarEventReplying: calendarEventReplying,
attendanceStatus: attendanceStatus,
onMailToAttendeesAction: () => onMailtoAttendeesAction?.call(