Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release v0.8.9 #2062

Merged
merged 55 commits into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
0c8a5ec
TF-1857 Add HeaderCalendarEvent property in jmap-dart-client
dab246 Jul 19, 2023
aebc323
TF-1857 Add func check capability supported
dab246 Jul 19, 2023
9796a36
TF-1857 Add properties for Email/get when calendar event supported
dab246 Jul 19, 2023
f5678da
TF-1857 Update properties calendar event in get all email thread view
dab246 Jul 19, 2023
88933af
TF-1857 Update properties calendar event in load more email
dab246 Jul 19, 2023
98cf634
TF-1857 Update properties calendar event in search email
dab246 Jul 19, 2023
d8c178b
TF-1857 Update properties calendar event in refresh change email
dab246 Jul 19, 2023
b7334c3
TF-1857 Update properties calendar event in SearchEmailView
dab246 Jul 19, 2023
d4c6195
TF-1857 Update properties calendar event in push notification
dab246 Jul 19, 2023
3266985
TF-1857 Update properties calendar event in navigate web browser
dab246 Jul 19, 2023
24c2d4a
TF-1857 Add headerCalendarEvent to PresentationEmail
dab246 Jul 19, 2023
2d42bbe
TF-1857 Display calendar event icon in item list email
dab246 Jul 19, 2023
2a1f5b7
TF-1857 Add headerCalendarEvent to email cached
dab246 Jul 19, 2023
c7bba5f
TF-1857 Add padding calendar event icon in item email
dab246 Jul 19, 2023
45b3c98
TF-2052 Fix TeamMailbox email address alignment is incorrect
dab246 Jul 24, 2023
f4ff63a
If no refreshToken return, maybe the old refreshToken still available
hoangdat Jul 26, 2023
cc0057b
TF-2035 Add abstract parse calendar event method
dab246 Jul 21, 2023
46c5ba6
TF-2035 Implement parse calendar event method
dab246 Jul 21, 2023
ee1a7cb
TF-2035 Add interactor handle parse calendar event
dab246 Jul 21, 2023
a73071e
TF-2035 Add binding interactor for calendar event
dab246 Jul 21, 2023
2296eac
TF-2035 Binding calendar event interactor
dab246 Jul 21, 2023
34e5f23
TF-2035 Get binding calendar event interactor
dab246 Jul 21, 2023
414fa4f
TF-2035 Show calendar event banner in email view
dab246 Jul 24, 2023
706df7a
TF-2035 Change size padding, text for event banner
dab246 Jul 25, 2023
fd589b9
TF-2035 Remove loading widget for event banner
dab246 Jul 25, 2023
43f824a
TF-2040 Add `utcStart` and `utcEnd` property of CalendarEvent in jmap…
dab246 Jul 25, 2023
e6810dc
TF-2040 Add LanguageCodeConstants to manage language supported
dab246 Jul 25, 2023
606df90
TF-2040 Get `month, day, weekDay` as string from `utcStartDate`
dab246 Jul 25, 2023
1e33a9b
TF-2040 Create CalendarDateIconWidget
dab246 Jul 25, 2023
8f36f3f
TF-2040 Add vertical margin for CalendarEventActionBanner
dab246 Jul 25, 2023
b2d2e5e
TF-2040 Add CalendarEventInformationWidget in email view
dab246 Jul 25, 2023
3aaf3c6
TF-2040 Add date icon background color to styles
dab246 Jul 28, 2023
935f47e
TF-2042 Add event time information widget
dab246 Jul 26, 2023
f5be3f5
TF-2042 Add event location information widget
dab246 Jul 26, 2023
c47f39c
TF-2042 Add event attendees information widget
dab246 Jul 26, 2023
01e0eef
TF-2042 Display calendar event information widget
dab246 Jul 26, 2023
20bad54
TF-2042 Add color to styles
dab246 Jul 28, 2023
5a8473e
TF-2057 Add event title widget
dab246 Jul 27, 2023
87ff6a2
TF-2057 Add event time detail widget
dab246 Jul 27, 2023
ee264a2
TF-2057 Add event location detail widget
dab246 Jul 27, 2023
881e1b3
TF-2057 Add event attendees detail widget
dab246 Jul 27, 2023
e84c0a7
TF-2057 Add event description detail widget
dab246 Jul 27, 2023
5459cb5
TF-2057 Add calendar event detail widget
dab246 Jul 27, 2023
6a8cb94
TF-2057 Hide email content as html when has calendar event
dab246 Jul 27, 2023
7fa8f2a
TF-2057 Enable scroll page view when email has calendar event
dab246 Jul 27, 2023
512416a
TF-2057 Set full width size event description widget
dab246 Jul 27, 2023
ea91f60
TF-2057 Set max lines text event information
dab246 Jul 27, 2023
b2b1689
TF-2057 Add event organizer widget
dab246 Jul 27, 2023
1ada7df
TF-2057 Add see all attendees button
dab246 Jul 27, 2023
c699e8f
TF-2057 Add event hyper link detail widget
dab246 Jul 27, 2023
8c19e07
TF-2057 Add color/size to styles
dab246 Jul 28, 2023
afa8826
Translated using Weblate (Russian)
tprudentova Jul 21, 2023
d757efc
Translated using Weblate (French)
Arsnael Jul 31, 2023
ab2fa53
Translated using Weblate (French)
Arsnael Jul 31, 2023
8ea37e9
Bump version to `v0.8.9`
dab246 Jul 31, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
## [0.8.9] - 2023-07-31
### Added
- Translate Russian and French
- Apply new view calendar event

### Fixed
- \#2052 Fix TeamMailbox email address alignment is incorrect
- If no refreshToken return, maybe the old refreshToken still available

## [0.8.8] - 2023-07-20
### Fixed
- \#2046 App crashes when login account information is incorrect on web
Expand Down Expand Up @@ -199,6 +208,7 @@
- \#1512 remove plain text input for signature
- \#1469 remove animation when navigating screen

[0.8.9]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.9
[0.8.8]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.8
[0.8.7]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.7
[0.8.6]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.6
Expand Down
5 changes: 5 additions & 0 deletions assets/images/ic_calendar_event.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/images/ic_event_canceled.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/images/ic_event_invited.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/images/ic_event_updated.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/images/ic_format_quote.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion contact/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ packages:
description:
path: "."
ref: master
resolved-ref: "973a57d1ffbc5237d63ea960b46e8921c6ac6a66"
resolved-ref: "63d47945f676adca3bf48b3940b21b77546e309e"
url: "https://github.com/linagora/jmap-dart-client.git"
source: git
version: "0.0.1"
Expand Down
13 changes: 13 additions & 0 deletions core/lib/presentation/extensions/color_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,19 @@ extension AppColor on Color {
static const colorBackgroundDeliveringState = Color(0xFFF2F3F5);
static const colorNetworkConnectionBannerBackground = Color(0x99EBEDF0);
static const colorNetworkConnectionLabel = Color(0xFF818C99);
static const colorCalendarEventRead = Color(0xFF818C99);
static const colorCalendarEventUnread = Color(0xFF1C1B1F);
static const colorMaybeEventActionText = Color(0xFFFFC107);
static const colorInvitedEventActionText = Color(0xFF007AFF);
static const colorUpdatedEventActionText = Color(0xFF4BB34B);
static const colorCanceledEventActionText = Color(0xFFFF3347);
static const colorSubTitleEventActionText = Color(0xFF939393);
static const colorCalendarEventInformationBackground = Color(0x0A000000);
static const colorCalendarEventInformationStroke = Color(0x1F000000);
static const colorShadowCalendarDateIcon = Color(0x26000000);
static const colorOrganizerMailto = Color(0xFFB3B3B3);
static const colorMailto = Color(0xFFB3B3B3);
static const colorEventDescriptionBackground = Color(0x05000000);

static const mapGradientColor = [
[Color(0xFF21D4FD), Color(0xFFB721FF)],
Expand Down
5 changes: 5 additions & 0 deletions core/lib/presentation/resources/image_paths.dart
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@ class ImagePaths {
String get icArrowLeft => _getImagePath('ic_arrow_left.svg');
String get icArrowRight => _getImagePath('ic_arrow_right.svg');
String get icAddPicture => _getImagePath('ic_add_picture.svg');
String get icCalendarEvent => _getImagePath('ic_calendar_event.svg');
String get icEventInvited => _getImagePath('ic_event_invited.svg');
String get icEventUpdated => _getImagePath('ic_event_updated.svg');
String get icEventCanceled => _getImagePath('ic_event_canceled.svg');
String get icFormatQuote => _getImagePath('ic_format_quote.svg');

String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
Expand Down
2 changes: 1 addition & 1 deletion fcm/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ packages:
description:
path: "."
ref: master
resolved-ref: "973a57d1ffbc5237d63ea960b46e8921c6ac6a66"
resolved-ref: "63d47945f676adca3bf48b3940b21b77546e309e"
url: "https://github.com/linagora/jmap-dart-client.git"
source: git
version: "0.0.1"
Expand Down
2 changes: 1 addition & 1 deletion forward/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ packages:
description:
path: "."
ref: master
resolved-ref: "973a57d1ffbc5237d63ea960b46e8921c6ac6a66"
resolved-ref: "63d47945f676adca3bf48b3940b21b77546e309e"
url: "https://github.com/linagora/jmap-dart-client.git"
source: git
version: "0.0.1"
Expand Down
2 changes: 1 addition & 1 deletion lib/features/base/base_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import 'package:rule_filter/rule_filter/capability_rule_filter.dart';
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart';
import 'package:tmail_ui_user/features/email/presentation/bindings/mdn_interactor_bindings.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/features/base/reloadable/reloadable_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ abstract class ReloadableController extends BaseController {
}

void updateAuthenticationAccount(Session session, AccountId accountId, UserName userName) {
final apiUrl = session.getQualifiedApiUrl(baseUrl: _dynamicUrlInterceptors.jmapUrl);;
final apiUrl = session.getQualifiedApiUrl(baseUrl: _dynamicUrlInterceptors.jmapUrl);
log('ReloadableController::updateAuthenticationAccount():apiUrl: $apiUrl');
if (apiUrl.isNotEmpty) {
consumeState(_updateAuthenticationAccountInteractor.execute(accountId, apiUrl, userName));
Expand Down
7 changes: 7 additions & 0 deletions lib/features/base/styles/cupertino_loading_widget_styles.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';

class CupertinoLoadingWidgetStyles {
static const Color progressColor = AppColor.colorLoading;
static const double size = 24;
}
7 changes: 7 additions & 0 deletions lib/features/base/styles/hyper_link_widget_styles.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';

class HyperLinkWidgetStyles {
static const Color textColor = AppColor.primaryColor;
static const double textSize = 16;
}
17 changes: 17 additions & 0 deletions lib/features/base/widget/cupertino_loading_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:flutter/cupertino.dart';
import 'package:tmail_ui_user/features/base/styles/cupertino_loading_widget_styles.dart';

class CupertinoLoadingWidget extends StatelessWidget {
const CupertinoLoadingWidget({super.key});

@override
Widget build(BuildContext context) {
return const Center(
child: SizedBox(
width: CupertinoLoadingWidgetStyles.size,
height: CupertinoLoadingWidgetStyles.size,
child: CupertinoActivityIndicator(color: CupertinoLoadingWidgetStyles.progressColor)
)
);
}
}
33 changes: 33 additions & 0 deletions lib/features/base/widget/hyper_link_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
import 'package:tmail_ui_user/features/base/styles/hyper_link_widget_styles.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: HyperLinkWidgetStyles.textColor,
fontSize: HyperLinkWidgetStyles.textSize,
decoration: TextDecoration.underline
),
recognizer: TapGestureRecognizer()..onTap = () async {
if (await canLaunchUrlString(urlString)) {
launchUrlString(
urlString,
mode: LaunchMode.externalApplication
);
}
}
)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@

import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';

abstract class CalendarEventDataSource {
Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
import 'package:tmail_ui_user/features/email/data/datasource/calendar_event_datasource.dart';
import 'package:tmail_ui_user/features/email/data/network/calendar_event_api.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';

class CalendarEventDataSourceImpl extends CalendarEventDataSource {

final CalendarEventAPI _calendarEventAPI;
final ExceptionThrower _exceptionThrower;

CalendarEventDataSourceImpl(this._calendarEventAPI, this._exceptionThrower);

@override
Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds) {
return Future.sync(() async {
return await _calendarEventAPI.parse(accountId, blobIds);
}).catchError(_exceptionThrower.throwException);
}
}
41 changes: 41 additions & 0 deletions lib/features/email/data/network/calendar_event_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'dart:async';

import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/jmap_request.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/parse/calendar_event_parse_method.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/parse/calendar_event_parse_response.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/calendar_event_exceptions.dart';

class CalendarEventAPI {

final HttpClient _httpClient;

CalendarEventAPI(this._httpClient);

Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds) async {
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final calendarEventParseMethod = CalendarEventParseMethod(accountId, blobIds);
final calendarEventParseInvocation = requestBuilder.invocation(calendarEventParseMethod);
final response = await (requestBuilder
..usings(calendarEventParseMethod.requiredCapabilities))
.build()
.execute();

final calendarEventParseResponse = response.parse<CalendarEventParseResponse>(
calendarEventParseInvocation.methodCallId,
CalendarEventParseResponse.deserialize);

if (calendarEventParseResponse?.parsed?.isNotEmpty == true) {
return calendarEventParseResponse!.parsed!.values.toList();
} else if (calendarEventParseResponse?.notParsable?.isNotEmpty == true) {
throw NotParsableCalendarEventException();
} else if (calendarEventParseResponse?.notFound?.isNotEmpty == true) {
throw NotFoundCalendarEventException();
} else {
throw NotParsableCalendarEventException();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
import 'package:tmail_ui_user/features/email/data/datasource/calendar_event_datasource.dart';
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';

class CalendarEventRepositoryImpl extends CalendarEventRepository {

final CalendarEventDataSource _calendarEventDataSource;

CalendarEventRepositoryImpl(this._calendarEventDataSource);

@override
Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds) {
return _calendarEventDataSource.parse(accountId, blobIds);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

class NotFoundCalendarEventException implements Exception {}

class NotParsableCalendarEventException implements Exception {}
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@

import 'package:collection/collection.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:model/email/attachment.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/attachment_extension.dart';
import 'package:tmail_ui_user/features/offline_mode/model/attachment_hive_cache.dart';

extension ListAttachmentsExtension on List<Attachment> {
List<AttachmentHiveCache> toHiveCache() => map((attachment) => attachment.toHiveCache()).toList();

Set<Attachment> get calendarAttachments => where((attachment) => attachment.isCalendarEvent).toSet();

Set<Id> get calendarEventBlobIds => calendarAttachments
.map((attachment) => attachment.blobId)
.whereNotNull()
.toSet();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@

import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';

abstract class CalendarEventRepository {
Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds);
}
19 changes: 19 additions & 0 deletions lib/features/email/domain/state/parse_calendar_event_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';

class ParseCalendarEventLoading extends LoadingState {}

class ParseCalendarEventSuccess extends UIState {

final List<CalendarEvent> calendarEventList;

ParseCalendarEventSuccess(this.calendarEventList);

@override
List<Object> get props => [calendarEventList];
}

class ParseCalendarEventFailure extends FeatureFailure {
ParseCalendarEventFailure(dynamic exception) : super(exception: exception);
}
Loading
Loading