Skip to content

Commit 45b40cf

Browse files
Fix back button when app is inside Cozy
1 parent 36c386b commit 45b40cf

File tree

4 files changed

+75
-2
lines changed

4 files changed

+75
-2
lines changed

core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
225225
});
226226
227227
function handleMessage(e) {
228-
if (e && e.data && e.data.includes("toIframe:")) {
228+
if (e && e.data && typeof e.data === "string" && e.data.includes("toIframe:")) {
229229
var data = JSON.parse(e.data);
230230
if (data["view"].includes("$_createdViewId")) {
231231
if (data["type"].includes("getHeight")) {

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import 'dart:convert';
33

44
import 'package:back_button_interceptor/back_button_interceptor.dart';
55
import 'package:core/core.dart';
6+
import 'package:cozy/cozy_config_manager/cozy_config_manager.dart';
67
import 'package:dartz/dartz.dart';
8+
import 'package:debounce_throttle/debounce_throttle.dart';
79
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
810
import 'package:email_recovery/email_recovery/email_recovery_action_id.dart';
911
import 'package:flutter/material.dart';
@@ -292,6 +294,8 @@ class MailboxDashBoardController extends ReloadableController
292294
bool _isFirstSessionLoad = false;
293295
DeepLinksManager? _deepLinksManager;
294296
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;
297+
StreamSubscription<html.PopStateEvent>? _popStateEventStreamSubscription;
298+
Debouncer<html.PopStateEvent?>? _popStateDebouncer;
295299

296300
final StreamController<Either<Failure, Success>> _progressStateController =
297301
StreamController<Either<Failure, Success>>.broadcast();
@@ -345,6 +349,7 @@ class MailboxDashBoardController extends ReloadableController
345349
}
346350
_registerStreamListener();
347351
BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard);
352+
registerCozyPopState();
348353
WidgetsBinding.instance.addPostFrameCallback((_) async {
349354
await applicationManager.initUserAgent();
350355
});
@@ -1910,6 +1915,7 @@ class MailboxDashBoardController extends ReloadableController
19101915

19111916
void goToSettings() async {
19121917
closeMailboxMenuDrawer();
1918+
unregisterCozyPopState();
19131919
BackButtonInterceptor.removeByName(AppRoutes.dashboard);
19141920
final result = await push(
19151921
AppRoutes.settings,
@@ -1920,6 +1926,7 @@ class MailboxDashBoardController extends ReloadableController
19201926
);
19211927

19221928
BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard);
1929+
registerCozyPopState();
19231930

19241931
if (result is Tuple2) {
19251932
if (result.value1 is VacationResponse) {
@@ -1978,6 +1985,7 @@ class MailboxDashBoardController extends ReloadableController
19781985
}
19791986

19801987
void goToVacationSetting() async {
1988+
unregisterCozyPopState();
19811989
BackButtonInterceptor.removeByName(AppRoutes.dashboard);
19821990
final result = await push(
19831991
AppRoutes.settings,
@@ -1989,6 +1997,7 @@ class MailboxDashBoardController extends ReloadableController
19891997
);
19901998

19911999
BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard);
2000+
registerCozyPopState();
19922001

19932002
if (result is Tuple2) {
19942003
if (result.value1 is VacationResponse) {
@@ -2927,6 +2936,18 @@ class MailboxDashBoardController extends ReloadableController
29272936
bool _navigateToScreen() {
29282937
log('MailboxDashBoardController::_navigateToScreen: dashboardRoute: $dashboardRoute');
29292938
switch(dashboardRoute.value) {
2939+
case DashboardRoutes.threadDetailed:
2940+
if (PlatformInfo.isMobile) {
2941+
if (currentContext != null && canBack(currentContext!)) {
2942+
return false;
2943+
} else {
2944+
clearSelectedEmail();
2945+
return true;
2946+
}
2947+
} else {
2948+
clearSelectedEmail();
2949+
return true;
2950+
}
29302951
case DashboardRoutes.emailDetailed:
29312952
if (PlatformInfo.isMobile) {
29322953
if (currentContext != null && canBack(currentContext!)) {
@@ -3265,6 +3286,7 @@ class MailboxDashBoardController extends ReloadableController
32653286
_notificationManager.closeStream();
32663287
_fcmService.closeStream();
32673288
applicationManager.releaseUserAgent();
3289+
unregisterCozyPopState();
32683290
BackButtonInterceptor.removeByName(AppRoutes.dashboard);
32693291
_identities = null;
32703292
outboxMailbox = null;
@@ -3275,6 +3297,28 @@ class MailboxDashBoardController extends ReloadableController
32753297
_currentEmailState = null;
32763298
_isFirstSessionLoad = false;
32773299
twakeAppManager.setHasComposer(false);
3300+
_popStateEventStreamSubscription?.cancel();
32783301
super.onClose();
32793302
}
3303+
3304+
Future<void> registerCozyPopState() async {
3305+
final isInsideCozy = await CozyConfigManager().isInsideCozy;
3306+
if (!isInsideCozy) return;
3307+
3308+
_popStateDebouncer = Debouncer(
3309+
const Duration(milliseconds: 100),
3310+
initialValue: null,
3311+
onChanged: (value) {
3312+
onBackButtonInterceptor(false, RouteInfo());
3313+
},
3314+
);
3315+
_popStateEventStreamSubscription = html.window.onPopState.listen((event) {
3316+
_popStateDebouncer?.value = event;
3317+
});
3318+
}
3319+
3320+
void unregisterCozyPopState() {
3321+
_popStateDebouncer?.cancel();
3322+
_popStateEventStreamSubscription?.cancel();
3323+
}
32803324
}

lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ extension OpenAndCloseComposerExtension on MailboxDashBoardController {
8181
}
8282

8383
BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard);
84-
84+
registerCozyPopState();
8585
_handleResultAfterCloseComposer(result);
8686
}
8787

lib/features/manage_account/presentation/manage_account_dashboard_controller.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import 'dart:async';
12

23
import 'package:back_button_interceptor/back_button_interceptor.dart';
34
import 'package:core/core.dart';
5+
import 'package:cozy/cozy_config_manager/cozy_config_manager.dart';
46
import 'package:dartz/dartz.dart';
7+
import 'package:debounce_throttle/debounce_throttle.dart';
58
import 'package:fcm/model/firebase_capability.dart';
69
import 'package:flutter/material.dart';
710
import 'package:forward/forward/capability_forward.dart';
@@ -42,6 +45,7 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart';
4245
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
4346
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
4447
import 'package:tmail_ui_user/main/routes/route_utils.dart';
48+
import 'package:tmail_ui_user/main/universal_import/html_stub.dart' as html;
4549
import 'package:tmail_ui_user/main/utils/app_config.dart';
4650

4751
class ManageAccountDashBoardController extends ReloadableController {
@@ -59,9 +63,12 @@ class ManageAccountDashBoardController extends ReloadableController {
5963
Session? sessionCurrent;
6064
bool? isVacationDateDialogDisplayed;
6165
Uri? previousUri;
66+
StreamSubscription<html.PopStateEvent>? _popStateEventStreamSubscription;
67+
Debouncer<html.PopStateEvent?>? _popStateDebouncer;
6268

6369
@override
6470
void onInit() {
71+
registerCozyPopState();
6572
BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.settings);
6673
super.onInit();
6774
if (LogTracking().isEnabled) {
@@ -403,8 +410,30 @@ class ManageAccountDashBoardController extends ReloadableController {
403410
accountId: accountId.value!);
404411
}
405412

413+
Future<void> registerCozyPopState() async {
414+
final isInsideCozy = await CozyConfigManager().isInsideCozy;
415+
if (!isInsideCozy) return;
416+
417+
_popStateDebouncer = Debouncer(
418+
const Duration(milliseconds: 100),
419+
initialValue: null,
420+
onChanged: (value) {
421+
_onBackButtonInterceptor(false, RouteInfo());
422+
},
423+
);
424+
_popStateEventStreamSubscription = html.window.onPopState.listen((event) {
425+
_popStateDebouncer?.value = event;
426+
});
427+
}
428+
429+
void unregisterCozyPopState() {
430+
_popStateDebouncer?.cancel();
431+
_popStateEventStreamSubscription?.cancel();
432+
}
433+
406434
@override
407435
void onClose() {
436+
unregisterCozyPopState();
408437
BackButtonInterceptor.removeByName(AppRoutes.settings);
409438
if (LogTracking().isEnabled) {
410439
disposeTraceLogDependencies();

0 commit comments

Comments
 (0)