feat(Label): Add depend on settings to register websocket for label
This commit is contained in:
@@ -379,9 +379,13 @@ abstract class BaseController extends GetxController
|
||||
}
|
||||
}
|
||||
|
||||
void injectWebSocket(Session? session, AccountId? accountId) {
|
||||
void injectWebSocket({
|
||||
Session? session,
|
||||
AccountId? accountId,
|
||||
bool isLabelAvailable = false,
|
||||
}) {
|
||||
try {
|
||||
log('$runtimeType::injectWebSocket:');
|
||||
log('$runtimeType::injectWebSocket: isLabelAvailable is $isLabelAvailable');
|
||||
requireCapability(
|
||||
session!,
|
||||
accountId!,
|
||||
@@ -397,7 +401,11 @@ abstract class BaseController extends GetxController
|
||||
throw WebSocketPushNotSupportedException();
|
||||
}
|
||||
WebSocketInteractorBindings().dependencies();
|
||||
WebSocketController.instance.initialize(accountId: accountId, session: session);
|
||||
WebSocketController.instance.initialize(
|
||||
accountId: accountId,
|
||||
session: session,
|
||||
isLabelAvailable: isLabelAvailable,
|
||||
);
|
||||
} catch(e) {
|
||||
logWarning('$runtimeType::injectWebSocket(): exception: $e');
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ 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/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/jmap_request.dart';
|
||||
import 'package:labels/labels.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/batch_get_label_processing_mixin.dart';
|
||||
@@ -19,8 +18,6 @@ import 'package:uuid/uuid.dart';
|
||||
class LabelApi
|
||||
with HandleSetErrorMixin, SessionMixin, BatchGetLabelProcessingMixin {
|
||||
|
||||
static const int _defaultMaxChanges = 128;
|
||||
|
||||
final HttpClient _httpClient;
|
||||
final Uuid _uuid;
|
||||
|
||||
@@ -178,11 +175,7 @@ class LabelApi
|
||||
processingInvocation,
|
||||
);
|
||||
|
||||
final changesLabelMethod = ChangesLabelMethod(
|
||||
accountId,
|
||||
sinceState,
|
||||
maxChanges: UnsignedInt(_defaultMaxChanges),
|
||||
);
|
||||
final changesLabelMethod = ChangesLabelMethod(accountId, sinceState);
|
||||
final changesLabelInvocation =
|
||||
jmapRequestBuilder.invocation(changesLabelMethod);
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ extension HandleLabelWebsocketExtension on LabelController {
|
||||
currentLabelState == null ||
|
||||
currentLabelState == newState ||
|
||||
isLabelSettingEnabled.isFalse) {
|
||||
logWarning('HandleLabelWebsocketExtension::refreshLabelChanges: accountId or session or currentLabelState or newState or isLabelSettingEnabled is null');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+14
-9
@@ -337,9 +337,7 @@ class MailboxDashBoardController extends ReloadableController
|
||||
int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete;
|
||||
EmailSortOrderType currentSortOrder = SearchEmailFilter.defaultSortOrder;
|
||||
PaywallController? paywallController;
|
||||
Worker? advancedSearchVisibleWorker;
|
||||
Worker? searchInputFocusWorker;
|
||||
Worker? _downloadUIActionWorker;
|
||||
final workerObxVariables = <Worker>[];
|
||||
|
||||
final StreamController<Either<Failure, Success>> progressStateController =
|
||||
StreamController<Either<Failure, Success>>.broadcast();
|
||||
@@ -394,6 +392,7 @@ class MailboxDashBoardController extends ReloadableController
|
||||
_registerDeepLinks();
|
||||
}
|
||||
_registerStreamListener();
|
||||
registerLabelReactiveObxListener();
|
||||
BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
await ApplicationManager().initUserAgent();
|
||||
@@ -804,7 +803,7 @@ class MailboxDashBoardController extends ReloadableController
|
||||
}
|
||||
|
||||
void _registerDownloadUIActionListener() {
|
||||
_downloadUIActionWorker = ever(
|
||||
workerObxVariables.add(ever(
|
||||
downloadController.downloadUIAction,
|
||||
(action) {
|
||||
if (action is OpenComposerFromMailtoLinkAction) {
|
||||
@@ -812,7 +811,7 @@ class MailboxDashBoardController extends ReloadableController
|
||||
downloadController.clearDownloadUIAction();
|
||||
}
|
||||
},
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
Future<void> _handleClickNotificationOnAndroidInTerminated() async {
|
||||
@@ -895,7 +894,6 @@ class MailboxDashBoardController extends ReloadableController
|
||||
injectAutoCompleteBindings(session, currentAccountId);
|
||||
injectRuleFilterBindings(session, currentAccountId);
|
||||
injectVacationBindings(session, currentAccountId);
|
||||
injectWebSocket(session, currentAccountId);
|
||||
injectPreferencesBindings();
|
||||
injectAIScribeBindings(session, currentAccountId);
|
||||
if (PlatformInfo.isMobile) {
|
||||
@@ -921,6 +919,8 @@ class MailboxDashBoardController extends ReloadableController
|
||||
|
||||
if (isLabelCapabilitySupported) {
|
||||
labelController.checkLabelSettingState(session, currentAccountId);
|
||||
} else {
|
||||
injectWebSocket(session: session, accountId: currentAccountId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3420,11 +3420,17 @@ class MailboxDashBoardController extends ReloadableController
|
||||
bool get isEmailListDisplayed =>
|
||||
dashboardRoute.value == DashboardRoutes.thread;
|
||||
|
||||
void _disposeWorkerObxVariables() {
|
||||
for (var worker in workerObxVariables) {
|
||||
worker.dispose();
|
||||
}
|
||||
workerObxVariables.clear();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
if (PlatformInfo.isWeb) {
|
||||
listSearchFilterScrollController?.dispose();
|
||||
disposeReactiveObxVariableListener();
|
||||
}
|
||||
if (PlatformInfo.isIOS) {
|
||||
_iosNotificationManager?.dispose();
|
||||
@@ -3453,8 +3459,7 @@ class MailboxDashBoardController extends ReloadableController
|
||||
twakeAppManager.setHasComposer(false);
|
||||
paywallController?.onClose();
|
||||
paywallController = null;
|
||||
_downloadUIActionWorker?.dispose();
|
||||
_downloadUIActionWorker = null;
|
||||
_disposeWorkerObxVariables();
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
+4
-11
@@ -8,15 +8,15 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_
|
||||
extension HandleReactiveObxVariableExtension on MailboxDashBoardController {
|
||||
|
||||
void registerReactiveObxVariableListener() {
|
||||
advancedSearchVisibleWorker = ever(
|
||||
workerObxVariables.add(ever(
|
||||
searchController.isAdvancedSearchViewOpen,
|
||||
_onAdvancedSearchVisibleChanged
|
||||
);
|
||||
));
|
||||
|
||||
searchInputFocusWorker = ever(
|
||||
workerObxVariables.add(ever(
|
||||
searchController.isSearchInputFocused,
|
||||
onSearchInputFocusChanged
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
void _onAdvancedSearchVisibleChanged(bool visible) {
|
||||
@@ -52,11 +52,4 @@ extension HandleReactiveObxVariableExtension on MailboxDashBoardController {
|
||||
|
||||
dispatchAction(dashboardAction);
|
||||
}
|
||||
|
||||
void disposeReactiveObxVariableListener() {
|
||||
advancedSearchVisibleWorker?.dispose();
|
||||
advancedSearchVisibleWorker = null;
|
||||
searchInputFocusWorker?.dispose();
|
||||
searchInputFocusWorker = null;
|
||||
}
|
||||
}
|
||||
+19
@@ -1,3 +1,4 @@
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||
|
||||
@@ -15,4 +16,22 @@ extension HandleLogicLabelExtension on MailboxDashBoardController {
|
||||
return labelController.isLabelSettingEnabled.isTrue &&
|
||||
isLabelCapabilitySupported;
|
||||
}
|
||||
|
||||
void registerLabelReactiveObxListener() {
|
||||
workerObxVariables.add(
|
||||
ever(
|
||||
labelController.isLabelSettingEnabled,
|
||||
_onLabelSettingEnabledChanged,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _onLabelSettingEnabledChanged(bool isEnabled) {
|
||||
log('$runtimeType::_onLabelSettingEnabledChanged: isEnabled is $isEnabled');
|
||||
injectWebSocket(
|
||||
session: sessionCurrent,
|
||||
accountId: accountId.value,
|
||||
isLabelAvailable: isEnabled,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,8 +41,19 @@ class WebSocketController extends PushBaseController {
|
||||
NetworkConnectionController? _networkConnectionController;
|
||||
StreamSubscription<ConnectivityResult>? _connectivitySubscription;
|
||||
|
||||
static final List<TypeName> _mailTypePushSupported = [
|
||||
TypeName.emailType,
|
||||
TypeName.mailboxType,
|
||||
];
|
||||
static final List<TypeName> _labelTypePushSupported = [
|
||||
TypeName.emailType,
|
||||
TypeName.mailboxType,
|
||||
TypeName.labelType,
|
||||
];
|
||||
|
||||
int _retryRemained = 3;
|
||||
bool _isConnecting = false;
|
||||
bool _isLabelAvailable = false;
|
||||
WebSocketChannel? _webSocketChannel;
|
||||
Timer? _webSocketPingTimer;
|
||||
StreamSubscription? _webSocketSubscription;
|
||||
@@ -72,10 +83,14 @@ class WebSocketController extends PushBaseController {
|
||||
}
|
||||
|
||||
@override
|
||||
void initialize({AccountId? accountId, Session? session}) {
|
||||
log('WebSocketController::initialize:AccountId = ${accountId?.asString}');
|
||||
void initialize({
|
||||
AccountId? accountId,
|
||||
Session? session,
|
||||
bool isLabelAvailable = false,
|
||||
}) {
|
||||
log('WebSocketController::initialize:AccountId = ${accountId?.asString}, isLabelAvailable = $isLabelAvailable');
|
||||
super.initialize(accountId: accountId, session: session);
|
||||
|
||||
_isLabelAvailable = isLabelAvailable;
|
||||
_connectWebSocket();
|
||||
_listenToAppLifeCycle();
|
||||
if (PlatformInfo.isWeb) {
|
||||
@@ -184,9 +199,12 @@ class WebSocketController extends PushBaseController {
|
||||
}
|
||||
|
||||
void _enableWebSocketPush() {
|
||||
log('WebSocketController::_enableWebSocketPush:');
|
||||
final dataTypes = _isLabelAvailable
|
||||
? _labelTypePushSupported
|
||||
: _mailTypePushSupported;
|
||||
log('WebSocketController::_enableWebSocketPush: DataType is $dataTypes');
|
||||
_webSocketChannel?.sink.add(jsonEncode(WebSocketPushEnableRequest.toJson(
|
||||
dataTypes: [TypeName.emailType, TypeName.mailboxType, TypeName.labelType]
|
||||
dataTypes: dataTypes,
|
||||
)));
|
||||
}
|
||||
|
||||
|
||||
@@ -11,10 +11,14 @@ class LabelChangeListener extends ChangeListener {
|
||||
LabelController? _labelController;
|
||||
|
||||
LabelChangeListener._internal() {
|
||||
_labelController = getBinding<LabelController>();
|
||||
if (_labelController == null) {
|
||||
logWarning(
|
||||
'LabelChangeListener::_internal(): LabelController IS NOT REGISTERED');
|
||||
try {
|
||||
_labelController = getBinding<LabelController>();
|
||||
if (_labelController == null) {
|
||||
logWarning(
|
||||
'LabelChangeListener::_internal(): LabelController IS NOT REGISTERED');
|
||||
}
|
||||
} catch (e) {
|
||||
logWarning('LabelChangeListener::_internal(): $e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
@@ -404,6 +404,7 @@ void main() {
|
||||
|
||||
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
|
||||
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
|
||||
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
|
||||
|
||||
Get.put(mailboxDashboardController);
|
||||
mailboxDashboardController.onReady();
|
||||
@@ -451,6 +452,7 @@ void main() {
|
||||
when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager()));
|
||||
when(context.mounted).thenReturn(true);
|
||||
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
|
||||
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
|
||||
|
||||
// expect query in search controller update as expected
|
||||
mailboxDashboardController.searchEmailByQueryString(queryString);
|
||||
@@ -635,6 +637,7 @@ void main() {
|
||||
|
||||
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
|
||||
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
|
||||
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
|
||||
|
||||
Get.put(mailboxDashboardController);
|
||||
mailboxDashboardController.onReady();
|
||||
|
||||
+1
@@ -365,6 +365,7 @@ void main() {
|
||||
|
||||
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
|
||||
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
|
||||
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
|
||||
|
||||
searchController = SearchController(
|
||||
quickSearchEmailInteractor,
|
||||
|
||||
@@ -394,6 +394,7 @@ void main() {
|
||||
|
||||
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
|
||||
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
|
||||
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
|
||||
|
||||
Get.put<MailboxDashBoardController>(mailboxDashboardController);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user