TF-2189 Keep composer available before click on proceed
(cherry picked from commit a818b91fc6faa395c9935cd411676b914c237b1f)
This commit is contained in:
@@ -51,6 +51,7 @@ import 'package:tmail_ui_user/features/composer/presentation/controller/rich_tex
|
|||||||
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/extensions/file_upload_extension.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/file_upload_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/image_source.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/image_source.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.dart';
|
||||||
@@ -872,31 +873,101 @@ class ComposerController extends BaseController {
|
|||||||
? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName)
|
? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
final sendingEmailArguments = SendingEmailArguments(
|
if (PlatformInfo.isMobile && !networkConnectionController.isNetworkConnectionAvailable()) {
|
||||||
session,
|
switch(arguments.sendingEmailActionType) {
|
||||||
accountId,
|
case SendingEmailActionType.create:
|
||||||
emailRequest,
|
_showConfirmDialogStoreSendingEmail(
|
||||||
mailboxRequest,
|
SendingEmailArguments(
|
||||||
sendingEmailActionType: arguments.sendingEmail != null
|
session,
|
||||||
? SendingEmailActionType.edit
|
accountId,
|
||||||
: SendingEmailActionType.create,
|
emailRequest,
|
||||||
);
|
mailboxRequest,
|
||||||
uploadController.clearInlineFileUploaded();
|
actionMode: ComposeActionMode.pushQueue
|
||||||
|
)
|
||||||
if (PlatformInfo.isWeb) {
|
);
|
||||||
closeComposerWeb(result: sendingEmailArguments);
|
break;
|
||||||
|
case SendingEmailActionType.edit:
|
||||||
|
uploadController.clearInlineFileUploaded();
|
||||||
|
_closeComposerAction(
|
||||||
|
result: SendingEmailArguments(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
emailRequest,
|
||||||
|
mailboxRequest,
|
||||||
|
actionMode: ComposeActionMode.editQueue
|
||||||
|
)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
uploadController.clearInlineFileUploaded();
|
||||||
|
_closeComposerAction(
|
||||||
|
result: SendingEmailArguments(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
emailRequest,
|
||||||
|
mailboxRequest,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
popBack(result: sendingEmailArguments);
|
uploadController.clearInlineFileUploaded();
|
||||||
|
_closeComposerAction(
|
||||||
|
result: SendingEmailArguments(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
emailRequest,
|
||||||
|
mailboxRequest,
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (PlatformInfo.isWeb) {
|
logError('ComposerController::_handleSendMessages: arguments/accountId/userProfile/session is NULL');
|
||||||
closeComposerWeb();
|
uploadController.clearInlineFileUploaded();
|
||||||
} else {
|
_closeComposerAction();
|
||||||
popBack();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _showConfirmDialogStoreSendingEmail(SendingEmailArguments sendingEmailArguments) {
|
||||||
|
showConfirmDialogAction(
|
||||||
|
currentContext!,
|
||||||
|
'',
|
||||||
|
AppLocalizations.of(currentContext!).proceed,
|
||||||
|
onConfirmAction: () {
|
||||||
|
uploadController.clearInlineFileUploaded();
|
||||||
|
_closeComposerAction(result: sendingEmailArguments);
|
||||||
|
},
|
||||||
|
title: AppLocalizations.of(currentContext!).youAreInOfflineMode,
|
||||||
|
icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode),
|
||||||
|
alignCenter: true,
|
||||||
|
messageStyle: const TextStyle(
|
||||||
|
color: AppColor.colorTitleSendingItem,
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.normal
|
||||||
|
),
|
||||||
|
listTextSpan: [
|
||||||
|
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst),
|
||||||
|
TextSpan(
|
||||||
|
text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: AppColor.colorTitleSendingItem,
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird),
|
||||||
|
TextSpan(
|
||||||
|
text: AppLocalizations.of(currentContext!).sendingQueue,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: AppColor.colorTitleSendingItem,
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail)
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
void _checkContactPermission() async {
|
void _checkContactPermission() async {
|
||||||
final permissionStatus = await Permission.contacts.status;
|
final permissionStatus = await Permission.contacts.status;
|
||||||
if (permissionStatus.isGranted) {
|
if (permissionStatus.isGranted) {
|
||||||
@@ -1369,7 +1440,15 @@ class ComposerController extends BaseController {
|
|||||||
FocusScope.of(context).unfocus();
|
FocusScope.of(context).unfocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeComposerWeb({dynamic result}) {
|
void _closeComposerAction({dynamic result}) {
|
||||||
|
if (PlatformInfo.isWeb) {
|
||||||
|
_closeComposerWeb(result: result);
|
||||||
|
} else {
|
||||||
|
popBack(result: result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _closeComposerWeb({dynamic result}) {
|
||||||
FocusManager.instance.primaryFocus?.unfocus();
|
FocusManager.instance.primaryFocus?.unfocus();
|
||||||
mailboxDashBoardController.closeComposerOverlay(result: result);
|
mailboxDashBoardController.closeComposerOverlay(result: result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
enum ComposeActionMode {
|
||||||
|
pushQueue,
|
||||||
|
editQueue,
|
||||||
|
sent
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import 'package:model/model.dart';
|
|||||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/composer_cache.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/composer_cache.dart';
|
||||||
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
|
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
||||||
|
|
||||||
class ComposerArguments extends RouterArguments {
|
class ComposerArguments extends RouterArguments {
|
||||||
@@ -131,6 +132,10 @@ class ComposerArguments extends RouterArguments {
|
|||||||
references: references,
|
references: references,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SendingEmailActionType get sendingEmailActionType => sendingEmail != null
|
||||||
|
? SendingEmailActionType.edit
|
||||||
|
: SendingEmailActionType.create;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [
|
List<Object?> get props => [
|
||||||
emailActionType,
|
emailActionType,
|
||||||
|
|||||||
+41
-106
@@ -29,6 +29,7 @@ import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_draft
|
|||||||
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
|
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
|
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart';
|
import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart';
|
||||||
@@ -104,7 +105,6 @@ import 'package:tmail_ui_user/features/sending_queue/domain/state/update_sending
|
|||||||
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart';
|
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/store_sending_email_interactor.dart';
|
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/store_sending_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_sending_email_interactor.dart';
|
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_sending_email_interactor.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';
|
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/session/domain/usecases/store_session_interactor.dart';
|
import 'package:tmail_ui_user/features/session/domain/usecases/store_session_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
||||||
@@ -368,13 +368,21 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
if (PlatformInfo.isMobile &&
|
if (PlatformInfo.isMobile &&
|
||||||
failure is SendEmailFailure &&
|
failure is SendEmailFailure &&
|
||||||
exception is NoNetworkError) {
|
exception is NoNetworkError) {
|
||||||
_handleSendingEmailWhenNoNetwork(
|
if (failure.emailRequest.storedSendingId != null) {
|
||||||
failure.session,
|
_handleStoreSendingEmail(
|
||||||
failure.accountId,
|
failure.session,
|
||||||
failure.emailRequest,
|
failure.accountId,
|
||||||
failure.mailboxRequest,
|
failure.emailRequest,
|
||||||
failure.sendingEmailActionType
|
failure.mailboxRequest
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
_handleUpdateSendingEmail(
|
||||||
|
failure.session,
|
||||||
|
failure.accountId,
|
||||||
|
failure.emailRequest,
|
||||||
|
failure.mailboxRequest
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1243,13 +1251,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
composerOverlayState.value = ComposerOverlayState.inActive;
|
composerOverlayState.value = ComposerOverlayState.inActive;
|
||||||
|
|
||||||
if (result is SendingEmailArguments) {
|
if (result is SendingEmailArguments) {
|
||||||
handleSendEmailAction(
|
handleSendEmailAction(result);
|
||||||
result.session,
|
|
||||||
result.accountId,
|
|
||||||
result.emailRequest,
|
|
||||||
result.mailboxRequest,
|
|
||||||
result.sendingEmailActionType
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1361,13 +1363,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
} else {
|
} else {
|
||||||
final result = await push(AppRoutes.composer, arguments: arguments);
|
final result = await push(AppRoutes.composer, arguments: arguments);
|
||||||
if (result is SendingEmailArguments) {
|
if (result is SendingEmailArguments) {
|
||||||
handleSendEmailAction(
|
handleSendEmailAction(result);
|
||||||
result.session,
|
|
||||||
result.accountId,
|
|
||||||
result.emailRequest,
|
|
||||||
result.mailboxRequest,
|
|
||||||
result.sendingEmailActionType
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1806,47 +1802,31 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
clearState();
|
clearState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleSendEmailAction(
|
void handleSendEmailAction(SendingEmailArguments arguments) {
|
||||||
Session session,
|
switch(arguments.actionMode) {
|
||||||
AccountId accountId,
|
case ComposeActionMode.pushQueue:
|
||||||
EmailRequest emailRequest,
|
_handleStoreSendingEmail(
|
||||||
CreateNewMailboxRequest? mailboxRequest,
|
arguments.session,
|
||||||
SendingEmailActionType sendingEmailActionType
|
arguments.accountId,
|
||||||
) {
|
arguments.emailRequest,
|
||||||
if (PlatformInfo.isWeb ||
|
arguments.mailboxRequest
|
||||||
(PlatformInfo.isMobile && networkConnectionController.isNetworkConnectionAvailable())) {
|
);
|
||||||
consumeState(_sendEmailInteractor.execute(
|
|
||||||
session,
|
|
||||||
accountId,
|
|
||||||
emailRequest,
|
|
||||||
mailboxRequest: mailboxRequest
|
|
||||||
));
|
|
||||||
} else {
|
|
||||||
_handleSendingEmailWhenNoNetwork(
|
|
||||||
session,
|
|
||||||
accountId,
|
|
||||||
emailRequest,
|
|
||||||
mailboxRequest,
|
|
||||||
sendingEmailActionType
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleSendingEmailWhenNoNetwork(
|
|
||||||
Session session,
|
|
||||||
AccountId accountId,
|
|
||||||
EmailRequest emailRequest,
|
|
||||||
CreateNewMailboxRequest? mailboxRequest,
|
|
||||||
SendingEmailActionType? sendingEmailActionType
|
|
||||||
) {
|
|
||||||
switch(sendingEmailActionType) {
|
|
||||||
case SendingEmailActionType.create:
|
|
||||||
_showConfirmDialogStoreSendingEmail(session, accountId, emailRequest, mailboxRequest);
|
|
||||||
break;
|
break;
|
||||||
case SendingEmailActionType.edit:
|
case ComposeActionMode.editQueue:
|
||||||
_handleUpdateSendingEmail(session, accountId, emailRequest, mailboxRequest);
|
_handleUpdateSendingEmail(
|
||||||
|
arguments.session,
|
||||||
|
arguments.accountId,
|
||||||
|
arguments.emailRequest,
|
||||||
|
arguments.mailboxRequest
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
case ComposeActionMode.sent:
|
||||||
|
consumeState(_sendEmailInteractor.execute(
|
||||||
|
arguments.session,
|
||||||
|
arguments.accountId,
|
||||||
|
arguments.emailRequest,
|
||||||
|
mailboxRequest: arguments.mailboxRequest
|
||||||
|
));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1884,51 +1864,6 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _showConfirmDialogStoreSendingEmail(
|
|
||||||
Session session,
|
|
||||||
AccountId accountId,
|
|
||||||
EmailRequest emailRequest,
|
|
||||||
CreateNewMailboxRequest? mailboxRequest
|
|
||||||
) {
|
|
||||||
showConfirmDialogAction(
|
|
||||||
currentContext!,
|
|
||||||
'',
|
|
||||||
AppLocalizations.of(currentContext!).proceed,
|
|
||||||
onConfirmAction: () {
|
|
||||||
_handleStoreSendingEmail(session, accountId, emailRequest, mailboxRequest);
|
|
||||||
},
|
|
||||||
title: AppLocalizations.of(currentContext!).youAreInOfflineMode,
|
|
||||||
icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode),
|
|
||||||
alignCenter: true,
|
|
||||||
messageStyle: const TextStyle(
|
|
||||||
color: AppColor.colorTitleSendingItem,
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.normal
|
|
||||||
),
|
|
||||||
listTextSpan: [
|
|
||||||
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst),
|
|
||||||
TextSpan(
|
|
||||||
text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond,
|
|
||||||
style: const TextStyle(
|
|
||||||
color: AppColor.colorTitleSendingItem,
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.w600
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird),
|
|
||||||
TextSpan(
|
|
||||||
text: AppLocalizations.of(currentContext!).sendingQueue,
|
|
||||||
style: const TextStyle(
|
|
||||||
color: AppColor.colorTitleSendingItem,
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.w600
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail)
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) {
|
void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) {
|
||||||
addSendingEmailToSendingQueue(success.sendingEmail);
|
addSendingEmailToSendingQueue(success.sendingEmail);
|
||||||
getAllSendingEmails();
|
getAllSendingEmails();
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
|
|
||||||
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
||||||
|
|
||||||
class SendingEmailArguments extends RouterArguments {
|
class SendingEmailArguments extends RouterArguments {
|
||||||
@@ -10,7 +10,7 @@ class SendingEmailArguments extends RouterArguments {
|
|||||||
final AccountId accountId;
|
final AccountId accountId;
|
||||||
final EmailRequest emailRequest;
|
final EmailRequest emailRequest;
|
||||||
final CreateNewMailboxRequest? mailboxRequest;
|
final CreateNewMailboxRequest? mailboxRequest;
|
||||||
final SendingEmailActionType sendingEmailActionType;
|
final ComposeActionMode actionMode;
|
||||||
|
|
||||||
SendingEmailArguments(
|
SendingEmailArguments(
|
||||||
this.session,
|
this.session,
|
||||||
@@ -18,7 +18,7 @@ class SendingEmailArguments extends RouterArguments {
|
|||||||
this.emailRequest,
|
this.emailRequest,
|
||||||
this.mailboxRequest,
|
this.mailboxRequest,
|
||||||
{
|
{
|
||||||
this.sendingEmailActionType = SendingEmailActionType.create
|
this.actionMode = ComposeActionMode.sent
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -28,6 +28,6 @@ class SendingEmailArguments extends RouterArguments {
|
|||||||
accountId,
|
accountId,
|
||||||
emailRequest,
|
emailRequest,
|
||||||
mailboxRequest,
|
mailboxRequest,
|
||||||
sendingEmailActionType
|
actionMode
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user