1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-12 06:13:38 +00:00

All Clients - Route data typing clean up (#11265)

This commit is contained in:
Jared Snider
2024-09-30 13:51:31 -04:00
committed by GitHub
parent a11c627687
commit ffc97c385d
4 changed files with 141 additions and 104 deletions

View File

@@ -31,7 +31,10 @@ import { twofactorRefactorSwap } from "../../../../libs/angular/src/utils/two-fa
import { fido2AuthGuard } from "../auth/guards/fido2-auth.guard"; import { fido2AuthGuard } from "../auth/guards/fido2-auth.guard";
import { AccountSwitcherComponent } from "../auth/popup/account-switching/account-switcher.component"; import { AccountSwitcherComponent } from "../auth/popup/account-switching/account-switcher.component";
import { EnvironmentComponent } from "../auth/popup/environment.component"; import { EnvironmentComponent } from "../auth/popup/environment.component";
import { ExtensionAnonLayoutWrapperComponent } from "../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component"; import {
ExtensionAnonLayoutWrapperComponent,
ExtensionAnonLayoutWrapperData,
} from "../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component";
import { HintComponent } from "../auth/popup/hint.component"; import { HintComponent } from "../auth/popup/hint.component";
import { HomeComponent } from "../auth/popup/home.component"; import { HomeComponent } from "../auth/popup/home.component";
import { LockComponent } from "../auth/popup/lock.component"; import { LockComponent } from "../auth/popup/lock.component";
@@ -109,6 +112,21 @@ import { debounceNavigationGuard } from "./services/debounce-navigation.service"
import { TabsV2Component } from "./tabs-v2.component"; import { TabsV2Component } from "./tabs-v2.component";
import { TabsComponent } from "./tabs.component"; import { TabsComponent } from "./tabs.component";
/**
* Data properties acceptable for use in extension route objects
*/
export interface RouteDataProperties {
/**
* A state string which identifies the current route for the sake of transition animation logic.
* The state string is passed into [@routerTransition] in the app.component.
*/
state: string;
/**
* A boolean to indicate that the URL should not be saved in memory in the BrowserRouterSvc.
*/
doNotSaveUrl?: boolean;
}
const unauthRouteOverrides = { const unauthRouteOverrides = {
homepage: () => { homepage: () => {
return BrowserPopupUtils.inPopout(window) ? "/tabs/vault" : "/tabs/current"; return BrowserPopupUtils.inPopout(window) ? "/tabs/vault" : "/tabs/current";
@@ -134,36 +152,36 @@ const routes: Routes = [
path: "home", path: "home",
component: HomeComponent, component: HomeComponent,
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "home" }, data: { state: "home" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(Fido2V1Component, Fido2Component, { ...extensionRefreshSwap(Fido2V1Component, Fido2Component, {
path: "fido2", path: "fido2",
canActivate: [fido2AuthGuard], canActivate: [fido2AuthGuard],
data: { state: "fido2" }, data: { state: "fido2" } satisfies RouteDataProperties,
}), }),
{ {
path: "login", path: "login",
component: LoginComponent, component: LoginComponent,
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "login" }, data: { state: "login" } satisfies RouteDataProperties,
}, },
{ {
path: "login-with-device", path: "login-with-device",
component: LoginViaAuthRequestComponent, component: LoginViaAuthRequestComponent,
canActivate: [], canActivate: [],
data: { state: "login-with-device" }, data: { state: "login-with-device" } satisfies RouteDataProperties,
}, },
{ {
path: "admin-approval-requested", path: "admin-approval-requested",
component: LoginViaAuthRequestComponent, component: LoginViaAuthRequestComponent,
canActivate: [], canActivate: [],
data: { state: "login-with-device" }, data: { state: "login-with-device" } satisfies RouteDataProperties,
}, },
{ {
path: "lock", path: "lock",
component: LockComponent, component: LockComponent,
canActivate: [lockGuard()], canActivate: [lockGuard()],
data: { state: "lock", doNotSaveUrl: true }, data: { state: "lock", doNotSaveUrl: true } satisfies RouteDataProperties,
}, },
...twofactorRefactorSwap( ...twofactorRefactorSwap(
TwoFactorComponent, TwoFactorComponent,
@@ -171,12 +189,12 @@ const routes: Routes = [
{ {
path: "2fa", path: "2fa",
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "2fa" }, data: { state: "2fa" } satisfies RouteDataProperties,
}, },
{ {
path: "2fa", path: "2fa",
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "2fa" }, data: { state: "2fa" } satisfies RouteDataProperties,
children: [ children: [
{ {
path: "", path: "",
@@ -189,200 +207,201 @@ const routes: Routes = [
path: "2fa-options", path: "2fa-options",
component: TwoFactorOptionsComponent, component: TwoFactorOptionsComponent,
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "2fa-options" }, data: { state: "2fa-options" } satisfies RouteDataProperties,
}, },
{ {
path: "login-initiated", path: "login-initiated",
component: LoginDecryptionOptionsComponent, component: LoginDecryptionOptionsComponent,
canActivate: [tdeDecryptionRequiredGuard()], canActivate: [tdeDecryptionRequiredGuard()],
data: { state: "login-initiated" } satisfies RouteDataProperties,
}, },
{ {
path: "sso", path: "sso",
component: SsoComponent, component: SsoComponent,
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "sso" }, data: { state: "sso" } satisfies RouteDataProperties,
}, },
{ {
path: "set-password", path: "set-password",
component: SetPasswordComponent, component: SetPasswordComponent,
data: { state: "set-password" }, data: { state: "set-password" } satisfies RouteDataProperties,
}, },
{ {
path: "remove-password", path: "remove-password",
component: RemovePasswordComponent, component: RemovePasswordComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "remove-password" }, data: { state: "remove-password" } satisfies RouteDataProperties,
}, },
{ {
path: "register", path: "register",
component: RegisterComponent, component: RegisterComponent,
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "register" }, data: { state: "register" } satisfies RouteDataProperties,
}, },
{ {
path: "environment", path: "environment",
component: EnvironmentComponent, component: EnvironmentComponent,
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { state: "environment" }, data: { state: "environment" } satisfies RouteDataProperties,
}, },
{ {
path: "ciphers", path: "ciphers",
component: VaultItemsComponent, component: VaultItemsComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "ciphers" }, data: { state: "ciphers" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(ViewComponent, ViewV2Component, { ...extensionRefreshSwap(ViewComponent, ViewV2Component, {
path: "view-cipher", path: "view-cipher",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "view-cipher" }, data: { state: "view-cipher" } satisfies RouteDataProperties,
}), }),
{ {
path: "cipher-password-history", path: "cipher-password-history",
component: PasswordHistoryComponent, component: PasswordHistoryComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "cipher-password-history" }, data: { state: "cipher-password-history" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(AddEditComponent, AddEditV2Component, { ...extensionRefreshSwap(AddEditComponent, AddEditV2Component, {
path: "add-cipher", path: "add-cipher",
canActivate: [authGuard, debounceNavigationGuard()], canActivate: [authGuard, debounceNavigationGuard()],
data: { state: "add-cipher" }, data: { state: "add-cipher" } satisfies RouteDataProperties,
runGuardsAndResolvers: "always", runGuardsAndResolvers: "always",
}), }),
...extensionRefreshSwap(AddEditComponent, AddEditV2Component, { ...extensionRefreshSwap(AddEditComponent, AddEditV2Component, {
path: "edit-cipher", path: "edit-cipher",
canActivate: [authGuard, debounceNavigationGuard()], canActivate: [authGuard, debounceNavigationGuard()],
data: { state: "edit-cipher" }, data: { state: "edit-cipher" } satisfies RouteDataProperties,
runGuardsAndResolvers: "always", runGuardsAndResolvers: "always",
}), }),
{ {
path: "share-cipher", path: "share-cipher",
component: ShareComponent, component: ShareComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "share-cipher" }, data: { state: "share-cipher" } satisfies RouteDataProperties,
}, },
{ {
path: "collections", path: "collections",
component: CollectionsComponent, component: CollectionsComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "collections" }, data: { state: "collections" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(AttachmentsComponent, AttachmentsV2Component, { ...extensionRefreshSwap(AttachmentsComponent, AttachmentsV2Component, {
path: "attachments", path: "attachments",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "attachments" }, data: { state: "attachments" } satisfies RouteDataProperties,
}), }),
{ {
path: "generator", path: "generator",
component: GeneratorComponent, component: GeneratorComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "generator" }, data: { state: "generator" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(PasswordGeneratorHistoryComponent, CredentialGeneratorHistoryComponent, { ...extensionRefreshSwap(PasswordGeneratorHistoryComponent, CredentialGeneratorHistoryComponent, {
path: "generator-history", path: "generator-history",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "generator-history" }, data: { state: "generator-history" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(ImportBrowserComponent, ImportBrowserV2Component, { ...extensionRefreshSwap(ImportBrowserComponent, ImportBrowserV2Component, {
path: "import", path: "import",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "import" }, data: { state: "import" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(ExportBrowserComponent, ExportBrowserV2Component, { ...extensionRefreshSwap(ExportBrowserComponent, ExportBrowserV2Component, {
path: "export", path: "export",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "export" }, data: { state: "export" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(AutofillV1Component, AutofillComponent, { ...extensionRefreshSwap(AutofillV1Component, AutofillComponent, {
path: "autofill", path: "autofill",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "autofill" }, data: { state: "autofill" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(AccountSecurityV1Component, AccountSecurityComponent, { ...extensionRefreshSwap(AccountSecurityV1Component, AccountSecurityComponent, {
path: "account-security", path: "account-security",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "account-security" }, data: { state: "account-security" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(NotificationsSettingsV1Component, NotificationsSettingsComponent, { ...extensionRefreshSwap(NotificationsSettingsV1Component, NotificationsSettingsComponent, {
path: "notifications", path: "notifications",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "notifications" }, data: { state: "notifications" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(VaultSettingsComponent, VaultSettingsV2Component, { ...extensionRefreshSwap(VaultSettingsComponent, VaultSettingsV2Component, {
path: "vault-settings", path: "vault-settings",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "vault-settings" }, data: { state: "vault-settings" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(FoldersComponent, FoldersV2Component, { ...extensionRefreshSwap(FoldersComponent, FoldersV2Component, {
path: "folders", path: "folders",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "folders" }, data: { state: "folders" } satisfies RouteDataProperties,
}), }),
{ {
path: "add-folder", path: "add-folder",
component: FolderAddEditComponent, component: FolderAddEditComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "add-folder" }, data: { state: "add-folder" } satisfies RouteDataProperties,
}, },
{ {
path: "edit-folder", path: "edit-folder",
component: FolderAddEditComponent, component: FolderAddEditComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "edit-folder" }, data: { state: "edit-folder" } satisfies RouteDataProperties,
}, },
{ {
path: "sync", path: "sync",
component: SyncComponent, component: SyncComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "sync" }, data: { state: "sync" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(ExcludedDomainsV1Component, ExcludedDomainsComponent, { ...extensionRefreshSwap(ExcludedDomainsV1Component, ExcludedDomainsComponent, {
path: "excluded-domains", path: "excluded-domains",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "excluded-domains" }, data: { state: "excluded-domains" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(PremiumComponent, PremiumV2Component, { ...extensionRefreshSwap(PremiumComponent, PremiumV2Component, {
path: "premium", path: "premium",
component: PremiumComponent, component: PremiumComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "premium" }, data: { state: "premium" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(AppearanceComponent, AppearanceV2Component, { ...extensionRefreshSwap(AppearanceComponent, AppearanceV2Component, {
path: "appearance", path: "appearance",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "appearance" }, data: { state: "appearance" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(AddEditComponent, AddEditV2Component, { ...extensionRefreshSwap(AddEditComponent, AddEditV2Component, {
path: "clone-cipher", path: "clone-cipher",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "clone-cipher" }, data: { state: "clone-cipher" } satisfies RouteDataProperties,
}), }),
{ {
path: "send-type", path: "send-type",
component: SendTypeComponent, component: SendTypeComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "send-type" }, data: { state: "send-type" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(SendAddEditComponent, SendAddEditV2Component, { ...extensionRefreshSwap(SendAddEditComponent, SendAddEditV2Component, {
path: "add-send", path: "add-send",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "add-send" }, data: { state: "add-send" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(SendAddEditComponent, SendAddEditV2Component, { ...extensionRefreshSwap(SendAddEditComponent, SendAddEditV2Component, {
path: "edit-send", path: "edit-send",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "edit-send" }, data: { state: "edit-send" } satisfies RouteDataProperties,
}), }),
{ {
path: "send-created", path: "send-created",
component: SendCreatedComponent, component: SendCreatedComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "send" }, data: { state: "send" } satisfies RouteDataProperties,
}, },
{ {
path: "update-temp-password", path: "update-temp-password",
component: UpdateTempPasswordComponent, component: UpdateTempPasswordComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "update-temp-password" }, data: { state: "update-temp-password" } satisfies RouteDataProperties,
}, },
...unauthUiRefreshSwap( ...unauthUiRefreshSwap(
HintComponent, HintComponent,
@@ -392,7 +411,7 @@ const routes: Routes = [
canActivate: [unauthGuardFn(unauthRouteOverrides)], canActivate: [unauthGuardFn(unauthRouteOverrides)],
data: { data: {
state: "hint", state: "hint",
}, } satisfies RouteDataProperties,
}, },
{ {
path: "", path: "",
@@ -406,7 +425,7 @@ const routes: Routes = [
pageIcon: UserLockIcon, pageIcon: UserLockIcon,
showBackButton: true, showBackButton: true,
state: "hint", state: "hint",
}, } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData,
children: [ children: [
{ path: "", component: PasswordHintComponent }, { path: "", component: PasswordHintComponent },
{ {
@@ -426,7 +445,10 @@ const routes: Routes = [
{ {
path: "signup", path: "signup",
canActivate: [canAccessFeature(FeatureFlag.EmailVerification), unauthGuardFn()], canActivate: [canAccessFeature(FeatureFlag.EmailVerification), unauthGuardFn()],
data: { pageTitle: "createAccount" } satisfies AnonLayoutWrapperData, data: {
state: "signup",
pageTitle: "createAccount",
} satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -448,7 +470,8 @@ const routes: Routes = [
data: { data: {
pageTitle: "setAStrongPassword", pageTitle: "setAStrongPassword",
pageSubtitle: "finishCreatingYourAccountBySettingAPassword", pageSubtitle: "finishCreatingYourAccountBySettingAPassword",
} satisfies AnonLayoutWrapperData, state: "finish-signup",
} satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -463,7 +486,8 @@ const routes: Routes = [
data: { data: {
pageTitle: "joinOrganization", pageTitle: "joinOrganization",
pageSubtitle: "finishJoiningThisOrganizationBySettingAMasterPassword", pageSubtitle: "finishJoiningThisOrganizationBySettingAMasterPassword",
} satisfies AnonLayoutWrapperData, state: "set-password-jit",
} satisfies RouteDataProperties & AnonLayoutWrapperData,
}, },
], ],
}, },
@@ -471,21 +495,21 @@ const routes: Routes = [
path: "assign-collections", path: "assign-collections",
component: AssignCollections, component: AssignCollections,
canActivate: [canAccessFeature(FeatureFlag.ExtensionRefresh, true, "/")], canActivate: [canAccessFeature(FeatureFlag.ExtensionRefresh, true, "/")],
data: { state: "assign-collections" }, data: { state: "assign-collections" } satisfies RouteDataProperties,
}, },
...extensionRefreshSwap(AboutPageComponent, AboutPageV2Component, { ...extensionRefreshSwap(AboutPageComponent, AboutPageV2Component, {
path: "about", path: "about",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "about" }, data: { state: "about" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(MoreFromBitwardenPageComponent, MoreFromBitwardenPageV2Component, { ...extensionRefreshSwap(MoreFromBitwardenPageComponent, MoreFromBitwardenPageV2Component, {
path: "more-from-bitwarden", path: "more-from-bitwarden",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "moreFromBitwarden" }, data: { state: "moreFromBitwarden" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(TabsComponent, TabsV2Component, { ...extensionRefreshSwap(TabsComponent, TabsV2Component, {
path: "tabs", path: "tabs",
data: { state: "tabs" }, data: { state: "tabs" } satisfies RouteDataProperties,
children: [ children: [
{ {
path: "", path: "",
@@ -497,42 +521,42 @@ const routes: Routes = [
component: CurrentTabComponent, component: CurrentTabComponent,
canActivate: [authGuard], canActivate: [authGuard],
canMatch: [extensionRefreshRedirect("/tabs/vault")], canMatch: [extensionRefreshRedirect("/tabs/vault")],
data: { state: "tabs_current" }, data: { state: "tabs_current" } satisfies RouteDataProperties,
runGuardsAndResolvers: "always", runGuardsAndResolvers: "always",
}, },
...extensionRefreshSwap(VaultFilterComponent, VaultV2Component, { ...extensionRefreshSwap(VaultFilterComponent, VaultV2Component, {
path: "vault", path: "vault",
canActivate: [authGuard], canActivate: [authGuard],
canDeactivate: [clearVaultStateGuard], canDeactivate: [clearVaultStateGuard],
data: { state: "tabs_vault" }, data: { state: "tabs_vault" } satisfies RouteDataProperties,
}), }),
...generatorSwap(GeneratorComponent, CredentialGeneratorComponent, { ...generatorSwap(GeneratorComponent, CredentialGeneratorComponent, {
path: "generator", path: "generator",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "tabs_generator" }, data: { state: "tabs_generator" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(SettingsComponent, SettingsV2Component, { ...extensionRefreshSwap(SettingsComponent, SettingsV2Component, {
path: "settings", path: "settings",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "tabs_settings" }, data: { state: "tabs_settings" } satisfies RouteDataProperties,
}), }),
...extensionRefreshSwap(SendGroupingsComponent, SendV2Component, { ...extensionRefreshSwap(SendGroupingsComponent, SendV2Component, {
path: "send", path: "send",
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "tabs_send" }, data: { state: "tabs_send" } satisfies RouteDataProperties,
}), }),
], ],
}), }),
{ {
path: "account-switcher", path: "account-switcher",
component: AccountSwitcherComponent, component: AccountSwitcherComponent,
data: { state: "account-switcher", doNotSaveUrl: true }, data: { state: "account-switcher", doNotSaveUrl: true } satisfies RouteDataProperties,
}, },
{ {
path: "trash", path: "trash",
component: TrashComponent, component: TrashComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { state: "trash" }, data: { state: "trash" } satisfies RouteDataProperties,
}, },
]; ];

View File

@@ -43,6 +43,14 @@ import { VaultComponent } from "../vault/app/vault/vault.component";
import { SendComponent } from "./tools/send/send.component"; import { SendComponent } from "./tools/send/send.component";
/**
* Data properties acceptable for use in route objects in the desktop
*/
export interface RouteDataProperties {
// For any new route data properties, add them here.
// then assert that the data object satisfies this interface in the route object.
}
const routes: Routes = [ const routes: Routes = [
{ {
path: "", path: "",
@@ -114,7 +122,6 @@ const routes: Routes = [
path: "remove-password", path: "remove-password",
component: RemovePasswordComponent, component: RemovePasswordComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { titleId: "removeMasterPassword" },
}, },
...unauthUiRefreshSwap( ...unauthUiRefreshSwap(
HintComponent, HintComponent,
@@ -122,10 +129,6 @@ const routes: Routes = [
{ {
path: "hint", path: "hint",
canActivate: [unauthGuardFn()], canActivate: [unauthGuardFn()],
data: {
pageTitle: "passwordHint",
titleId: "passwordHint",
},
}, },
{ {
path: "", path: "",
@@ -137,8 +140,7 @@ const routes: Routes = [
pageTitle: "requestPasswordHint", pageTitle: "requestPasswordHint",
pageSubtitle: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou", pageSubtitle: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou",
pageIcon: UserLockIcon, pageIcon: UserLockIcon,
state: "hint", } satisfies AnonLayoutWrapperData,
},
children: [ children: [
{ path: "", component: PasswordHintComponent }, { path: "", component: PasswordHintComponent },
{ {

View File

@@ -15,9 +15,15 @@ import {
/** /**
* Data properties acceptable for use in route objects (see usage in oss-routing.module.ts for example) * Data properties acceptable for use in route objects (see usage in oss-routing.module.ts for example)
*/ */
export interface DataProperties { export interface RouteDataProperties {
titleId?: string; // sets the title of the current HTML document (shows in browser tab) /**
doNotSaveUrl?: boolean; // choose to not keep track of the previous URL in memory * Title of the current HTML document (shows in browser tab)
*/
titleId?: string;
/**
* doNotSaveUrl - choose to not keep track of the previous URL in memory in the RouterService
*/
doNotSaveUrl?: boolean;
} }
const DEEP_LINK_REDIRECT_URL = new KeyDefinition(ROUTER_DISK, "deepLinkRedirectUrl", { const DEEP_LINK_REDIRECT_URL = new KeyDefinition(ROUTER_DISK, "deepLinkRedirectUrl", {

View File

@@ -61,7 +61,7 @@ import { VerifyEmailTokenComponent } from "./auth/verify-email-token.component";
import { VerifyRecoverDeleteComponent } from "./auth/verify-recover-delete.component"; import { VerifyRecoverDeleteComponent } from "./auth/verify-recover-delete.component";
import { SponsoredFamiliesComponent } from "./billing/settings/sponsored-families.component"; import { SponsoredFamiliesComponent } from "./billing/settings/sponsored-families.component";
import { EnvironmentSelectorComponent } from "./components/environment-selector/environment-selector.component"; import { EnvironmentSelectorComponent } from "./components/environment-selector/environment-selector.component";
import { DataProperties } from "./core"; import { RouteDataProperties } from "./core";
import { FrontendLayoutComponent } from "./layouts/frontend-layout.component"; import { FrontendLayoutComponent } from "./layouts/frontend-layout.component";
import { UserLayoutComponent } from "./layouts/user-layout.component"; import { UserLayoutComponent } from "./layouts/user-layout.component";
import { RequestSMAccessComponent } from "./secrets-manager/secrets-manager-landing/request-sm-access.component"; import { RequestSMAccessComponent } from "./secrets-manager/secrets-manager-landing/request-sm-access.component";
@@ -79,7 +79,7 @@ const routes: Routes = [
{ {
path: "", path: "",
component: FrontendLayoutComponent, component: FrontendLayoutComponent,
data: { doNotSaveUrl: true } satisfies DataProperties, data: { doNotSaveUrl: true } satisfies RouteDataProperties,
children: [ children: [
{ {
path: "", path: "",
@@ -90,17 +90,17 @@ const routes: Routes = [
{ {
path: "login-with-device", path: "login-with-device",
component: LoginViaAuthRequestComponent, component: LoginViaAuthRequestComponent,
data: { titleId: "loginWithDevice" } satisfies DataProperties, data: { titleId: "loginWithDevice" } satisfies RouteDataProperties,
}, },
{ {
path: "login-with-passkey", path: "login-with-passkey",
component: LoginViaWebAuthnComponent, component: LoginViaWebAuthnComponent,
data: { titleId: "loginWithPasskey" } satisfies DataProperties, data: { titleId: "loginWithPasskey" } satisfies RouteDataProperties,
}, },
{ {
path: "admin-approval-requested", path: "admin-approval-requested",
component: LoginViaAuthRequestComponent, component: LoginViaAuthRequestComponent,
data: { titleId: "adminApprovalRequested" } satisfies DataProperties, data: { titleId: "adminApprovalRequested" } satisfies RouteDataProperties,
}, },
{ {
path: "login-initiated", path: "login-initiated",
@@ -111,7 +111,7 @@ const routes: Routes = [
path: "register", path: "register",
component: TrialInitiationComponent, component: TrialInitiationComponent,
canActivate: [unauthGuardFn()], canActivate: [unauthGuardFn()],
data: { titleId: "createAccount" } satisfies DataProperties, data: { titleId: "createAccount" } satisfies RouteDataProperties,
}, },
{ {
path: "trial", path: "trial",
@@ -121,20 +121,23 @@ const routes: Routes = [
{ {
path: "set-password", path: "set-password",
component: SetPasswordComponent, component: SetPasswordComponent,
data: { titleId: "setMasterPassword" } satisfies DataProperties, data: { titleId: "setMasterPassword" } satisfies RouteDataProperties,
}, },
{ path: "verify-email", component: VerifyEmailTokenComponent }, { path: "verify-email", component: VerifyEmailTokenComponent },
{ {
path: "accept-organization", path: "accept-organization",
canActivate: [deepLinkGuard()], canActivate: [deepLinkGuard()],
component: AcceptOrganizationComponent, component: AcceptOrganizationComponent,
data: { titleId: "joinOrganization", doNotSaveUrl: false } satisfies DataProperties, data: { titleId: "joinOrganization", doNotSaveUrl: false } satisfies RouteDataProperties,
}, },
{ {
path: "accept-families-for-enterprise", path: "accept-families-for-enterprise",
component: AcceptFamilySponsorshipComponent, component: AcceptFamilySponsorshipComponent,
canActivate: [deepLinkGuard()], canActivate: [deepLinkGuard()],
data: { titleId: "acceptFamilySponsorship", doNotSaveUrl: false } satisfies DataProperties, data: {
titleId: "acceptFamilySponsorship",
doNotSaveUrl: false,
} satisfies RouteDataProperties,
}, },
{ path: "recover", pathMatch: "full", redirectTo: "recover-2fa" }, { path: "recover", pathMatch: "full", redirectTo: "recover-2fa" },
{ {
@@ -147,19 +150,19 @@ const routes: Routes = [
path: "verify-recover-delete-provider", path: "verify-recover-delete-provider",
component: VerifyRecoverDeleteProviderComponent, component: VerifyRecoverDeleteProviderComponent,
canActivate: [unauthGuardFn()], canActivate: [unauthGuardFn()],
data: { titleId: "deleteAccount" } satisfies DataProperties, data: { titleId: "deleteAccount" } satisfies RouteDataProperties,
}, },
{ {
path: "update-temp-password", path: "update-temp-password",
component: UpdateTempPasswordComponent, component: UpdateTempPasswordComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { titleId: "updateTempPassword" } satisfies DataProperties, data: { titleId: "updateTempPassword" } satisfies RouteDataProperties,
}, },
{ {
path: "update-password", path: "update-password",
component: UpdatePasswordComponent, component: UpdatePasswordComponent,
canActivate: [authGuard], canActivate: [authGuard],
data: { titleId: "updatePassword" } satisfies DataProperties, data: { titleId: "updatePassword" } satisfies RouteDataProperties,
}, },
{ {
path: "migrate-legacy-encryption", path: "migrate-legacy-encryption",
@@ -220,8 +223,10 @@ const routes: Routes = [
{ {
path: "signup", path: "signup",
canActivate: [canAccessFeature(FeatureFlag.EmailVerification), unauthGuardFn()], canActivate: [canAccessFeature(FeatureFlag.EmailVerification), unauthGuardFn()],
data: { pageTitle: "createAccount", titleId: "createAccount" } satisfies DataProperties & data: {
AnonLayoutWrapperData, pageTitle: "createAccount",
titleId: "createAccount",
} satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -244,7 +249,7 @@ const routes: Routes = [
pageTitle: "setAStrongPassword", pageTitle: "setAStrongPassword",
pageSubtitle: "finishCreatingYourAccountBySettingAPassword", pageSubtitle: "finishCreatingYourAccountBySettingAPassword",
titleId: "setAStrongPassword", titleId: "setAStrongPassword",
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -257,7 +262,7 @@ const routes: Routes = [
data: { data: {
pageTitle: "viewSend", pageTitle: "viewSend",
showReadonlyHostname: true, showReadonlyHostname: true,
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -301,7 +306,7 @@ const routes: Routes = [
data: { data: {
pageTitle: "enterpriseSingleSignOn", pageTitle: "enterpriseSingleSignOn",
titleId: "enterpriseSingleSignOn", titleId: "enterpriseSingleSignOn",
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -362,7 +367,7 @@ const routes: Routes = [
], ],
data: { data: {
pageTitle: "verifyIdentity", pageTitle: "verifyIdentity",
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
}, },
{ {
path: "recover-2fa", path: "recover-2fa",
@@ -381,7 +386,7 @@ const routes: Routes = [
data: { data: {
pageTitle: "recoverAccountTwoStep", pageTitle: "recoverAccountTwoStep",
titleId: "recoverAccountTwoStep", titleId: "recoverAccountTwoStep",
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
}, },
{ {
path: "accept-emergency", path: "accept-emergency",
@@ -390,7 +395,7 @@ const routes: Routes = [
pageTitle: "emergencyAccess", pageTitle: "emergencyAccess",
titleId: "acceptEmergency", titleId: "acceptEmergency",
doNotSaveUrl: false, doNotSaveUrl: false,
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -407,7 +412,7 @@ const routes: Routes = [
data: { data: {
pageTitle: "deleteAccount", pageTitle: "deleteAccount",
titleId: "deleteAccount", titleId: "deleteAccount",
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -426,7 +431,7 @@ const routes: Routes = [
data: { data: {
pageTitle: "deleteAccount", pageTitle: "deleteAccount",
titleId: "deleteAccount", titleId: "deleteAccount",
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
children: [ children: [
{ {
path: "", path: "",
@@ -441,7 +446,7 @@ const routes: Routes = [
data: { data: {
pageTitle: "removeMasterPassword", pageTitle: "removeMasterPassword",
titleId: "removeMasterPassword", titleId: "removeMasterPassword",
} satisfies DataProperties & AnonLayoutWrapperData, } satisfies RouteDataProperties & AnonLayoutWrapperData,
}, },
{ {
path: "trial-initiation", path: "trial-initiation",
@@ -479,7 +484,7 @@ const routes: Routes = [
{ {
path: "sends", path: "sends",
component: SendComponent, component: SendComponent,
data: { titleId: "send" } satisfies DataProperties, data: { titleId: "send" } satisfies RouteDataProperties,
}, },
{ {
path: "sm-landing", path: "sm-landing",
@@ -494,7 +499,7 @@ const routes: Routes = [
{ {
path: "create-organization", path: "create-organization",
component: CreateOrganizationComponent, component: CreateOrganizationComponent,
data: { titleId: "newOrganization" } satisfies DataProperties, data: { titleId: "newOrganization" } satisfies RouteDataProperties,
}, },
{ {
path: "settings", path: "settings",
@@ -503,12 +508,12 @@ const routes: Routes = [
{ {
path: "account", path: "account",
component: AccountComponent, component: AccountComponent,
data: { titleId: "myAccount" } satisfies DataProperties, data: { titleId: "myAccount" } satisfies RouteDataProperties,
}, },
{ {
path: "preferences", path: "preferences",
component: PreferencesComponent, component: PreferencesComponent,
data: { titleId: "preferences" } satisfies DataProperties, data: { titleId: "preferences" } satisfies RouteDataProperties,
}, },
{ {
path: "security", path: "security",
@@ -517,7 +522,7 @@ const routes: Routes = [
{ {
path: "domain-rules", path: "domain-rules",
component: DomainRulesComponent, component: DomainRulesComponent,
data: { titleId: "domainRules" } satisfies DataProperties, data: { titleId: "domainRules" } satisfies RouteDataProperties,
}, },
{ {
path: "subscription", path: "subscription",
@@ -532,19 +537,19 @@ const routes: Routes = [
{ {
path: "", path: "",
component: EmergencyAccessComponent, component: EmergencyAccessComponent,
data: { titleId: "emergencyAccess" } satisfies DataProperties, data: { titleId: "emergencyAccess" } satisfies RouteDataProperties,
}, },
{ {
path: ":id", path: ":id",
component: EmergencyAccessViewComponent, component: EmergencyAccessViewComponent,
data: { titleId: "emergencyAccess" } satisfies DataProperties, data: { titleId: "emergencyAccess" } satisfies RouteDataProperties,
}, },
], ],
}, },
{ {
path: "sponsored-families", path: "sponsored-families",
component: SponsoredFamiliesComponent, component: SponsoredFamiliesComponent,
data: { titleId: "sponsoredFamilies" } satisfies DataProperties, data: { titleId: "sponsoredFamilies" } satisfies RouteDataProperties,
}, },
], ],
}, },
@@ -559,7 +564,7 @@ const routes: Routes = [
import("./tools/import/import-web.component").then((mod) => mod.ImportWebComponent), import("./tools/import/import-web.component").then((mod) => mod.ImportWebComponent),
data: { data: {
titleId: "importData", titleId: "importData",
} satisfies DataProperties, } satisfies RouteDataProperties,
}, },
{ {
path: "export", path: "export",
@@ -569,12 +574,12 @@ const routes: Routes = [
), ),
data: { data: {
titleId: "exportVault", titleId: "exportVault",
} satisfies DataProperties, } satisfies RouteDataProperties,
}, },
{ {
path: "generator", path: "generator",
component: GeneratorComponent, component: GeneratorComponent,
data: { titleId: "generator" } satisfies DataProperties, data: { titleId: "generator" } satisfies RouteDataProperties,
}, },
], ],
}, },