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: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 SubscribeMailboxRequest with EquatableMixin {
|
||||
class SubscribeMailboxRequest extends SubscribeRequest {
|
||||
|
||||
final MailboxId mailboxId;
|
||||
final MailboxSubscribeState newState;
|
||||
final MailboxSubscribeAction mailboxSubscribeStateAction;
|
||||
|
||||
SubscribeMailboxRequest(
|
||||
this.mailboxId,
|
||||
this.newState,
|
||||
this.mailboxSubscribeStateAction);
|
||||
this.mailboxId,
|
||||
MailboxSubscribeState subscribeState,
|
||||
MailboxSubscribeAction subscribeAction,
|
||||
) : super(subscribeState, subscribeAction);
|
||||
|
||||
@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/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_multiple_mailbox_request.dart';
|
||||
|
||||
abstract class MailboxRepository {
|
||||
Stream<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties});
|
||||
@@ -39,4 +40,6 @@ abstract class MailboxRepository {
|
||||
Future<State?> getMailboxState();
|
||||
|
||||
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 {
|
||||
final MailboxId mailboxId;
|
||||
final MailboxSubscribeAction mailboxSubscribeStateAction;
|
||||
final MailboxSubscribeAction subscribeAction;
|
||||
|
||||
SubscribeMailboxSuccess(
|
||||
this.mailboxId,
|
||||
this.mailboxSubscribeStateAction,
|
||||
this.subscribeAction,
|
||||
{
|
||||
jmap.State? currentEmailState,
|
||||
jmap.State? currentMailboxState,
|
||||
@@ -21,10 +21,9 @@ class SubscribeMailboxSuccess extends UIActionState {
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
mailboxId,
|
||||
currentEmailState,
|
||||
currentMailboxState,
|
||||
mailboxSubscribeStateAction
|
||||
mailboxId,
|
||||
subscribeAction,
|
||||
super.props
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
request.mailboxId,
|
||||
currentMailboxState: currentMailboxState,
|
||||
request.mailboxSubscribeStateAction));
|
||||
request.subscribeAction));
|
||||
} else {
|
||||
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(']'));
|
||||
|
||||
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
|
||||
List<Object?> get props => [
|
||||
|
||||
Reference in New Issue
Block a user