From 2268b188091c8964a94e5f726e8d62ac6093a8f4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 02:47:10 +0700 Subject: [PATCH] TF-2057 Add event hyper link detail widget (cherry picked from commit 8974e0ab37c2fa0b9097cae638b983e8600db4b2) --- .../base/widget/hyper_link_widget.dart | 33 +++++++++++++++ .../extensions/calendar_event_extension.dart | 16 ++++++++ .../calendar_event_detail_widget.dart | 6 +++ .../event_attendee_detail_widget.dart | 14 +++---- .../event_link_detail_widget.dart | 40 +++++++++++++++++++ lib/l10n/intl_messages.arb | 8 +++- lib/main/localizations/app_localizations.dart | 6 +++ 7 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 lib/features/base/widget/hyper_link_widget.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart diff --git a/lib/features/base/widget/hyper_link_widget.dart b/lib/features/base/widget/hyper_link_widget.dart new file mode 100644 index 000000000..39c0d9314 --- /dev/null +++ b/lib/features/base/widget/hyper_link_widget.dart @@ -0,0 +1,33 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class HyperLinkWidget extends StatelessWidget { + + final String urlString; + + const HyperLinkWidget({Key? key, required this.urlString}) : super(key: key); + + @override + Widget build(BuildContext context) { + return RichText( + text: TextSpan( + text: urlString, + style: const TextStyle( + color: AppColor.primaryColor, + fontSize: 16, + decoration: TextDecoration.underline + ), + recognizer: TapGestureRecognizer()..onTap = () async { + if (await canLaunchUrlString(urlString)) { + launchUrlString( + urlString, + mode: LaunchMode.externalApplication + ); + } + } + ) + ); + } +} diff --git a/lib/features/email/presentation/extensions/calendar_event_extension.dart b/lib/features/email/presentation/extensions/calendar_event_extension.dart index ad55b6ee5..164c4d6a9 100644 --- a/lib/features/email/presentation/extensions/calendar_event_extension.dart +++ b/lib/features/email/presentation/extensions/calendar_event_extension.dart @@ -269,4 +269,20 @@ extension CalendarEventExtension on CalendarEvent { return ''; } } + + List get videoConferences { + if (extensionFields != null && extensionFields!.mapFields.isNotEmpty) { + final videoConferences = extensionFields!.mapFields['X-OPENPAAS-VIDEOCONFERENCE']; + if (videoConferences != null) { + final videoConferencesNotEmpty = videoConferences + .whereNotNull() + .where((link) => link.isNotEmpty) + .toList(); + log('CalendarEventExtension::getListVideoConference: $videoConferencesNotEmpty'); + return videoConferencesNotEmpty; + } + } + + return []; + } } \ No newline at end of file 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 d0e2f5140..9e3f82390 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 @@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_ev 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/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'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_title_widget.dart'; @@ -53,6 +54,11 @@ class CalendarEventDetailWidget extends StatelessWidget { padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), child: EventTimeWidgetWidget(timeEvent: calendarEvent.dateTimeEventAsString), ), + if (calendarEvent.videoConferences.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventLinkDetailWidget(listHyperLink: calendarEvent.videoConferences), + ), if (calendarEvent.location?.isNotEmpty == true) Padding( padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart index 73c53bb3f..26a640f3a 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart @@ -1,5 +1,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/utils/app_logger.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/calendar_organizer.dart'; @@ -12,7 +13,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class EventAttendeeDetailWidget extends StatefulWidget { - static const int _maxAttendeeDisplayed = 6; + static const int maxAttendeeDisplayed = 6; final List attendees; final CalendarOrganizer organizer; @@ -30,15 +31,14 @@ class EventAttendeeDetailWidget extends StatefulWidget { class _EventAttendeeDetailWidgetState extends State { late List _attendeesDisplayed; - bool _isShowAllAttendee = false; + late bool _isShowAllAttendee; @override void initState() { super.initState(); _attendeesDisplayed = _splitAttendees(widget.attendees); - if (_attendeesDisplayed.length == widget.attendees.length - 1) { - _isShowAllAttendee = true; - } + _isShowAllAttendee = widget.attendees.length <= EventAttendeeDetailWidget.maxAttendeeDisplayed; + log('_EventAttendeeDetailWidgetState::initState:attendees: ${widget.attendees.length} | _isShowAllAttendee: $_isShowAllAttendee'); } @override @@ -84,8 +84,8 @@ class _EventAttendeeDetailWidgetState extends State { List _splitAttendees(List attendees) { final attendeesWithoutOrganizer = attendees.withoutOrganizer(widget.organizer); - return attendeesWithoutOrganizer.length > EventAttendeeDetailWidget._maxAttendeeDisplayed - ? attendeesWithoutOrganizer.sublist(0, EventAttendeeDetailWidget._maxAttendeeDisplayed - 1) + return attendeesWithoutOrganizer.length > EventAttendeeDetailWidget.maxAttendeeDisplayed + ? attendeesWithoutOrganizer.sublist(0, EventAttendeeDetailWidget.maxAttendeeDisplayed - 1) : attendeesWithoutOrganizer; } } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart new file mode 100644 index 000000000..b7bcaaf9a --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart @@ -0,0 +1,40 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/base/widget/hyper_link_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_location_detail_widget_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class EventLinkDetailWidget extends StatelessWidget { + + final List listHyperLink; + + const EventLinkDetailWidget({ + super.key, + required this.listHyperLink + }); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: EventLocationDetailWidgetStyles.maxWidth, + child: Text( + AppLocalizations.of(context).link, + style: const TextStyle( + fontSize: EventLocationDetailWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: AppColor.colorSubTitleEventActionText + ), + ), + ), + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: listHyperLink.map((link) => HyperLinkWidget(urlString: link)).toList(), + )) + ], + ); + } +} \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 3c8fb07e6..7dfb0a04b 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-07-28T02:01:26.243299", + "@@last_modified": "2023-07-28T02:46:38.430701", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3101,5 +3101,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "link": "Link", + "@link": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 790ebaeb6..29e81d209 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3198,4 +3198,10 @@ class AppLocalizations { 'See all attendees', name: 'seeAllAttendees'); } + + String get link { + return Intl.message( + 'Link', + name: 'link'); + } } \ No newline at end of file