diff --git a/apps/web/src/app/layouts/user-layout.component.html b/apps/web/src/app/layouts/user-layout.component.html index a6b971aa0016..108a0e8373c4 100644 --- a/apps/web/src/app/layouts/user-layout.component.html +++ b/apps/web/src/app/layouts/user-layout.component.html @@ -28,7 +28,7 @@ [spotlight]="true" > - + { + const vfo1Enabled = this.vfo1Enabled(); + return vfo1Enabled ? "/settings/export" : "/tools/export"; + }); + + protected readonly vfo1Enabled = toSignal( + this.configService.getFeatureFlag$(FeatureFlag.VFO1Foundation), + ); protected readonly importCoachmarkOpen = computed( () => this.coachmarkService.activeStepId() === "importData", diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts index 16e1380f2803..25271fcf13ce 100644 --- a/apps/web/src/app/oss-routing.module.ts +++ b/apps/web/src/app/oss-routing.module.ts @@ -1,5 +1,5 @@ -import { NgModule } from "@angular/core"; -import { Route, RouterModule, Routes } from "@angular/router"; +import { NgModule, inject } from "@angular/core"; +import { Route, Router, RouterModule, Routes } from "@angular/router"; import { map, switchMap } from "rxjs"; import { organizationPolicyGuard } from "@bitwarden/angular/admin-console/guards"; @@ -53,6 +53,7 @@ import { import { canAccessEmergencyAccess } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { AnonLayoutWrapperComponent, AnonLayoutWrapperData } from "@bitwarden/components"; import { LockComponent, RemovePasswordComponent } from "@bitwarden/key-management-ui"; import { premiumInterestRedirectGuard } from "@bitwarden/web-vault/app/vault/guards/premium-interest-redirect/premium-interest-redirect.guard"; @@ -773,6 +774,17 @@ const routes: Routes = [ component: SponsoredFamiliesComponent, data: { titleId: "sponsoredFamilies" } satisfies RouteDataProperties, }, + { + path: "export", + loadComponent: () => + import("./tools/vault-export/export-web.component").then( + (mod) => mod.ExportWebComponent, + ), + canActivate: [canAccessFeature(FeatureFlag.VFO1Foundation)], + data: { + titleId: "exportNoun", + } satisfies RouteDataProperties, + }, ], }, { @@ -794,6 +806,7 @@ const routes: Routes = [ import("./tools/vault-export/export-web.component").then( (mod) => mod.ExportWebComponent, ), + canActivate: [vfo1ConditionalRedirect], data: { titleId: "exportNoun", } satisfies RouteDataProperties, @@ -819,6 +832,14 @@ const routes: Routes = [ }, ]; +function vfo1ConditionalRedirect() { + const configService = inject(ConfigService); + const router = inject(Router); + return configService + .getFeatureFlag$(FeatureFlag.VFO1Foundation) + .pipe(map((isEnabled) => (isEnabled ? router.parseUrl("/settings/export") : true))); +} + @NgModule({ imports: [ RouterModule.forRoot(routes, {