From 9f5dbb5e43db7a78b1b771328ca5d5d0b8b4b082 Mon Sep 17 00:00:00 2001 From: Leslie Xiong Date: Tue, 16 Dec 2025 13:41:03 -0500 Subject: [PATCH] created `DesktopRoutedVaultFilterBridgeService` to handle navigation for all vault filters --- ...ktop-routed-vault-filter-bridge.service.ts | 39 +++++++++++++++++++ .../src/app/services/services.module.ts | 6 +-- .../vault-filter/vault-filter.component.ts | 4 +- .../src/vault/app/vault-v3/vault.component.ts | 4 +- 4 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts diff --git a/apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts b/apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts new file mode 100644 index 00000000000..4c1a825d7d2 --- /dev/null +++ b/apps/desktop/src/app/services/desktop-routed-vault-filter-bridge.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from "@angular/core"; +import { Router } from "@angular/router"; + +import { + RoutedVaultFilterService, + RoutedVaultFilterBridgeService, + RoutedVaultFilterModel, + VaultFilterServiceAbstraction as VaultFilterService, +} from "@bitwarden/vault"; + +/** + * Desktop-specific extension of RoutedVaultFilterBridgeService that ensures + * vault filter navigation always goes to the /new-vault route. + */ +@Injectable() +export class DesktopRoutedVaultFilterBridgeService extends RoutedVaultFilterBridgeService { + private static readonly VAULT_ROUTE = "/new-vault"; + private readonly desktopRouter: Router; + private readonly desktopRoutedVaultFilterService: RoutedVaultFilterService; + + constructor( + router: Router, + routedVaultFilterService: RoutedVaultFilterService, + vaultFilterService: VaultFilterService, + ) { + super(router, routedVaultFilterService, vaultFilterService); + this.desktopRouter = router; + this.desktopRoutedVaultFilterService = routedVaultFilterService; + } + + override navigate(filter: RoutedVaultFilterModel) { + const extras = this.desktopRoutedVaultFilterService.createRoute(filter)[1]; + const vaultCommands = [DesktopRoutedVaultFilterBridgeService.VAULT_ROUTE]; + + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.desktopRouter.navigate(vaultCommands, extras); + } +} diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index 85b6ef96bef..e123ea33553 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -125,7 +125,6 @@ import { VaultFilterServiceAbstraction, VaultFilterService, RoutedVaultFilterService, - RoutedVaultFilterBridgeService, } from "@bitwarden/vault"; import { DesktopLoginApprovalDialogComponentService } from "../../auth/login/desktop-login-approval-dialog-component.service"; @@ -161,6 +160,7 @@ import { NativeMessagingService } from "../../services/native-messaging.service" import { SearchBarService } from "../layout/search/search-bar.service"; import { DesktopFileDownloadService } from "./desktop-file-download.service"; +import { DesktopRoutedVaultFilterBridgeService } from "./desktop-routed-vault-filter-bridge.service"; import { InitService } from "./init.service"; import { NativeMessagingManifestService } from "./native-messaging-manifest.service"; import { DesktopSetInitialPasswordService } from "./set-initial-password/desktop-set-initial-password.service"; @@ -536,8 +536,8 @@ const safeProviders: SafeProvider[] = [ deps: [ActivatedRoute], }), safeProvider({ - provide: RoutedVaultFilterBridgeService, - useClass: RoutedVaultFilterBridgeService, + provide: DesktopRoutedVaultFilterBridgeService, + useClass: DesktopRoutedVaultFilterBridgeService, deps: [Router, RoutedVaultFilterService, VaultFilterServiceAbstraction], }), ]; diff --git a/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts b/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts index a0d3980d9f9..96c50b23582 100644 --- a/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts +++ b/apps/desktop/src/vault/app/vault-v3/vault-filter/vault-filter.component.ts @@ -20,10 +20,10 @@ import { FolderFilter, VaultFilter, VaultFilterServiceAbstraction as VaultFilterService, - RoutedVaultFilterBridgeService, AddEditFolderDialogComponent, } from "@bitwarden/vault"; +import { DesktopRoutedVaultFilterBridgeService } from "../../../../app/services/desktop-routed-vault-filter-bridge.service"; import { DesktopPremiumUpgradePromptService } from "../../../../services/desktop-premium-upgrade-prompt.service"; import { FolderFilterComponent } from "./filters/folder-filter.component"; @@ -53,7 +53,7 @@ import { TypeFilterComponent } from "./filters/type-filter.component"; ], }) export class VaultFilterComponent implements OnInit { - private routedVaultFilterBridgeService = inject(RoutedVaultFilterBridgeService); + private routedVaultFilterBridgeService = inject(DesktopRoutedVaultFilterBridgeService); private vaultFilterService: VaultFilterService = inject(VaultFilterService); private accountService: AccountService = inject(AccountService); private cipherArchiveService: CipherArchiveService = inject(CipherArchiveService); diff --git a/apps/desktop/src/vault/app/vault-v3/vault.component.ts b/apps/desktop/src/vault/app/vault-v3/vault.component.ts index d92c3080b07..8eabb52aba1 100644 --- a/apps/desktop/src/vault/app/vault-v3/vault.component.ts +++ b/apps/desktop/src/vault/app/vault-v3/vault.component.ts @@ -82,11 +82,11 @@ import { CipherFormComponent, ArchiveCipherUtilitiesService, VaultFilter, - RoutedVaultFilterBridgeService, VaultFilterServiceAbstraction as VaultFilterService, } from "@bitwarden/vault"; import { SearchBarService } from "../../../app/layout/search/search-bar.service"; +import { DesktopRoutedVaultFilterBridgeService } from "../../../app/services/desktop-routed-vault-filter-bridge.service"; import { DesktopCredentialGenerationService } from "../../../services/desktop-cipher-form-generator.service"; import { DesktopPremiumUpgradePromptService } from "../../../services/desktop-premium-upgrade-prompt.service"; import { invokeMenu, RendererMenuItem } from "../../../utils"; @@ -221,7 +221,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener { private cipherArchiveService: CipherArchiveService, private policyService: PolicyService, private archiveCipherUtilitiesService: ArchiveCipherUtilitiesService, - private routedVaultFilterBridgeService: RoutedVaultFilterBridgeService, + private routedVaultFilterBridgeService: DesktopRoutedVaultFilterBridgeService, private vaultFilterService: VaultFilterService, ) {}