mirror of
https://github.com/bitwarden/browser.git
synced 2024-12-18 15:47:57 +01:00
fix(auth): [PM-15987] handle browser back button on login screen
Intercepts browser back button press on the login screen to properly transition back to email entry portion instead of unexpected navigation. Resolves PM-15987
This commit is contained in:
parent
878d82e16f
commit
edf90e62e7
@ -121,13 +121,7 @@
|
|||||||
|
|
||||||
<!-- Back button -->
|
<!-- Back button -->
|
||||||
<ng-container *ngIf="shouldShowBackButton()">
|
<ng-container *ngIf="shouldShowBackButton()">
|
||||||
<button
|
<button type="button" bitButton block buttonType="secondary" (click)="backButtonClicked()">
|
||||||
type="button"
|
|
||||||
bitButton
|
|
||||||
block
|
|
||||||
buttonType="secondary"
|
|
||||||
(click)="toggleLoginUiState(LoginUiState.EMAIL_ENTRY)"
|
|
||||||
>
|
|
||||||
{{ "back" | i18n }}
|
{{ "back" | i18n }}
|
||||||
</button>
|
</button>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -137,6 +137,9 @@ export class LoginComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async ngOnInit(): Promise<void> {
|
async ngOnInit(): Promise<void> {
|
||||||
|
// Add popstate listener to listen for browser back button clicks
|
||||||
|
window.addEventListener("popstate", this.handlePopState);
|
||||||
|
|
||||||
// TODO: remove this when the UnauthenticatedExtensionUIRefresh feature flag is removed.
|
// TODO: remove this when the UnauthenticatedExtensionUIRefresh feature flag is removed.
|
||||||
this.listenForUnauthUiRefreshFlagChanges();
|
this.listenForUnauthUiRefreshFlagChanges();
|
||||||
|
|
||||||
@ -148,6 +151,9 @@ export class LoginComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
|
// Remove popstate listener
|
||||||
|
window.removeEventListener("popstate", this.handlePopState);
|
||||||
|
|
||||||
if (this.clientType === ClientType.Desktop) {
|
if (this.clientType === ClientType.Desktop) {
|
||||||
// TODO: refactor to not use deprecated broadcaster service.
|
// TODO: refactor to not use deprecated broadcaster service.
|
||||||
this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
|
this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
|
||||||
@ -562,4 +568,28 @@ export class LoginComponent implements OnInit, OnDestroy {
|
|||||||
this.clientType !== ClientType.Browser
|
this.clientType !== ClientType.Browser
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the back button click to transition back to the email entry state.
|
||||||
|
*/
|
||||||
|
protected async backButtonClicked() {
|
||||||
|
// Replace the history so the "forward" button doesn't show (which wouldn't do anything)
|
||||||
|
history.pushState(null, "", window.location.pathname);
|
||||||
|
await this.toggleLoginUiState(LoginUiState.EMAIL_ENTRY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the popstate event to transition back to the email entry state when the back button is clicked.
|
||||||
|
* @param event - The popstate event.
|
||||||
|
*/
|
||||||
|
private handlePopState = (event: PopStateEvent) => {
|
||||||
|
if (this.loginUiState === LoginUiState.MASTER_PASSWORD_ENTRY) {
|
||||||
|
// Prevent default navigation
|
||||||
|
event.preventDefault();
|
||||||
|
// Replace the history so the "forward" button doesn't show (which wouldn't do anything)
|
||||||
|
history.pushState(null, "", window.location.pathname);
|
||||||
|
// Transition back to email entry state
|
||||||
|
void this.toggleLoginUiState(LoginUiState.EMAIL_ENTRY);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user