diff --git a/lib/features/login/data/model/request/account_request.dart b/model/lib/account/account_request.dart similarity index 100% rename from lib/features/login/data/model/request/account_request.dart rename to model/lib/account/account_request.dart diff --git a/lib/features/login/data/utils/attribute.dart b/model/lib/account/attribute.dart similarity index 100% rename from lib/features/login/data/utils/attribute.dart rename to model/lib/account/attribute.dart diff --git a/lib/features/login/data/model/response/presentation_account_response.dart b/model/lib/account/presentation_account_response.dart similarity index 89% rename from lib/features/login/data/model/response/presentation_account_response.dart rename to model/lib/account/presentation_account_response.dart index 823c9f226..ff1f16f72 100644 --- a/lib/features/login/data/model/response/presentation_account_response.dart +++ b/model/lib/account/presentation_account_response.dart @@ -2,7 +2,6 @@ import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/login/data/model/converter/presentation_email_address_converter.dart'; part 'presentation_account_response.g.dart'; diff --git a/lib/features/login/data/model/converter/avatar_id_converter.dart b/model/lib/converter/avatar_id_converter.dart similarity index 100% rename from lib/features/login/data/model/converter/avatar_id_converter.dart rename to model/lib/converter/avatar_id_converter.dart diff --git a/lib/features/login/data/model/converter/avatar_id_nullable_converter.dart b/model/lib/converter/avatar_id_nullable_converter.dart similarity index 100% rename from lib/features/login/data/model/converter/avatar_id_nullable_converter.dart rename to model/lib/converter/avatar_id_nullable_converter.dart diff --git a/lib/features/login/data/model/converter/presentation_email_address_converter.dart b/model/lib/converter/presentation_email_address_converter.dart similarity index 100% rename from lib/features/login/data/model/converter/presentation_email_address_converter.dart rename to model/lib/converter/presentation_email_address_converter.dart diff --git a/lib/features/login/data/model/converter/user_id_converter.dart b/model/lib/converter/user_id_converter.dart similarity index 100% rename from lib/features/login/data/model/converter/user_id_converter.dart rename to model/lib/converter/user_id_converter.dart diff --git a/model/lib/email/email_address_cache.dart b/model/lib/email/email_address_cache.dart new file mode 100644 index 000000000..a0c3ee265 --- /dev/null +++ b/model/lib/email/email_address_cache.dart @@ -0,0 +1,29 @@ + +import 'package:core/data/local/config/email_address_table.dart'; +import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'email_address_cache.g.dart'; + +@JsonSerializable() +class EmailAddressCache with EquatableMixin { + + @JsonKey(name: EmailAddressTable.NAME) + final String name; + @JsonKey(name: EmailAddressTable.EMAIL) + final String email; + + EmailAddressCache(this.name, this.email); + + factory EmailAddressCache.fromJson(Map json) => _$EmailAddressCacheFromJson(json); + + Map toJson() => _$EmailAddressCacheToJson(this); + + @override + List get props => [name, email]; +} + +extension EmailAddressCacheExtension on EmailAddressCache { + EmailAddress toEmailAddress() => EmailAddress(name, email); +} \ No newline at end of file diff --git a/model/lib/extensions/email_address_extension.dart b/model/lib/extensions/email_address_extension.dart index 63e0cfeae..73e2aeea0 100644 --- a/model/lib/extensions/email_address_extension.dart +++ b/model/lib/extensions/email_address_extension.dart @@ -1,4 +1,5 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:model/email/email_address_cache.dart'; extension EmailAddressExtension on EmailAddress { @@ -26,4 +27,6 @@ extension EmailAddressExtension on EmailAddress { String getEmail() => email != null ? email! : ''; String getName() => name != null ? name! : ''; + + EmailAddressCache toEmailAddressCache() => EmailAddressCache(name ?? '', email ?? ''); } \ No newline at end of file diff --git a/lib/features/thread/domain/extensions/email_extension.dart b/model/lib/extensions/email_extension.dart similarity index 51% rename from lib/features/thread/domain/extensions/email_extension.dart rename to model/lib/extensions/email_extension.dart index d4e16962c..22564c5dd 100644 --- a/lib/features/thread/domain/extensions/email_extension.dart +++ b/model/lib/extensions/email_extension.dart @@ -1,8 +1,27 @@ + import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; extension EmailExtension on Email { + Set getRecipientEmailAddressList() { + final listEmailAddress = Set(); + final listToAddress = to.getListAddress() ?? []; + final listCcAddress = cc.getListAddress() ?? []; + final listBccAddress = bcc.getListAddress() ?? []; + listEmailAddress.addAll(listToAddress + listCcAddress + listBccAddress); + return listEmailAddress; + } + + EmailContent toEmailContent() { + return EmailContent( + id, + htmlBody: htmlBody, + attachments: attachments, + bodyValues: bodyValues + ); + } + PresentationEmail toPresentationEmail({SelectMode selectMode = SelectMode.INACTIVE}) { return PresentationEmail( id, diff --git a/model/lib/extensions/list_email_address_extension.dart b/model/lib/extensions/list_email_address_extension.dart index 646d165a6..38b46f714 100644 --- a/model/lib/extensions/list_email_address_extension.dart +++ b/model/lib/extensions/list_email_address_extension.dart @@ -4,6 +4,8 @@ import 'package:model/extensions/email_address_extension.dart'; extension ListEmailAddressExtension on Set? { + List? getListAddress() => this?.map((emailAddress) => emailAddress.getEmail()).toList(); + List getListEmailAddress({ExpandMode expandMode = ExpandMode.EXPAND, int limitAddress = 1, bool isFullEmailAddress = false}) { if (this != null) { if (expandMode == ExpandMode.EXPAND) { diff --git a/lib/features/login/data/extensions/presentation_account_extension.dart b/model/lib/extensions/presentation_account_extension.dart similarity index 70% rename from lib/features/login/data/extensions/presentation_account_extension.dart rename to model/lib/extensions/presentation_account_extension.dart index 1fd71cd57..8c99aa5cb 100644 --- a/lib/features/login/data/extensions/presentation_account_extension.dart +++ b/model/lib/extensions/presentation_account_extension.dart @@ -1,5 +1,4 @@ import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/login/data/model/response/presentation_account_response.dart'; extension PresentationAccountExtension on PresentationAccount { PresentationAccountResponse toPresentationAccountResponse() { diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart new file mode 100644 index 000000000..b5152aa74 --- /dev/null +++ b/model/lib/extensions/presentation_email_extension.dart @@ -0,0 +1,15 @@ +import 'package:core/core.dart'; +import 'package:model/model.dart'; + +extension PresentationEmailExtension on PresentationEmail { + + int numberOfAllEmailAddress() => to.numberEmailAddress() + cc.numberEmailAddress() + bcc.numberEmailAddress(); + + String getEmailDateTime(String newLocale, {String? pattern}) { + final emailTime = sentAt ?? receivedAt; + if (emailTime != null) { + return emailTime.formatDate(pattern: pattern ?? emailTime.value.toPattern(), locale: newLocale); + } + return ''; + } +} \ No newline at end of file diff --git a/lib/features/login/data/extensions/user_profile_extension.dart b/model/lib/extensions/user_profile_extension.dart similarity index 69% rename from lib/features/login/data/extensions/user_profile_extension.dart rename to model/lib/extensions/user_profile_extension.dart index 11e1eb6bb..f891f2db8 100644 --- a/lib/features/login/data/extensions/user_profile_extension.dart +++ b/model/lib/extensions/user_profile_extension.dart @@ -1,6 +1,4 @@ import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/login/data/model/response/user_profile_response.dart'; -import 'package:tmail_ui_user/features/login/data/extensions/presentation_account_extension.dart'; extension UserProfileExtension on UserProfile { UserProfileResponse toUserProfileResponse() { diff --git a/model/lib/extensions/utcdate_extension.dart b/model/lib/extensions/utc_date_extension.dart similarity index 100% rename from model/lib/extensions/utcdate_extension.dart rename to model/lib/extensions/utc_date_extension.dart diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index 7f6d38c0e..54fbcff81 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -5,9 +5,11 @@ import 'package:model/mailbox/select_mode.dart'; class PresentationMailbox with EquatableMixin { + static final roleInbox = Role('inbox'); static final roleTrash = Role('trash'); static final roleSent = Role('sent'); static final roleTemplates = Role('templates'); + static final roleOutbox = Role('outbox'); final MailboxId id; final MailboxName? name; @@ -44,10 +46,6 @@ class PresentationMailbox with EquatableMixin { bool hasRole() => role != null && role!.value.isNotEmpty; String getCountUnReadEmails() { - if (role == roleTrash || role == roleSent || role == roleTemplates) { - return ''; - } - if (unreadEmails == null || unreadEmails!.value.value <= 0) { return ''; } diff --git a/model/lib/model.dart b/model/lib/model.dart index dbdc63603..f6171a331 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -5,11 +5,15 @@ export 'account/user_name.dart'; export 'account/password.dart'; export 'account/account_type.dart'; export 'account/presentation_account.dart'; +export 'account/presentation_account_response.dart'; +export 'account/attribute.dart'; +export 'account/account_request.dart'; // User export 'user/user_id.dart'; export 'user/user_profile.dart'; export 'user/avatar_id.dart'; +export 'user/user_profile_response.dart'; // Mailbox export 'mailbox/presentation_mailbox.dart'; @@ -22,9 +26,20 @@ export 'email/email_content.dart'; export 'email/prefix_email_address.dart'; export 'email/email_action_type.dart'; export 'email/presentation_email_address.dart'; +export 'email/email_address_cache.dart'; // Extensions export 'extensions/email_address_extension.dart'; export 'extensions/list_email_address_extension.dart'; export 'extensions/session_extension.dart'; -export 'extensions/utcdate_extension.dart'; \ No newline at end of file +export 'extensions/utc_date_extension.dart'; +export 'extensions/email_extension.dart'; +export 'extensions/presentation_account_extension.dart'; +export 'extensions/user_profile_extension.dart'; +export 'extensions/presentation_email_extension.dart'; + +// Converter +export 'converter/avatar_id_converter.dart'; +export 'converter/avatar_id_nullable_converter.dart'; +export 'converter/presentation_email_address_converter.dart'; +export 'converter/user_id_converter.dart'; \ No newline at end of file diff --git a/lib/features/login/data/model/response/user_profile_response.dart b/model/lib/user/user_profile_response.dart similarity index 83% rename from lib/features/login/data/model/response/user_profile_response.dart rename to model/lib/user/user_profile_response.dart index 45c7191b8..dbba73f09 100644 --- a/lib/features/login/data/model/response/user_profile_response.dart +++ b/model/lib/user/user_profile_response.dart @@ -1,11 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/login/data/model/converter/avatar_id_converter.dart'; -import 'package:tmail_ui_user/features/login/data/model/converter/avatar_id_nullable_converter.dart'; -import 'package:tmail_ui_user/features/login/data/model/converter/user_id_converter.dart'; -import 'package:tmail_ui_user/features/login/data/model/response/presentation_account_response.dart'; -import 'package:tmail_ui_user/features/login/data/utils/attribute.dart'; part 'user_profile_response.g.dart'; diff --git a/model/pubspec.yaml b/model/pubspec.yaml index 3da4790d7..cd6a1d4f0 100644 --- a/model/pubspec.yaml +++ b/model/pubspec.yaml @@ -24,6 +24,9 @@ dependencies: flutter: sdk: flutter + core: + path: ../core + # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 @@ -46,11 +49,16 @@ dependencies: # uri uri: 1.0.0 + # json_annotation + json_annotation: 4.0.1 + dev_dependencies: flutter_test: sdk: flutter build_runner: 2.0.5 + + json_serializable: 4.1.3 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/pubspec.yaml b/pubspec.yaml index ae2c8d1ba..66e058825 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,9 +23,9 @@ environment: dependency_overrides: # build_runner dependencies intl: 0.17.0 - args: 2.1.1 - dart_style: 2.0.2 - analyzer: 2.0.0 + args: 2.2.0 + dart_style: 2.0.3 + analyzer: 2.2.0 petitparser: 4.2.0 meta: 1.7.0 @@ -58,7 +58,6 @@ dependencies: # Http client dio: 4.0.0 - json_annotation: 4.0.1 # equatable equatable: 2.0.3 @@ -92,7 +91,10 @@ dependencies: flutter_widget_from_html: 0.6.2 # flutter_chips_input - flutter_chips_input: 1.10.0 + flutter_chips_input: + git: + url: git://github.com/dab246/flutter_chips_input.git + ref: master # html_editor_enhanced html_editor_enhanced: @@ -100,12 +102,15 @@ dependencies: url: git://github.com/dab246/html-editor-enhanced.git ref: master + # uuid + uuid: 3.0.4 + dev_dependencies: flutter_test: sdk: flutter build_runner: 2.0.5 - json_serializable: 4.1.3 + mockito: 5.0.10 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec