TF-1432 [Domain] Implement subscribe multiple mailbox
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:model/mailbox/mailbox_property.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
||||||
|
|
||||||
|
extension ListMailboxIdExtension on List<MailboxId> {
|
||||||
|
|
||||||
|
Map<Id, PatchObject> generateMapUpdateObjectSubscribeMailbox(MailboxSubscribeState subscribeState) {
|
||||||
|
final Map<Id, PatchObject> maps = {
|
||||||
|
for (var mailboxId in this)
|
||||||
|
mailboxId.id: PatchObject({
|
||||||
|
MailboxProperty.isSubscribed: subscribeState == MailboxSubscribeState.enabled
|
||||||
|
})
|
||||||
|
};
|
||||||
|
return maps;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,19 +1,21 @@
|
|||||||
import 'package:equatable/equatable.dart';
|
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart';
|
||||||
|
|
||||||
class SubscribeMailboxRequest with EquatableMixin {
|
class SubscribeMailboxRequest extends SubscribeRequest {
|
||||||
|
|
||||||
final MailboxId mailboxId;
|
final MailboxId mailboxId;
|
||||||
final MailboxSubscribeState newState;
|
|
||||||
final MailboxSubscribeAction mailboxSubscribeStateAction;
|
|
||||||
|
|
||||||
SubscribeMailboxRequest(
|
SubscribeMailboxRequest(
|
||||||
this.mailboxId,
|
this.mailboxId,
|
||||||
this.newState,
|
MailboxSubscribeState subscribeState,
|
||||||
this.mailboxSubscribeStateAction);
|
MailboxSubscribeAction subscribeAction,
|
||||||
|
) : super(subscribeState, subscribeAction);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [mailboxId, newState, mailboxSubscribeStateAction];
|
List<Object?> get props => [
|
||||||
|
mailboxId,
|
||||||
|
super.props
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart';
|
||||||
|
|
||||||
|
class SubscribeMultipleMailboxRequest extends SubscribeRequest {
|
||||||
|
|
||||||
|
final MailboxId parentMailboxId;
|
||||||
|
final List<MailboxId> mailboxIdsSubscribe;
|
||||||
|
|
||||||
|
SubscribeMultipleMailboxRequest(
|
||||||
|
this.parentMailboxId,
|
||||||
|
this.mailboxIdsSubscribe,
|
||||||
|
MailboxSubscribeState subscribeState,
|
||||||
|
MailboxSubscribeAction subscribeAction,
|
||||||
|
) : super(subscribeState, subscribeAction);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
parentMailboxId,
|
||||||
|
mailboxIdsSubscribe,
|
||||||
|
super.props
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
||||||
|
|
||||||
|
abstract class SubscribeRequest with EquatableMixin {
|
||||||
|
|
||||||
|
final MailboxSubscribeState subscribeState;
|
||||||
|
final MailboxSubscribeAction subscribeAction;
|
||||||
|
|
||||||
|
SubscribeRequest(this.subscribeState, this.subscribeAction);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [subscribeState, subscribeAction];
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dar
|
|||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
|
||||||
|
|
||||||
abstract class MailboxRepository {
|
abstract class MailboxRepository {
|
||||||
Stream<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties});
|
Stream<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties});
|
||||||
@@ -39,4 +40,6 @@ abstract class MailboxRepository {
|
|||||||
Future<State?> getMailboxState();
|
Future<State?> getMailboxState();
|
||||||
|
|
||||||
Future<bool> subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request);
|
Future<bool> subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request);
|
||||||
|
|
||||||
|
Future<List<MailboxId>> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest);
|
||||||
}
|
}
|
||||||
@@ -8,11 +8,11 @@ class LoadingSubscribeMailbox extends UIState {}
|
|||||||
|
|
||||||
class SubscribeMailboxSuccess extends UIActionState {
|
class SubscribeMailboxSuccess extends UIActionState {
|
||||||
final MailboxId mailboxId;
|
final MailboxId mailboxId;
|
||||||
final MailboxSubscribeAction mailboxSubscribeStateAction;
|
final MailboxSubscribeAction subscribeAction;
|
||||||
|
|
||||||
SubscribeMailboxSuccess(
|
SubscribeMailboxSuccess(
|
||||||
this.mailboxId,
|
this.mailboxId,
|
||||||
this.mailboxSubscribeStateAction,
|
this.subscribeAction,
|
||||||
{
|
{
|
||||||
jmap.State? currentEmailState,
|
jmap.State? currentEmailState,
|
||||||
jmap.State? currentMailboxState,
|
jmap.State? currentMailboxState,
|
||||||
@@ -22,9 +22,8 @@ class SubscribeMailboxSuccess extends UIActionState {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [
|
List<Object?> get props => [
|
||||||
mailboxId,
|
mailboxId,
|
||||||
currentEmailState,
|
subscribeAction,
|
||||||
currentMailboxState,
|
super.props
|
||||||
mailboxSubscribeStateAction
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
|
||||||
|
|
||||||
|
class LoadingSubscribeMultipleMailbox extends UIState {}
|
||||||
|
|
||||||
|
class SubscribeMultipleMailboxAllSuccess extends UIActionState {
|
||||||
|
|
||||||
|
final MailboxId parentMailboxId;
|
||||||
|
final List<MailboxId> mailboxIdsSubscribe;
|
||||||
|
final MailboxSubscribeAction subscribeAction;
|
||||||
|
|
||||||
|
SubscribeMultipleMailboxAllSuccess(
|
||||||
|
this.parentMailboxId,
|
||||||
|
this.mailboxIdsSubscribe,
|
||||||
|
this.subscribeAction,
|
||||||
|
{
|
||||||
|
jmap.State? currentEmailState,
|
||||||
|
jmap.State? currentMailboxState,
|
||||||
|
}
|
||||||
|
) : super(currentEmailState, currentMailboxState);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
parentMailboxId,
|
||||||
|
mailboxIdsSubscribe,
|
||||||
|
subscribeAction,
|
||||||
|
super.props
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubscribeMultipleMailboxHasSomeSuccess extends UIActionState {
|
||||||
|
|
||||||
|
final MailboxId parentMailboxId;
|
||||||
|
final List<MailboxId> mailboxIdsSubscribe;
|
||||||
|
final MailboxSubscribeAction subscribeAction;
|
||||||
|
|
||||||
|
SubscribeMultipleMailboxHasSomeSuccess(
|
||||||
|
this.parentMailboxId,
|
||||||
|
this.mailboxIdsSubscribe,
|
||||||
|
this.subscribeAction,
|
||||||
|
{
|
||||||
|
jmap.State? currentEmailState,
|
||||||
|
jmap.State? currentMailboxState,
|
||||||
|
}
|
||||||
|
) : super(currentEmailState, currentMailboxState);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
parentMailboxId,
|
||||||
|
mailboxIdsSubscribe,
|
||||||
|
subscribeAction,
|
||||||
|
super.props
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubscribeMultipleMailboxAllFailure extends FeatureFailure {
|
||||||
|
|
||||||
|
SubscribeMultipleMailboxAllFailure();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubscribeMultipleMailboxFailure extends FeatureFailure {
|
||||||
|
final dynamic exception;
|
||||||
|
|
||||||
|
SubscribeMultipleMailboxFailure(this.exception);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [exception];
|
||||||
|
}
|
||||||
@@ -23,7 +23,7 @@ class SubscribeMailboxInteractor {
|
|||||||
yield Right<Failure, Success>(SubscribeMailboxSuccess(
|
yield Right<Failure, Success>(SubscribeMailboxSuccess(
|
||||||
request.mailboxId,
|
request.mailboxId,
|
||||||
currentMailboxState: currentMailboxState,
|
currentMailboxState: currentMailboxState,
|
||||||
request.mailboxSubscribeStateAction));
|
request.subscribeAction));
|
||||||
} else {
|
} else {
|
||||||
yield Left<Failure, Success>(SubscribeMailboxFailure(null));
|
yield Left<Failure, Success>(SubscribeMailboxFailure(null));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart';
|
||||||
|
|
||||||
|
class SubscribeMultipleMailboxInteractor {
|
||||||
|
final MailboxRepository _mailboxRepository;
|
||||||
|
|
||||||
|
SubscribeMultipleMailboxInteractor(this._mailboxRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) async* {
|
||||||
|
try {
|
||||||
|
yield Right<Failure, Success>(LoadingSubscribeMultipleMailbox());
|
||||||
|
|
||||||
|
final currentMailboxState = await _mailboxRepository.getMailboxState();
|
||||||
|
final listResult = await _mailboxRepository.subscribeMultipleMailbox(accountId, subscribeRequest);
|
||||||
|
|
||||||
|
final matchedSize = listResult.length == subscribeRequest.mailboxIdsSubscribe.length;
|
||||||
|
final allMatchedMailboxIdSubscribe = subscribeRequest.mailboxIdsSubscribe
|
||||||
|
.every((mailboxId) => listResult.contains(mailboxId));
|
||||||
|
|
||||||
|
if (allMatchedMailboxIdSubscribe && matchedSize) {
|
||||||
|
yield Right<Failure, Success>(SubscribeMultipleMailboxAllSuccess(
|
||||||
|
subscribeRequest.parentMailboxId,
|
||||||
|
listResult,
|
||||||
|
subscribeRequest.subscribeAction,
|
||||||
|
currentMailboxState: currentMailboxState
|
||||||
|
));
|
||||||
|
} else if (listResult.isEmpty) {
|
||||||
|
yield Left<Failure, Success>(SubscribeMultipleMailboxAllFailure());
|
||||||
|
} else {
|
||||||
|
yield Right<Failure, Success>(SubscribeMultipleMailboxHasSomeSuccess(
|
||||||
|
subscribeRequest.parentMailboxId,
|
||||||
|
listResult,
|
||||||
|
subscribeRequest.subscribeAction,
|
||||||
|
currentMailboxState: currentMailboxState
|
||||||
|
));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
yield Left<Failure, Success>(SubscribeMultipleMailboxFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -101,7 +101,19 @@ class PresentationMailbox with EquatableMixin {
|
|||||||
(namespace?.value.indexOf('[') ?? 0) + 1,
|
(namespace?.value.indexOf('[') ?? 0) + 1,
|
||||||
namespace?.value.indexOf(']'));
|
namespace?.value.indexOf(']'));
|
||||||
|
|
||||||
bool get isShowDisableMailbox => isTeamMailboxes || hasRole() || !hasParentId();
|
bool get supportedSubscribe => isSubscribed?.value == true;
|
||||||
|
|
||||||
|
bool get isSupportedDisableMailbox {
|
||||||
|
if (!supportedSubscribe) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (isPersonal) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return isTeamMailboxes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [
|
List<Object?> get props => [
|
||||||
|
|||||||
Reference in New Issue
Block a user