TF-3295 Fix BLUE-BAR attendees mail addresses are not clickable

This commit is contained in:
dab246
2024-11-23 04:09:11 +07:00
committed by Dat H. Pham
parent 4f5e7d460d
commit a10b7a9868
6 changed files with 51 additions and 4 deletions
@@ -361,6 +361,7 @@ class EmailView extends GetWidget<SingleEmailController> {
calendarEventReplying: controller.calendarEventProcessing, calendarEventReplying: controller.calendarEventProcessing,
presentationEmail: controller.currentEmail, presentationEmail: controller.currentEmail,
onMailtoAttendeesAction: controller.handleMailToAttendees, onMailtoAttendeesAction: controller.handleMailToAttendees,
openEmailAddressDetailAction: controller.openEmailAddressDialog,
)), )),
if (_validateDisplayEventActionBanner( if (_validateDisplayEventActionBanner(
context: context, context: context,
@@ -0,0 +1,11 @@
import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
extension CalendarOrganierExtension on CalendarOrganizer {
EmailAddress toEmailAddress() {
return EmailAddress(
name, mailto?.value,
);
}
}
@@ -1,17 +1,22 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_attendee_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/styles/attendee_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/attendee_widget_styles.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_sender_builder.dart';
class AttendeeWidget extends StatelessWidget { class AttendeeWidget extends StatelessWidget {
final CalendarAttendee attendee; final CalendarAttendee attendee;
final List<CalendarAttendee> listAttendees; final List<CalendarAttendee> listAttendees;
final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction;
const AttendeeWidget({ const AttendeeWidget({
super.key, super.key,
required this.attendee, required this.attendee,
required this.listAttendees, required this.listAttendees,
this.openEmailAddressDetailAction,
}); });
@override @override
@@ -34,6 +39,7 @@ class AttendeeWidget extends StatelessWidget {
fontSize: AttendeeWidgetStyles.textSize, fontSize: AttendeeWidgetStyles.textSize,
fontWeight: FontWeight.w500 fontWeight: FontWeight.w500
), ),
recognizer: TapGestureRecognizer()..onTap = () => _onClickMailAddress(context)
), ),
if (listAttendees.last != attendee) if (listAttendees.last != attendee)
const TextSpan(text: ', '), const TextSpan(text: ', '),
@@ -41,4 +47,8 @@ class AttendeeWidget extends StatelessWidget {
) )
); );
} }
void _onClickMailAddress(BuildContext context) {
openEmailAddressDetailAction?.call(context, attendee.toEmailAddress());
}
} }
@@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_location_information_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_location_information_widget.dart';
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_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/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/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart';
@@ -30,6 +31,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
final bool calendarEventReplying; final bool calendarEventReplying;
final PresentationEmail? presentationEmail; final PresentationEmail? presentationEmail;
final OnMailtoAttendeesAction? onMailtoAttendeesAction; final OnMailtoAttendeesAction? onMailtoAttendeesAction;
final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction;
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -42,6 +44,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
this.onOpenComposerAction, this.onOpenComposerAction,
this.presentationEmail, this.presentationEmail,
this.onMailtoAttendeesAction, this.onMailtoAttendeesAction,
this.openEmailAddressDetailAction,
}); });
@override @override
@@ -130,6 +133,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
child: EventAttendeeDetailWidget( child: EventAttendeeDetailWidget(
attendees: calendarEvent.participants ?? [], attendees: calendarEvent.participants ?? [],
organizer: calendarEvent.organizer, organizer: calendarEvent.organizer,
openEmailAddressDetailAction: openEmailAddressDetailAction,
), ),
), ),
if (calendarEvent.isDisplayedEventReplyAction) if (calendarEvent.isDisplayedEventReplyAction)
@@ -215,6 +219,7 @@ class CalendarEventInformationWidget extends StatelessWidget {
child: EventAttendeeDetailWidget( child: EventAttendeeDetailWidget(
attendees: calendarEvent.participants ?? [], attendees: calendarEvent.participants ?? [],
organizer: calendarEvent.organizer, organizer: calendarEvent.organizer,
openEmailAddressDetailAction: openEmailAddressDetailAction,
), ),
), ),
if (calendarEvent.isDisplayedEventReplyAction) if (calendarEvent.isDisplayedEventReplyAction)
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/hide_all_attendees_button_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/hide_all_attendees_button_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/organizer_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/organizer_widget.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/see_all_attendees_button_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/localizations/app_localizations.dart';
class EventAttendeeDetailWidget extends StatefulWidget { class EventAttendeeDetailWidget extends StatefulWidget {
@@ -17,11 +18,13 @@ class EventAttendeeDetailWidget extends StatefulWidget {
final List<CalendarAttendee> attendees; final List<CalendarAttendee> attendees;
final CalendarOrganizer? organizer; final CalendarOrganizer? organizer;
final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction;
const EventAttendeeDetailWidget({ const EventAttendeeDetailWidget({
super.key, super.key,
required this.attendees, required this.attendees,
required this.organizer required this.organizer,
this.openEmailAddressDetailAction,
}); });
@override @override
@@ -61,10 +64,17 @@ class _EventAttendeeDetailWidgetState extends State<EventAttendeeDetailWidget> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (widget.organizer != null) if (widget.organizer != null)
OrganizerWidget(organizer: widget.organizer!), OrganizerWidget(
organizer: widget.organizer!,
openEmailAddressDetailAction: widget.openEmailAddressDetailAction
),
if (_attendeesDisplayed.isNotEmpty) if (_attendeesDisplayed.isNotEmpty)
..._attendeesDisplayed ..._attendeesDisplayed
.map((attendee) => AttendeeWidget(attendee: attendee, listAttendees: _attendeesDisplayed)) .map((attendee) => AttendeeWidget(
attendee: attendee,
listAttendees: _attendeesDisplayed,
openEmailAddressDetailAction: widget.openEmailAddressDetailAction
))
.toList(), .toList(),
if (!_isShowAllAttendee) if (!_isShowAllAttendee)
Padding( Padding(
@@ -1,16 +1,21 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_organier_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/styles/organizer_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/organizer_widget_styles.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/localizations/app_localizations.dart';
class OrganizerWidget extends StatelessWidget { class OrganizerWidget extends StatelessWidget {
final CalendarOrganizer organizer; final CalendarOrganizer organizer;
final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction;
const OrganizerWidget({ const OrganizerWidget({
super.key, super.key,
required this.organizer required this.organizer,
this.openEmailAddressDetailAction,
}); });
@override @override
@@ -33,6 +38,7 @@ class OrganizerWidget extends StatelessWidget {
fontSize: OrganizerWidgetStyles.textSize, fontSize: OrganizerWidgetStyles.textSize,
fontWeight: FontWeight.w500 fontWeight: FontWeight.w500
), ),
recognizer: TapGestureRecognizer()..onTap = () => _onClickMailAddress(context)
), ),
TextSpan(text: '(${AppLocalizations.of(context).organizer})'), TextSpan(text: '(${AppLocalizations.of(context).organizer})'),
const TextSpan(text: ', '), const TextSpan(text: ', '),
@@ -40,4 +46,8 @@ class OrganizerWidget extends StatelessWidget {
) )
); );
} }
void _onClickMailAddress(BuildContext context) {
openEmailAddressDetailAction?.call(context, organizer.toEmailAddress());
}
} }