Skip to content

Commit b83e092

Browse files
dab246hoangdat
authored andcommitted
TF-3290 Only show reconnection confirm dialog when composer is opened
1 parent 6e59633 commit b83e092

File tree

19 files changed

+139
-48
lines changed

19 files changed

+139
-48
lines changed

lib/features/base/base_controller.dart

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
6060
import 'package:tmail_ui_user/main/utils/app_config.dart';
6161
import 'package:tmail_ui_user/main/universal_import/html_stub.dart' as html;
6262
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
63+
import 'package:tmail_ui_user/main/utils/twake_app_manager.dart';
6364
import 'package:uuid/uuid.dart';
6465

6566
abstract class BaseController extends GetxController
@@ -81,6 +82,7 @@ abstract class BaseController extends GetxController
8182
final Uuid uuid = Get.find<Uuid>();
8283
final ApplicationManager applicationManager = Get.find<ApplicationManager>();
8384
final ToastManager toastManager = Get.find<ToastManager>();
85+
final TwakeAppManager twakeAppManager = Get.find<TwakeAppManager>();
8486

8587
bool _isFcmEnabled = false;
8688

@@ -218,45 +220,51 @@ abstract class BaseController extends GetxController
218220
}
219221

220222
void _handleBadCredentialsException() {
221-
if (PlatformInfo.isWeb) {
222-
if (currentContext == null) {
223-
_executeBeforeReconnectAndLogOut();
224-
return;
225-
}
223+
log('$runtimeType::_handleBadCredentialsException:');
224+
if (!twakeAppManager.isComposerOpened) {
225+
_performReconnection();
226+
return;
227+
}
226228

227-
showConfirmDialogAction(
228-
currentContext!,
229-
AppLocalizations.of(currentContext!).dialogMessageSessionHasExpired,
230-
AppLocalizations.of(currentContext!).reconnect,
231-
title: AppLocalizations.of(currentContext!).sessionExpired,
232-
alignCenter: true,
233-
outsideDismissible: false,
234-
titleActionButtonMaxLines: 1,
235-
icon: SvgPicture.asset(imagePaths.icTMailLogo, width: 64, height: 64),
236-
onConfirmAction: _executeBeforeReconnectAndLogOut,
237-
onCancelAction: onCancelReconnectWhenSessionExpired
238-
);
239-
} else if (PlatformInfo.isMobile) {
240-
if (currentContext == null) {
241-
clearDataAndGoToLoginPage();
242-
return;
243-
}
229+
if (currentContext == null) {
230+
_performSaveAndReconnection();
231+
return;
232+
}
244233

245-
showConfirmDialogAction(
246-
currentContext!,
247-
AppLocalizations.of(currentContext!).dialogMessageSessionHasExpired,
248-
AppLocalizations.of(currentContext!).reconnect,
249-
title: AppLocalizations.of(currentContext!).sessionExpired,
250-
alignCenter: true,
251-
outsideDismissible: false,
252-
titleActionButtonMaxLines: 1,
253-
icon: SvgPicture.asset(imagePaths.icTMailLogo, width: 64, height: 64),
254-
onConfirmAction: clearDataAndGoToLoginPage,
255-
onCancelAction: onCancelReconnectWhenSessionExpired
256-
);
234+
final appLocalizations = AppLocalizations.of(currentContext!);
235+
showConfirmDialogAction(
236+
currentContext!,
237+
appLocalizations.messageWarningDialogWhenExpiredOIDCTokenAndReconnection,
238+
appLocalizations.saveAndRefresh,
239+
title: appLocalizations.sessionExpired,
240+
cancelTitle: appLocalizations.no,
241+
alignCenter: true,
242+
outsideDismissible: false,
243+
titleActionButtonMaxLines: 1,
244+
marginIcon: EdgeInsetsDirectional.zero,
245+
icon: SvgPicture.asset(imagePaths.icTMailLogo, width: 64, height: 64),
246+
onConfirmAction: _performSaveAndReconnection,
247+
onCancelAction: _performReconnection,
248+
onCloseButtonAction: _performCloseReconnectionConfirmDialog
249+
);
250+
}
251+
252+
void _performSaveAndReconnection() {
253+
if (PlatformInfo.isWeb) {
254+
_executeBeforeReconnectAndLogOut();
255+
} else if (PlatformInfo.isMobile) {
256+
clearDataAndGoToLoginPage();
257257
}
258258
}
259259

260+
void _performReconnection() {
261+
clearDataAndGoToLoginPage();
262+
}
263+
264+
void _performCloseReconnectionConfirmDialog() {
265+
popBack();
266+
}
267+
260268
void onDataFailureViewState(Failure failure) {
261269
if (failure is FeatureFailure) {
262270
final isUrgentException = validateUrgentException(failure.exception);

lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ class MailboxDashBoardController extends ReloadableController
432432
} else if (success is GetAllIdentitiesSuccess) {
433433
_handleGetAllIdentitiesSuccess(success);
434434
} else if (success is GetComposerCacheSuccess) {
435+
_removeComposerCacheOnWeb();
435436
goToComposer(ComposerArguments.fromSessionStorageBrowser(success.composerCache));
436437
} else if (success is GetIdentityCacheOnWebSuccess) {
437438
goToSettings();
@@ -1677,12 +1678,14 @@ class MailboxDashBoardController extends ReloadableController
16771678
composerArguments = arguments;
16781679
ComposerBindings().dependencies();
16791680
composerOverlayState.value = ComposerOverlayState.active;
1681+
twakeAppManager.openComposerOnWeb();
16801682
}
16811683

16821684
void closeComposerOverlay({dynamic result}) async {
16831685
composerArguments = null;
16841686
ComposerBindings().dispose();
16851687
composerOverlayState.value = ComposerOverlayState.inActive;
1688+
twakeAppManager.closeComposerOnWeb();
16861689
if (result is SendingEmailArguments) {
16871690
handleSendEmailAction(result);
16881691
} else if (result is SendEmailSuccess ||
@@ -3240,6 +3243,7 @@ class MailboxDashBoardController extends ReloadableController
32403243
WebSocketController.instance.onClose();
32413244
_currentEmailState = null;
32423245
_isFirstSessionLoad = false;
3246+
twakeAppManager.closeComposerOnWeb();
32433247
super.onClose();
32443248
}
32453249
}

lib/l10n/intl_messages.arb

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"@@last_modified": "2024-12-09T13:59:58.460897",
2+
"@@last_modified": "2024-12-12T15:50:46.911821",
33
"initializing_data": "Initializing data...",
44
"@initializing_data": {
55
"type": "text",
@@ -3968,12 +3968,6 @@
39683968
"placeholders_order": [],
39693969
"placeholders": {}
39703970
},
3971-
"dialogMessageSessionHasExpired": "The current session has expired. Please reconnect to the server",
3972-
"@dialogMessageSessionHasExpired": {
3973-
"type": "text",
3974-
"placeholders_order": [],
3975-
"placeholders": {}
3976-
},
39773971
"sMimeGoodSignatureMessage": "The authenticity of this message had been verified with SMime signature.",
39783972
"@sMimeGoodSignatureMessage": {
39793973
"type": "text",
@@ -4174,6 +4168,8 @@
41744168
},
41754169
"editAsNewEmail": "Edit as new email",
41764170
"@editAsNewEmail": {
4171+
"messageWarningDialogWhenExpiredOIDCTokenAndReconnection": "Your session expired. We need to take you back to the login page in order to refresh it. You might want to save the email you are currently editing before we do so.",
4172+
"@messageWarningDialogWhenExpiredOIDCTokenAndReconnection": {
41774173
"type": "text",
41784174
"placeholders_order": [],
41794175
"placeholders": {}

lib/main.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:tmail_ui_user/main/pages/app_pages.dart';
1616
import 'package:tmail_ui_user/main/routes/app_routes.dart';
1717
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
1818
import 'package:tmail_ui_user/main/utils/app_utils.dart';
19+
import 'package:tmail_ui_user/main/utils/twake_app_manager.dart';
1920
import 'package:url_strategy/url_strategy.dart';
2021
import 'package:worker_manager/worker_manager.dart';
2122

@@ -52,6 +53,7 @@ class TMailApp extends StatefulWidget {
5253
class _TMailAppState extends State<TMailApp> {
5354

5455
DeepLinksManager? _deepLinksManager;
56+
final TwakeAppManager _twakeAppManager = Get.find<TwakeAppManager>();
5557

5658
@override
5759
void initState() {
@@ -105,6 +107,7 @@ class _TMailAppState extends State<TMailApp> {
105107
if (PlatformInfo.isMobile) {
106108
_deepLinksManager?.dispose();
107109
}
110+
_twakeAppManager.dispose();
108111
super.dispose();
109112
}
110113
}

lib/main/bindings/core/core_bindings.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/main/utils/app_config.dart';
2121
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
2222
import 'package:tmail_ui_user/main/utils/ios_notification_manager.dart';
2323
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
24+
import 'package:tmail_ui_user/main/utils/twake_app_manager.dart';
2425
import 'package:uuid/uuid.dart';
2526

2627
class CoreBindings extends Bindings {
@@ -76,6 +77,7 @@ class CoreBindings extends Bindings {
7677
Get.put(IOSNotificationManager());
7778
}
7879
Get.put(PreviewEmlFileUtils());
80+
Get.put(TwakeAppManager());
7981
}
8082

8183
void _bindingIsolate() {

lib/main/localizations/app_localizations.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4149,13 +4149,6 @@ class AppLocalizations {
41494149
);
41504150
}
41514151

4152-
String get dialogMessageSessionHasExpired {
4153-
return Intl.message(
4154-
'The current session has expired. Please reconnect to the server',
4155-
name: 'dialogMessageSessionHasExpired',
4156-
);
4157-
}
4158-
41594152
String get sMimeGoodSignatureMessage {
41604153
return Intl.message(
41614154
'The authenticity of this message had been verified with SMime signature.',
@@ -4343,6 +4336,14 @@ class AppLocalizations {
43434336
);
43444337
}
43454338

4339+
String get messageWarningDialogWhenExpiredOIDCTokenAndReconnection {
4340+
return Intl.message(
4341+
'Your session expired. We need to take you back to the login page in order to refresh it. You might want to save the email you are currently editing before we do so.',
4342+
name: 'messageWarningDialogWhenExpiredOIDCTokenAndReconnection',
4343+
);
4344+
}
4345+
4346+
43464347
String get replyToList {
43474348
return Intl.message(
43484349
'Reply to list',

lib/main/utils/twake_app_manager.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart';
2+
3+
class TwakeAppManager {
4+
ComposerOverlayState? _composerOverlayState;
5+
6+
void openComposerOnWeb() =>
7+
_composerOverlayState = ComposerOverlayState.active;
8+
9+
void closeComposerOnWeb() {
10+
_composerOverlayState = ComposerOverlayState.inActive;
11+
_composerOverlayState = null;
12+
}
13+
14+
bool get isComposerOpened =>
15+
_composerOverlayState == ComposerOverlayState.active;
16+
17+
void dispose() {
18+
_composerOverlayState = null;
19+
}
20+
}

test/features/base/base_controller_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
2626
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
2727
import 'package:tmail_ui_user/main/utils/app_config.dart';
2828
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
29+
import 'package:tmail_ui_user/main/utils/twake_app_manager.dart';
2930
import 'package:uuid/uuid.dart';
3031

3132
import '../../fixtures/account_fixtures.dart';
@@ -70,6 +71,7 @@ class SomeOtherException extends RemoteException {}
7071
MockSpec<Uuid>(),
7172
MockSpec<ApplicationManager>(),
7273
MockSpec<ToastManager>(),
74+
MockSpec<TwakeAppManager>(),
7375
])
7476
void main() {
7577
TestWidgetsFlutterBinding.ensureInitialized();
@@ -88,6 +90,7 @@ void main() {
8890
late MockUuid mockUuid;
8991
late MockApplicationManager mockApplicationManager;
9092
late MockToastManager mockToastManager;
93+
late MockTwakeAppManager mockTwakeAppManager;
9194

9295
setUpAll(() {
9396
mockCachingManager = MockCachingManager();
@@ -103,6 +106,7 @@ void main() {
103106
mockUuid = MockUuid();
104107
mockApplicationManager = MockApplicationManager();
105108
mockToastManager = MockToastManager();
109+
mockTwakeAppManager = MockTwakeAppManager();
106110

107111
Get.put<CachingManager>(mockCachingManager);
108112
Get.put<LanguageCacheManager>(mockLanguageCacheManager);
@@ -121,6 +125,7 @@ void main() {
121125
Get.put<Uuid>(mockUuid);
122126
Get.put<ApplicationManager>(mockApplicationManager);
123127
Get.put<ToastManager>(mockToastManager);
128+
Get.put<TwakeAppManager>(mockTwakeAppManager);
124129
Get.testMode = true;
125130

126131
mockBaseController = MockBaseController();

test/features/composer/presentation/composer_controller_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
6868
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
6969
import 'package:tmail_ui_user/main/utils/app_config.dart';
7070
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
71+
import 'package:tmail_ui_user/main/utils/twake_app_manager.dart';
7172
import 'package:uuid/uuid.dart';
7273

7374
import '../../../fixtures/account_fixtures.dart';
@@ -143,6 +144,7 @@ class MockMailboxDashBoardController extends Mock implements MailboxDashBoardCon
143144
MockSpec<Uuid>(),
144145
MockSpec<ApplicationManager>(),
145146
MockSpec<ToastManager>(),
147+
MockSpec<TwakeAppManager>(),
146148

147149
// Composer controller mock specs
148150
MockSpec<LocalFilePickerInteractor>(),
@@ -184,6 +186,7 @@ void main() {
184186
late MockUuid mockUuid;
185187
late MockApplicationManager mockApplicationManager;
186188
late MockToastManager mockToastManager;
189+
late MockTwakeAppManager mockTwakeAppManager;
187190

188191
// Declaration composer controller
189192
late ComposerController? composerController;
@@ -226,6 +229,7 @@ void main() {
226229
mockUuid = MockUuid();
227230
mockApplicationManager = MockApplicationManager();
228231
mockToastManager = MockToastManager();
232+
mockTwakeAppManager = MockTwakeAppManager();
229233

230234
Get.put<CachingManager>(mockCachingManager);
231235
Get.put<LanguageCacheManager>(mockLanguageCacheManager);
@@ -244,6 +248,7 @@ void main() {
244248
Get.put<Uuid>(mockUuid);
245249
Get.put<ApplicationManager>(mockApplicationManager);
246250
Get.put<ToastManager>(mockToastManager);
251+
Get.put<TwakeAppManager>(mockTwakeAppManager);
247252

248253
// Mock Getx controllers
249254
Get.put<MailboxDashBoardController>(mockMailboxDashBoardController);

test/features/email/presentation/controller/single_email_controller_test.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oi
5959
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
6060
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
6161
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
62+
import 'package:tmail_ui_user/main/utils/twake_app_manager.dart';
6263
import 'package:uuid/uuid.dart';
6364

6465
import '../../../../fixtures/account_fixtures.dart';
@@ -109,6 +110,7 @@ const fallbackGenerators = {
109110
MockSpec<CalendarEventDataSource>(),
110111
MockSpec<DioClient>(),
111112
MockSpec<GetHtmlContentFromAttachmentInteractor>(),
113+
MockSpec<TwakeAppManager>(),
112114
])
113115
void main() {
114116
TestWidgetsFlutterBinding.ensureInitialized();
@@ -146,6 +148,7 @@ void main() {
146148
final applicationManager = MockApplicationManager();
147149
final mockToastManager = MockToastManager();
148150
final getHtmlContentFromAttachmentInteractor = MockGetHtmlContentFromAttachmentInteractor();
151+
final mockTwakeAppManager = MockTwakeAppManager();
149152

150153
late SingleEmailController singleEmailController;
151154

@@ -181,6 +184,7 @@ void main() {
181184
Get.put<PrintUtils>(printUtils);
182185
Get.put<ApplicationManager>(applicationManager);
183186
Get.put<ToastManager>(mockToastManager);
187+
Get.put<TwakeAppManager>(mockTwakeAppManager);
184188

185189
when(mailboxDashboardController.accountId).thenReturn(Rxn(testAccountId));
186190
when(uuid.v4()).thenReturn(testTaskId);

0 commit comments

Comments
 (0)