feat(Label): Use capability-aware label availability in websocket injection.

This commit is contained in:
dab246
2026-03-03 15:23:57 +07:00
committed by Dat H. Pham
parent 2e6e1fcdc8
commit b2338a1160
7 changed files with 33 additions and 25 deletions
@@ -236,7 +236,7 @@ class LabelApi
log('LabelAPI::getChanges: '
'newStateChanges=${changes.newState} | '
'newStateLabel=$newStateLabel | '
'hasMore=${changes.hasMoreChanges}'
'hasMore=${changes.hasMoreChanges} | '
'updatedFetched=${updatedResult.labels?.length} | '
'createdFetched=${createdResult.labels?.length} | '
'totalDestroyed=${allDestroyedIds.length}');
@@ -10,12 +10,17 @@ import 'package:tmail_ui_user/features/push_notification/presentation/websocket/
extension HandleLabelWebsocketExtension on LabelController {
void refreshLabelChanges({required jmap.State newState}) {
if (accountId == null ||
session == null ||
currentLabelState == null ||
currentLabelState == newState ||
isLabelSettingEnabled.isFalse) {
logWarning('HandleLabelWebsocketExtension::refreshLabelChanges: accountId or session or currentLabelState or newState or isLabelSettingEnabled is null');
final skipReasons = <String>[
if (accountId == null) 'accountId is null',
if (session == null) 'session is null',
if (currentLabelState == null) 'currentLabelState is null',
if (currentLabelState == newState) 'state unchanged',
if (isLabelSettingEnabled.isFalse) 'label setting disabled',
];
if (skipReasons.isNotEmpty) {
logWarning(
'HandleLabelWebsocketExtension::refreshLabelChanges: skip (${skipReasons.join(', ')})',
);
return;
}
@@ -28,10 +28,11 @@ extension HandleLogicLabelExtension on MailboxDashBoardController {
void _onLabelSettingEnabledChanged(bool isEnabled) {
log('$runtimeType::_onLabelSettingEnabledChanged: isEnabled is $isEnabled');
final isLabelAvailable = isEnabled && isLabelCapabilitySupported;
injectWebSocket(
session: sessionCurrent,
accountId: accountId.value,
isLabelAvailable: isEnabled,
isLabelAvailable: isLabelAvailable,
);
}
}
@@ -10,17 +10,7 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class LabelChangeListener extends ChangeListener {
LabelController? _labelController;
LabelChangeListener._internal() {
try {
_labelController = getBinding<LabelController>();
if (_labelController == null) {
logWarning(
'LabelChangeListener::_internal(): LabelController IS NOT REGISTERED');
}
} catch (e) {
logWarning('LabelChangeListener::_internal(): $e');
}
}
LabelChangeListener._internal();
static final LabelChangeListener _instance = LabelChangeListener._internal();
@@ -36,6 +26,13 @@ class LabelChangeListener extends ChangeListener {
}
void _synchronizeLabelOnForegroundAction(jmap.State newState) {
_labelController?.refreshLabelChanges(newState: newState);
_labelController ??= getBinding<LabelController>();
if (_labelController == null) {
logWarning(
'LabelChangeListener::_synchronizeLabelOnForegroundAction(): LabelController IS NOT REGISTERED',
);
return;
}
_labelController!.refreshLabelChanges(newState: newState);
}
}
@@ -404,7 +404,8 @@ void main() {
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
final isLabelSettingEnabled = RxBool(false);
when(labelController.isLabelSettingEnabled).thenReturn(isLabelSettingEnabled);
Get.put(mailboxDashboardController);
mailboxDashboardController.onReady();
@@ -452,7 +453,8 @@ 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));
final isLabelSettingEnabled = RxBool(false);
when(labelController.isLabelSettingEnabled).thenReturn(isLabelSettingEnabled);
// expect query in search controller update as expected
mailboxDashboardController.searchEmailByQueryString(queryString);
@@ -637,7 +639,8 @@ void main() {
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
final isLabelSettingEnabled = RxBool(false);
when(labelController.isLabelSettingEnabled).thenReturn(isLabelSettingEnabled);
Get.put(mailboxDashboardController);
mailboxDashboardController.onReady();
@@ -365,7 +365,8 @@ void main() {
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
final isLabelSettingEnabled = RxBool(false);
when(labelController.isLabelSettingEnabled).thenReturn(isLabelSettingEnabled);
searchController = SearchController(
quickSearchEmailInteractor,
@@ -394,7 +394,8 @@ void main() {
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false));
final isLabelSettingEnabled = RxBool(false);
when(labelController.isLabelSettingEnabled).thenReturn(isLabelSettingEnabled);
Get.put<MailboxDashBoardController>(mailboxDashboardController);