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.6 #2033

Merged
merged 17 commits into from
Jul 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
## [0.8.6] - 2023-07-14
### Added
- \#1486 Support inserting images in identity

### Fixed
- \#1868 Hide parent - show child: nothing displayed in the side bad
- \#1898 There is no notification badge only on IOS
- \#1985 Hoover to see the selection
- \#1993 Has attachment checkbox is overflow once it be translated in russia
- \#1994 Long press to copy an email address
- \#2008 Instead of toasting for network connection, we should show a very small UI at the top of the list
- \#2030 Turn off composer logs by defaults

## [0.8.5] - 2023-07-14
### Added
- Translation (Arabic/Russian)

### Fixed
- \#1683 Remove Plain text option of message in VacationView
- \#1895 \[Animation\] The screen seem be black before loading the email content successfully

## [0.8.4] - 2023-07-07
### Fixed
- \#1932 Turn off notifications after emailing
Expand Down Expand Up @@ -169,6 +190,8 @@
- \#1512 remove plain text input for signature
- \#1469 remove animation when navigating screen

[0.8.6]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.6
[0.8.5]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.5
[0.8.4]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.4
[0.8.3]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.3
[0.8.2]: https://github.com/linagora/tmail-flutter/releases/tag/v0.8.2
Expand Down
5 changes: 5 additions & 0 deletions assets/images/ic_add_picture.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions core/lib/presentation/extensions/color_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ extension AppColor on Color {
static const colorCloseButton = Color(0xFF818C99);
static const colorDropShadow = Color(0x0F000000);
static const colorBackgroundKeyboard = Color(0xFFD2D5DC);
static const colorBackgroundKeyboardAndroid = Color(0xFFF2F0F4);
static const colorShadowLayerBottom = Color(0x29000000);
static const colorShadowLayerTop = Color(0x1F000000);
static const colorDividerHorizontal = Color(0x1F000000);
Expand Down Expand Up @@ -181,6 +182,8 @@ extension AppColor on Color {
static const colorErrorState = Color(0xFFE64646);
static const colorBackgroundErrorState = Color(0xFFFAEBEB);
static const colorBackgroundDeliveringState = Color(0xFFF2F3F5);
static const colorNetworkConnectionBannerBackground = Color(0x99EBEDF0);
static const colorNetworkConnectionLabel = Color(0xFF818C99);

static const mapGradientColor = [
[Color(0xFF21D4FD), Color(0xFFB721FF)],
Expand Down
1 change: 1 addition & 0 deletions core/lib/presentation/resources/image_paths.dart
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ class ImagePaths {
String get icArrowBottom => _getImagePath('ic_arrow_bottom.svg');
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 _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
Expand Down
5 changes: 4 additions & 1 deletion core/lib/presentation/views/text/text_overflow_builder.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

import 'package:core/presentation/extensions/string_extension.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/utils/direction_utils.dart';
import 'package:flutter/material.dart';

class TextOverflowBuilder extends StatelessWidget {
Expand All @@ -26,7 +27,9 @@ class TextOverflowBuilder extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text(
data.overflow,
DirectionUtils.isDirectionRTLByLanguage(context)
? data
: data.overflow,
style: style,
textAlign: textAlign,
softWrap: softWrap,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class _TypeAheadFormFieldBuilderState<T> extends State<TypeAheadFormFieldBuilder
autofillHints: widget.autofillHints,
keyboardType: widget.keyboardType,
decoration: widget.decoration,
focusNode: widget.focusNode,
textDirection: _textDirection,
onChanged: (value) {
widget.onTextChange?.call(value);
Expand Down
6 changes: 6 additions & 0 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ PODS:
- fk_user_agent (2.0.0):
- Flutter
- Flutter (1.0.0)
- flutter_app_badger (1.3.0):
- Flutter
- flutter_appauth (0.0.1):
- AppAuth (= 1.6.0)
- Flutter
Expand Down Expand Up @@ -186,6 +188,7 @@ DEPENDENCIES:
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- fk_user_agent (from `.symlinks/plugins/fk_user_agent/ios`)
- Flutter (from `Flutter`)
- flutter_app_badger (from `.symlinks/plugins/flutter_app_badger/ios`)
- flutter_appauth (from `.symlinks/plugins/flutter_appauth/ios`)
- flutter_downloader (from `.symlinks/plugins/flutter_downloader/ios`)
- flutter_image_compress (from `.symlinks/plugins/flutter_image_compress/ios`)
Expand Down Expand Up @@ -245,6 +248,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/fk_user_agent/ios"
Flutter:
:path: Flutter
flutter_app_badger:
:path: ".symlinks/plugins/flutter_app_badger/ios"
flutter_appauth:
:path: ".symlinks/plugins/flutter_appauth/ios"
flutter_downloader:
Expand Down Expand Up @@ -295,6 +300,7 @@ SPEC CHECKSUMS:
FirebaseMessaging: e345b219fd15d325f0cf2fef28cb8ce00d851b3f
fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_app_badger: b87fc231847b03b92ce1412aa351842e7e97932f
flutter_appauth: 525652bda90e43ca5eb7ed748ecc106b79d1f5a1
flutter_downloader: b7301ae057deadd4b1650dc7c05375f10ff12c39
flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433
Expand Down
25 changes: 14 additions & 11 deletions lib/features/base/base_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/views/toast/tmail_toast.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/fps_manager.dart';
import 'package:core/utils/platform_info.dart';
import 'package:dartz/dartz.dart';
import 'package:fcm/model/firebase_capability.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -121,17 +122,19 @@ abstract class BaseController extends GetxController
logError('BaseController::_performFilterExceptionInError(): $error');
if (error is NoNetworkError || error is ConnectionTimeout || error is InternalServerError) {
logError('BaseController::_performFilterExceptionInError(): NoNetworkError');
if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage(
currentOverlayContext!,
AppLocalizations.of(currentContext!).no_internet_connection,
actionName: AppLocalizations.of(currentContext!).skip,
onActionClick: ToastView.dismiss,
leadingSVGIcon: _imagePaths.icNotConnection,
backgroundColor: AppColor.textFieldErrorBorderColor,
textColor: Colors.white,
infinityToast: true,
);
if (PlatformInfo.isWeb) {
if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastMessage(
currentOverlayContext!,
AppLocalizations.of(currentContext!).no_internet_connection,
actionName: AppLocalizations.of(currentContext!).skip,
onActionClick: ToastView.dismiss,
leadingSVGIcon: _imagePaths.icNotConnection,
backgroundColor: AppColor.textFieldErrorBorderColor,
textColor: Colors.white,
infinityToast: true,
);
}
}
return error;
} else if (error is BadCredentialsException) {
Expand Down
75 changes: 69 additions & 6 deletions lib/features/base/base_mailbox_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -440,22 +440,85 @@ abstract class BaseMailboxController extends BaseController {
}
}

List<MailboxNode> getAncestorOfMailboxNode(MailboxNode mailboxNode) {
final listAncestor = defaultMailboxTree.value.getAncestorList(mailboxNode)
?? personalMailboxTree.value.getAncestorList(mailboxNode)
?? teamMailboxesTree.value.getAncestorList(mailboxNode);
return listAncestor ?? [];
}

SubscribeRequest? generateSubscribeRequest(
MailboxId mailboxId,
MailboxSubscribeState subscribeState,
MailboxSubscribeAction subscribeAction
) {
switch(subscribeState) {
case MailboxSubscribeState.enabled:
return _generateSubscribeRequestWhenSubscribeEnabled(mailboxId, subscribeAction);
case MailboxSubscribeState.disabled:
return _generateSubscribeRequestWhenSubscribeDisabled(mailboxId, subscribeAction);
}
}

SubscribeRequest? _generateSubscribeRequestWhenSubscribeDisabled(
MailboxId mailboxId,
MailboxSubscribeAction subscribeAction
) {
final mailboxNode = findMailboxNodeById(mailboxId);

if (mailboxNode != null) {
if (mailboxNode.hasChildren()) {
final listDescendantMailboxIds = mailboxNode.descendantsAsList().mailboxIds;
return SubscribeMultipleMailboxRequest(mailboxId, listDescendantMailboxIds, subscribeState, subscribeAction);
if (mailboxNode == null) return null;

if (mailboxNode.hasChildren()) {
final listDescendantMailboxIds = mailboxNode.descendantsAsList().mailboxIds;
log("BaseMailboxController::_generateSubscribeRequestWhenSubscribeDisabled:listDescendantMailboxIds $listDescendantMailboxIds");
return SubscribeMultipleMailboxRequest(
mailboxId,
listDescendantMailboxIds,
MailboxSubscribeState.disabled,
subscribeAction
);
} else {
return SubscribeMailboxRequest(
mailboxId,
MailboxSubscribeState.disabled,
subscribeAction
);
}
}

SubscribeRequest? _generateSubscribeRequestWhenSubscribeEnabled(
MailboxId mailboxId,
MailboxSubscribeAction subscribeAction
) {
final mailboxNode = findMailboxNodeById(mailboxId);

if (mailboxNode == null) return null;

if (mailboxNode.hasParents()) {
final listAncestorMailboxIds = getAncestorOfMailboxNode(mailboxNode).mailboxIds;
listAncestorMailboxIds.add(mailboxId);
log("BaseMailboxController::_generateSubscribeRequestWhenSubscribeEnabled:listAncestorMailboxIds $listAncestorMailboxIds");
if (listAncestorMailboxIds.isNotEmpty) {
return SubscribeMultipleMailboxRequest(
mailboxId,
listAncestorMailboxIds,
MailboxSubscribeState.enabled,
subscribeAction
);
} else {
return SubscribeMailboxRequest(mailboxId, subscribeState, subscribeAction);
return SubscribeMailboxRequest(
mailboxId,
MailboxSubscribeState.enabled,
subscribeAction
);
}
} else {
return SubscribeMailboxRequest(
mailboxId,
MailboxSubscribeState.enabled,
subscribeAction
);
}
return null;
}

void getAllMailbox(Session session, AccountId accountId) async {
Expand Down
4 changes: 4 additions & 0 deletions lib/features/base/widget/material_text_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';

typedef OnTapMaterialTextButton = Function();
typedef OnLongPressMaterialTextButton = Function();

class MaterialTextButton extends StatelessWidget {

final String label;
final OnTapMaterialTextButton? onTap;
final OnLongPressMaterialTextButton? onLongPress;
final double borderRadius;
final Color? labelColor;
final double labelSize;
Expand All @@ -21,6 +23,7 @@ class MaterialTextButton extends StatelessWidget {
Key? key,
required this.label,
required this.onTap,
this.onLongPress,
this.borderRadius = 12,
this.labelColor,
this.labelSize = 15,
Expand All @@ -37,6 +40,7 @@ class MaterialTextButton extends StatelessWidget {
color: Colors.transparent,
child: InkWell(
onTap: onTap,
onLongPress: onLongPress,
customBorder: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius)),
child: Padding(
padding: padding ?? const EdgeInsets.symmetric(horizontal: 8, vertical: 5),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart';
import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
Expand Down
9 changes: 7 additions & 2 deletions lib/features/composer/presentation/composer_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/presentation/views/context_menu/simple_context_menu_action_builder.dart';
import 'package:core/presentation/views/image/avatar_builder.dart';
import 'package:core/presentation/views/responsive/responsive_widget.dart';
import 'package:core/utils/platform_info.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -49,7 +50,9 @@ class ComposerView extends BaseComposerView {
return KeyboardRichText(
richTextController: controller.keyboardRichTextController,
keyBroadToolbar: RichTextKeyboardToolBar(
backgroundKeyboardToolBarColor: AppColor.colorBackgroundKeyboard,
backgroundKeyboardToolBarColor: PlatformInfo.isIOS
? AppColor.colorBackgroundKeyboard
: AppColor.colorBackgroundKeyboardAndroid,
isLandScapeMode: responsiveUtils.isLandscapeMobile(context),
insertAttachment: controller.isNetworkConnectionAvailable
? () => controller.openPickAttachmentMenu(context, _pickAttachmentsActionTiles(context))
Expand Down Expand Up @@ -98,7 +101,9 @@ class ComposerView extends BaseComposerView {
return KeyboardRichText(
richTextController: controller.keyboardRichTextController,
keyBroadToolbar: RichTextKeyboardToolBar(
backgroundKeyboardToolBarColor: AppColor.colorBackgroundKeyboard,
backgroundKeyboardToolBarColor: PlatformInfo.isIOS
? AppColor.colorBackgroundKeyboard
: AppColor.colorBackgroundKeyboardAndroid,
insertAttachment: () => controller.openPickAttachmentMenu(context, _pickAttachmentsActionTiles(context)),
insertImage: () => controller.insertImage(context, constraints.maxWidth),
richTextController: controller.keyboardRichTextController,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

import 'package:core/utils/app_logger.dart';
import 'package:file_picker/file_picker.dart';
import 'package:rich_text_composer/rich_text_composer.dart';
import 'package:tmail_ui_user/features/composer/presentation/controller/base_rich_text_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/header_style_type.dart';
Expand All @@ -23,4 +23,16 @@ class RichTextMobileTabletController extends BaseRichTextController {
final styleSelected = newStyle ?? HeaderStyleType.normal;
htmlEditorApi?.formatHeader(styleSelected.styleValue);
}

void insertImageAsBase64({required PlatformFile platformFile, int? maxWidth}) async {
if (platformFile.bytes != null) {
await htmlEditorApi?.insertImageData(
platformFile.bytes!,
'image/${platformFile.extension}',
maxWidth: maxWidth
);
} else {
logError("RichTextWebController::insertImageAsBase64: bytes is null");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@

import 'dart:convert';

import 'package:core/presentation/extensions/color_extension.dart';
import 'package:custom_pop_up_menu/custom_pop_up_menu.dart';
import 'package:core/utils/app_logger.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:html_editor_enhanced/html_editor.dart';
Expand Down Expand Up @@ -257,6 +260,17 @@ class RichTextWebController extends BaseRichTextController {
menuOrderListController.hideMenu();
}

void insertImageAsBase64({required PlatformFile platformFile}) {
if (platformFile.bytes != null) {
final base64Data = base64Encode(platformFile.bytes!);
editorController.insertHtml(
'<img src="data:image/${platformFile.extension};base64,$base64Data" data-filename="${platformFile.name}" alt="Image in my signature" style="max-width: 100%"/>'
);
} else {
logError("RichTextWebController::insertImageAsBase64: bytes is null");
}
}

@override
void onClose() {
menuParagraphController.dispose();
Expand Down
Loading
Loading