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, {