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: ' log('LabelAPI::getChanges: '
'newStateChanges=${changes.newState} | ' 'newStateChanges=${changes.newState} | '
'newStateLabel=$newStateLabel | ' 'newStateLabel=$newStateLabel | '
'hasMore=${changes.hasMoreChanges}' 'hasMore=${changes.hasMoreChanges} | '
'updatedFetched=${updatedResult.labels?.length} | ' 'updatedFetched=${updatedResult.labels?.length} | '
'createdFetched=${createdResult.labels?.length} | ' 'createdFetched=${createdResult.labels?.length} | '
'totalDestroyed=${allDestroyedIds.length}'); 'totalDestroyed=${allDestroyedIds.length}');
@@ -10,12 +10,17 @@ import 'package:tmail_ui_user/features/push_notification/presentation/websocket/
extension HandleLabelWebsocketExtension on LabelController { extension HandleLabelWebsocketExtension on LabelController {
void refreshLabelChanges({required jmap.State newState}) { void refreshLabelChanges({required jmap.State newState}) {
if (accountId == null || final skipReasons = <String>[
session == null || if (accountId == null) 'accountId is null',
currentLabelState == null || if (session == null) 'session is null',
currentLabelState == newState || if (currentLabelState == null) 'currentLabelState is null',
isLabelSettingEnabled.isFalse) { if (currentLabelState == newState) 'state unchanged',
logWarning('HandleLabelWebsocketExtension::refreshLabelChanges: accountId or session or currentLabelState or newState or isLabelSettingEnabled is null'); if (isLabelSettingEnabled.isFalse) 'label setting disabled',
];
if (skipReasons.isNotEmpty) {
logWarning(
'HandleLabelWebsocketExtension::refreshLabelChanges: skip (${skipReasons.join(', ')})',
);
return; return;
} }
@@ -28,10 +28,11 @@ extension HandleLogicLabelExtension on MailboxDashBoardController {
void _onLabelSettingEnabledChanged(bool isEnabled) { void _onLabelSettingEnabledChanged(bool isEnabled) {
log('$runtimeType::_onLabelSettingEnabledChanged: isEnabled is $isEnabled'); log('$runtimeType::_onLabelSettingEnabledChanged: isEnabled is $isEnabled');
final isLabelAvailable = isEnabled && isLabelCapabilitySupported;
injectWebSocket( injectWebSocket(
session: sessionCurrent, session: sessionCurrent,
accountId: accountId.value, 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 { class LabelChangeListener extends ChangeListener {
LabelController? _labelController; LabelController? _labelController;
LabelChangeListener._internal() { LabelChangeListener._internal();
try {
_labelController = getBinding<LabelController>();
if (_labelController == null) {
logWarning(
'LabelChangeListener::_internal(): LabelController IS NOT REGISTERED');
}
} catch (e) {
logWarning('LabelChangeListener::_internal(): $e');
}
}
static final LabelChangeListener _instance = LabelChangeListener._internal(); static final LabelChangeListener _instance = LabelChangeListener._internal();
@@ -36,6 +26,13 @@ class LabelChangeListener extends ChangeListener {
} }
void _synchronizeLabelOnForegroundAction(jmap.State newState) { 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(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); 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); Get.put(mailboxDashboardController);
mailboxDashboardController.onReady(); mailboxDashboardController.onReady();
@@ -452,7 +453,8 @@ void main() {
when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager())); when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager()));
when(context.mounted).thenReturn(true); when(context.mounted).thenReturn(true);
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); 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 // expect query in search controller update as expected
mailboxDashboardController.searchEmailByQueryString(queryString); mailboxDashboardController.searchEmailByQueryString(queryString);
@@ -637,7 +639,8 @@ void main() {
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); 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); Get.put(mailboxDashboardController);
mailboxDashboardController.onReady(); mailboxDashboardController.onReady();
@@ -365,7 +365,8 @@ void main() {
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle));
when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false)); final isLabelSettingEnabled = RxBool(false);
when(labelController.isLabelSettingEnabled).thenReturn(isLabelSettingEnabled);
searchController = SearchController( searchController = SearchController(
quickSearchEmailInteractor, quickSearchEmailInteractor,
@@ -394,7 +394,8 @@ void main() {
when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([]));
when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); 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); Get.put<MailboxDashBoardController>(mailboxDashboardController);