From e5a6312fee7882c6a7ee5ef332dd14e4b46b6ff5 Mon Sep 17 00:00:00 2001 From: Alex Morask <144709477+amorask-bitwarden@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:38:43 -0500 Subject: [PATCH] [PM-33308] Use `providedIn: "root"` for web-based billing services (#19449) * refactor(billing): move billing services to providedIn root and remove component-level providers * refactor(billing): remove missed redundant billing service providers * refactor(billing): move 4 additional billing services to providedIn root and remove empty modules --- .../layouts/organization-layout.component.ts | 2 -- .../organizations/organization.module.ts | 2 -- .../app/billing/clients/account-billing.client.ts | 2 +- .../billing/clients/organization-billing.client.ts | 2 +- .../app/billing/clients/preview-invoice.client.ts | 2 +- .../app/billing/clients/subscriber-billing.client.ts | 2 +- .../account-payment-details.component.ts | 1 - .../premium/cloud-hosted-premium.component.ts | 1 - .../services/premium-subscription-routing.service.ts | 2 +- .../app/billing/individual/subscription.component.ts | 1 - ...-account-subscription-storage-dialog.component.ts | 1 - .../cloud-hosted-account-subscription.component.ts | 1 - .../premium-org-upgrade-dialog.component.ts | 3 --- .../premium-org-upgrade-payment.component.ts | 1 - .../services/premium-org-upgrade.service.ts | 2 +- .../unified-upgrade-dialog.component.ts | 3 --- .../services/upgrade-payment.service.ts | 2 +- .../upgrade-payment/upgrade-payment.component.ts | 1 - .../organizations/change-plan-dialog.component.ts | 1 - .../organizations/organization-plans.component.ts | 7 ------- .../warnings/organization-warnings.module.ts | 12 ------------ .../services/organization-warnings.service.ts | 2 +- .../add-account-credit-dialog.component.ts | 1 - .../change-payment-method-dialog.component.ts | 1 - .../components/display-account-credit.component.ts | 10 +--------- .../display-payment-method-inline.component.ts | 1 - .../edit-billing-address-dialog.component.ts | 1 - .../require-payment-method-dialog.component.ts | 1 - .../components/verify-bank-account.component.ts | 1 - .../trial-payment-dialog.component.ts | 1 - .../trial-billing-step.component.ts | 2 -- .../trial-billing-step/trial-billing-step.service.ts | 2 +- .../layouts/org-switcher/org-switcher.component.ts | 4 +--- apps/web/src/app/layouts/user-layout.component.ts | 2 -- .../vault-filter/vault-filter.module.ts | 3 +-- .../app/vault/individual-vault/vault.component.ts | 2 -- .../app/admin-console/providers/providers.module.ts | 2 -- .../providers/warnings/provider-warnings.module.ts | 10 ---------- .../warnings/services/provider-warnings.service.ts | 2 +- .../app/secrets-manager/overview/overview.module.ts | 2 -- 40 files changed, 13 insertions(+), 88 deletions(-) delete mode 100644 apps/web/src/app/billing/organizations/warnings/organization-warnings.module.ts delete mode 100644 bitwarden_license/bit-web/src/app/billing/providers/warnings/provider-warnings.module.ts diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts index 2d1fde10856..4dd3e7fff72 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts @@ -27,7 +27,6 @@ import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { getById } from "@bitwarden/common/platform/misc"; import { BannerModule, SvgModule } from "@bitwarden/components"; -import { OrganizationWarningsModule } from "@bitwarden/web-vault/app/billing/organizations/warnings/organization-warnings.module"; import { OrganizationWarningsService } from "@bitwarden/web-vault/app/billing/organizations/warnings/services"; import { NonIndividualSubscriber } from "@bitwarden/web-vault/app/billing/types"; import { TaxIdWarningComponent } from "@bitwarden/web-vault/app/billing/warnings/components"; @@ -52,7 +51,6 @@ import { WebLayoutModule } from "../../../layouts/web-layout.module"; BannerModule, TaxIdWarningComponent, TaxIdWarningComponent, - OrganizationWarningsModule, ], }) export class OrganizationLayoutComponent implements OnInit { diff --git a/apps/web/src/app/admin-console/organizations/organization.module.ts b/apps/web/src/app/admin-console/organizations/organization.module.ts index 2f0077d313e..0d2fd6debc3 100644 --- a/apps/web/src/app/admin-console/organizations/organization.module.ts +++ b/apps/web/src/app/admin-console/organizations/organization.module.ts @@ -2,7 +2,6 @@ import { ScrollingModule } from "@angular/cdk/scrolling"; import { NgModule } from "@angular/core"; import { ScrollLayoutDirective } from "@bitwarden/components"; -import { OrganizationWarningsModule } from "@bitwarden/web-vault/app/billing/organizations/warnings/organization-warnings.module"; import { HeaderModule } from "../../layouts/header/header.module"; @@ -22,7 +21,6 @@ import { AccessSelectorModule } from "./shared/components/access-selector"; HeaderModule, ScrollingModule, ScrollLayoutDirective, - OrganizationWarningsModule, ], declarations: [GroupsComponent, GroupAddEditComponent], }) diff --git a/apps/web/src/app/billing/clients/account-billing.client.ts b/apps/web/src/app/billing/clients/account-billing.client.ts index 7367e539e14..fd66400a2ee 100644 --- a/apps/web/src/app/billing/clients/account-billing.client.ts +++ b/apps/web/src/app/billing/clients/account-billing.client.ts @@ -25,7 +25,7 @@ export type UpgradePremiumToOrganizationRequest = { billingAddress: Pick; }; -@Injectable() +@Injectable({ providedIn: "root" }) export class AccountBillingClient { private endpoint = "/account/billing/vnext"; diff --git a/apps/web/src/app/billing/clients/organization-billing.client.ts b/apps/web/src/app/billing/clients/organization-billing.client.ts index a8b3b31a4a4..c3bad815472 100644 --- a/apps/web/src/app/billing/clients/organization-billing.client.ts +++ b/apps/web/src/app/billing/clients/organization-billing.client.ts @@ -4,7 +4,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationId } from "@bitwarden/common/types/guid"; import { OrganizationWarningsResponse } from "@bitwarden/web-vault/app/billing/organizations/warnings/types"; -@Injectable() +@Injectable({ providedIn: "root" }) export class OrganizationBillingClient { constructor(private apiService: ApiService) {} diff --git a/apps/web/src/app/billing/clients/preview-invoice.client.ts b/apps/web/src/app/billing/clients/preview-invoice.client.ts index 16fb1ca0762..88e325c491c 100644 --- a/apps/web/src/app/billing/clients/preview-invoice.client.ts +++ b/apps/web/src/app/billing/clients/preview-invoice.client.ts @@ -69,7 +69,7 @@ export interface TaxAmounts { total: number; } -@Injectable() +@Injectable({ providedIn: "root" }) export class PreviewInvoiceClient { constructor(private apiService: ApiService) {} diff --git a/apps/web/src/app/billing/clients/subscriber-billing.client.ts b/apps/web/src/app/billing/clients/subscriber-billing.client.ts index 107a8ccc728..7841b012765 100644 --- a/apps/web/src/app/billing/clients/subscriber-billing.client.ts +++ b/apps/web/src/app/billing/clients/subscriber-billing.client.ts @@ -22,7 +22,7 @@ type Result = message: string; }; -@Injectable() +@Injectable({ providedIn: "root" }) export class SubscriberBillingClient { constructor(private apiService: ApiService) {} diff --git a/apps/web/src/app/billing/individual/payment-details/account-payment-details.component.ts b/apps/web/src/app/billing/individual/payment-details/account-payment-details.component.ts index 8c061894fac..aa76ea2a572 100644 --- a/apps/web/src/app/billing/individual/payment-details/account-payment-details.component.ts +++ b/apps/web/src/app/billing/individual/payment-details/account-payment-details.component.ts @@ -30,7 +30,6 @@ type View = { HeaderModule, SharedModule, ], - providers: [SubscriberBillingClient], }) export class AccountPaymentDetailsComponent { private viewState$ = new BehaviorSubject(null); diff --git a/apps/web/src/app/billing/individual/premium/cloud-hosted-premium.component.ts b/apps/web/src/app/billing/individual/premium/cloud-hosted-premium.component.ts index 8c7a407eee5..8dc7f207c53 100644 --- a/apps/web/src/app/billing/individual/premium/cloud-hosted-premium.component.ts +++ b/apps/web/src/app/billing/individual/premium/cloud-hosted-premium.component.ts @@ -65,7 +65,6 @@ const RouteParamValues = { I18nPipe, PricingCardComponent, ], - providers: [AccountBillingClient], }) export class CloudHostedPremiumComponent { protected hasPremiumFromAnyOrganization$: Observable; diff --git a/apps/web/src/app/billing/individual/services/premium-subscription-routing.service.ts b/apps/web/src/app/billing/individual/services/premium-subscription-routing.service.ts index 6622a5baa9d..fe4f2ac1b70 100644 --- a/apps/web/src/app/billing/individual/services/premium-subscription-routing.service.ts +++ b/apps/web/src/app/billing/individual/services/premium-subscription-routing.service.ts @@ -8,7 +8,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { UserId } from "@bitwarden/user-core"; import { AccountBillingClient } from "@bitwarden/web-vault/app/billing/clients"; -@Injectable() +@Injectable({ providedIn: "root" }) export class PremiumSubscriptionRoutingService { constructor( private accountService: AccountService, diff --git a/apps/web/src/app/billing/individual/subscription.component.ts b/apps/web/src/app/billing/individual/subscription.component.ts index 5006e4b8fa4..c07e9cdd225 100644 --- a/apps/web/src/app/billing/individual/subscription.component.ts +++ b/apps/web/src/app/billing/individual/subscription.component.ts @@ -17,7 +17,6 @@ import { AccountBillingClient } from "../clients/account-billing.client"; @Component({ templateUrl: "subscription.component.html", standalone: false, - providers: [AccountBillingClient], }) export class SubscriptionComponent implements OnInit { showSubscriptionPageLink$: Observable; diff --git a/apps/web/src/app/billing/individual/subscription/adjust-account-subscription-storage-dialog.component.ts b/apps/web/src/app/billing/individual/subscription/adjust-account-subscription-storage-dialog.component.ts index da026807e3b..0ab6fc86cd4 100644 --- a/apps/web/src/app/billing/individual/subscription/adjust-account-subscription-storage-dialog.component.ts +++ b/apps/web/src/app/billing/individual/subscription/adjust-account-subscription-storage-dialog.component.ts @@ -41,7 +41,6 @@ type AdjustAccountSubscriptionStorageDialogResult = "closed" | "submitted"; @Component({ templateUrl: "./adjust-account-subscription-storage-dialog.component.html", changeDetection: ChangeDetectionStrategy.OnPush, - providers: [AccountBillingClient], imports: [ AsyncActionsModule, ButtonModule, diff --git a/apps/web/src/app/billing/individual/subscription/cloud-hosted-account-subscription.component.ts b/apps/web/src/app/billing/individual/subscription/cloud-hosted-account-subscription.component.ts index 7cf2d631b81..ccba24f7258 100644 --- a/apps/web/src/app/billing/individual/subscription/cloud-hosted-account-subscription.component.ts +++ b/apps/web/src/app/billing/individual/subscription/cloud-hosted-account-subscription.component.ts @@ -60,7 +60,6 @@ import { SubscriptionCardComponent, TypographyModule, ], - providers: [AccountBillingClient], }) export class CloudHostedAccountSubscriptionComponent { private readonly accountService = inject(AccountService); diff --git a/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-dialog/premium-org-upgrade-dialog.component.ts b/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-dialog/premium-org-upgrade-dialog.component.ts index a36ac6b22c3..1f18b372ab4 100644 --- a/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-dialog/premium-org-upgrade-dialog.component.ts +++ b/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-dialog/premium-org-upgrade-dialog.component.ts @@ -28,14 +28,12 @@ import { DialogService, } from "@bitwarden/components"; -import { AccountBillingClient, PreviewInvoiceClient } from "../../../clients"; import { BillingServicesModule } from "../../../services"; import { PremiumOrgUpgradePaymentComponent, PremiumOrgUpgradePaymentResult, } from "../premium-org-upgrade-payment/premium-org-upgrade-payment.component"; import { PremiumOrgUpgradePlanSelectionComponent } from "../premium-org-upgrade-plan-selection/premium-org-upgrade-plan-selection.component"; -import { UpgradePaymentService } from "../upgrade-payment/services/upgrade-payment.service"; export const PremiumOrgUpgradeDialogStatus = { Closed: "closed", @@ -84,7 +82,6 @@ export type PremiumOrgUpgradeDialogParams = { PremiumOrgUpgradePlanSelectionComponent, PremiumOrgUpgradePaymentComponent, ], - providers: [UpgradePaymentService, AccountBillingClient, PreviewInvoiceClient], templateUrl: "./premium-org-upgrade-dialog.component.html", }) export class PremiumOrgUpgradeDialogComponent implements OnInit { diff --git a/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/premium-org-upgrade-payment.component.ts b/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/premium-org-upgrade-payment.component.ts index d45a8b2eb8d..881bc7e4889 100644 --- a/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/premium-org-upgrade-payment.component.ts +++ b/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/premium-org-upgrade-payment.component.ts @@ -83,7 +83,6 @@ export type PremiumOrgUpgradePaymentResult = { EnterBillingAddressComponent, DisplayPaymentMethodInlineComponent, ], - providers: [PremiumOrgUpgradeService], templateUrl: "./premium-org-upgrade-payment.component.html", }) export class PremiumOrgUpgradePaymentComponent implements OnInit, AfterViewInit { diff --git a/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/services/premium-org-upgrade.service.ts b/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/services/premium-org-upgrade.service.ts index ed394b56823..c1b0f44c486 100644 --- a/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/services/premium-org-upgrade.service.ts +++ b/apps/web/src/app/billing/individual/upgrade/premium-org-upgrade-payment/services/premium-org-upgrade.service.ts @@ -46,7 +46,7 @@ export interface InvoicePreview { newPlanProratedAmount?: number; } -@Injectable() +@Injectable({ providedIn: "root" }) export class PremiumOrgUpgradeService { constructor( private accountBillingClient: AccountBillingClient, diff --git a/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.ts b/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.ts index 62fcbacee7a..796af86e7e0 100644 --- a/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.ts +++ b/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.ts @@ -15,10 +15,8 @@ import { DialogService, } from "@bitwarden/components"; -import { AccountBillingClient, PreviewInvoiceClient } from "../../../clients"; import { BillingServicesModule } from "../../../services"; import { UpgradeAccountComponent } from "../upgrade-account/upgrade-account.component"; -import { UpgradePaymentService } from "../upgrade-payment/services/upgrade-payment.service"; import { UpgradePaymentComponent, UpgradePaymentResult, @@ -74,7 +72,6 @@ export type UnifiedUpgradeDialogParams = { UpgradePaymentComponent, BillingServicesModule, ], - providers: [UpgradePaymentService, AccountBillingClient, PreviewInvoiceClient], templateUrl: "./unified-upgrade-dialog.component.html", }) export class UnifiedUpgradeDialogComponent implements OnInit { diff --git a/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.ts b/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.ts index 06c28123848..138cf4bd316 100644 --- a/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.ts +++ b/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.ts @@ -53,7 +53,7 @@ export type PaymentFormValues = { /** * Service for handling payment submission and sales tax calculation for upgrade payment component */ -@Injectable() +@Injectable({ providedIn: "root" }) export class UpgradePaymentService { constructor( private organizationBillingService: OrganizationBillingServiceAbstraction, diff --git a/apps/web/src/app/billing/individual/upgrade/upgrade-payment/upgrade-payment.component.ts b/apps/web/src/app/billing/individual/upgrade/upgrade-payment/upgrade-payment.component.ts index 77ae3b31837..3ea7cf6ba38 100644 --- a/apps/web/src/app/billing/individual/upgrade/upgrade-payment/upgrade-payment.component.ts +++ b/apps/web/src/app/billing/individual/upgrade/upgrade-payment/upgrade-payment.component.ts @@ -97,7 +97,6 @@ export type UpgradePaymentParams = { EnterBillingAddressComponent, BillingServicesModule, ], - providers: [UpgradePaymentService], templateUrl: "./upgrade-payment.component.html", }) export class UpgradePaymentComponent implements OnInit, AfterViewInit { diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts index 0a22ef5ddac..6dd919a4c53 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts @@ -117,7 +117,6 @@ interface OnSuccessArgs { EnterBillingAddressComponent, CardComponent, ], - providers: [SubscriberBillingClient, PreviewInvoiceClient], }) export class ChangePlanDialogComponent implements OnInit, OnDestroy { // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts index 434f45f6b27..d310aa0cbc9 100644 --- a/apps/web/src/app/billing/organizations/organization-plans.component.ts +++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts @@ -51,7 +51,6 @@ import { IconComponent, ToastService } from "@bitwarden/components"; import { KeyService } from "@bitwarden/key-management"; import { Cart, CartSummaryComponent, DiscountTypes } from "@bitwarden/pricing"; import { - AccountBillingClient, OrganizationSubscriptionPlan, OrganizationSubscriptionPurchase, PreviewInvoiceClient, @@ -96,12 +95,6 @@ const Allowed2020PlansForLegacyProviders = [ IconComponent, CartSummaryComponent, ], - providers: [ - AccountBillingClient, - SubscriberBillingClient, - PreviewInvoiceClient, - PremiumOrgUpgradeService, - ], }) export class OrganizationPlansComponent implements OnInit, OnDestroy { // ViewChildren diff --git a/apps/web/src/app/billing/organizations/warnings/organization-warnings.module.ts b/apps/web/src/app/billing/organizations/warnings/organization-warnings.module.ts deleted file mode 100644 index 6defee7e78b..00000000000 --- a/apps/web/src/app/billing/organizations/warnings/organization-warnings.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from "@angular/core"; - -import { - OrganizationBillingClient, - SubscriberBillingClient, -} from "@bitwarden/web-vault/app/billing/clients"; -import { OrganizationWarningsService } from "@bitwarden/web-vault/app/billing/organizations/warnings/services"; - -@NgModule({ - providers: [OrganizationBillingClient, OrganizationWarningsService, SubscriberBillingClient], -}) -export class OrganizationWarningsModule {} diff --git a/apps/web/src/app/billing/organizations/warnings/services/organization-warnings.service.ts b/apps/web/src/app/billing/organizations/warnings/services/organization-warnings.service.ts index a34533bcada..7838cf3591e 100644 --- a/apps/web/src/app/billing/organizations/warnings/services/organization-warnings.service.ts +++ b/apps/web/src/app/billing/organizations/warnings/services/organization-warnings.service.ts @@ -42,7 +42,7 @@ const format = (date: Date) => year: "numeric", }); -@Injectable() +@Injectable({ providedIn: "root" }) export class OrganizationWarningsService { private cache$ = new Map>(); diff --git a/apps/web/src/app/billing/payment/components/add-account-credit-dialog.component.ts b/apps/web/src/app/billing/payment/components/add-account-credit-dialog.component.ts index 1ba1536ff36..c4357357628 100644 --- a/apps/web/src/app/billing/payment/components/add-account-credit-dialog.component.ts +++ b/apps/web/src/app/billing/payment/components/add-account-credit-dialog.component.ts @@ -127,7 +127,6 @@ const positiveNumberValidator = `, standalone: true, imports: [SharedModule], - providers: [SubscriberBillingClient], }) export class AddAccountCreditDialogComponent { // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals diff --git a/apps/web/src/app/billing/payment/components/change-payment-method-dialog.component.ts b/apps/web/src/app/billing/payment/components/change-payment-method-dialog.component.ts index 756f7281049..d8e8c450cf8 100644 --- a/apps/web/src/app/billing/payment/components/change-payment-method-dialog.component.ts +++ b/apps/web/src/app/billing/payment/components/change-payment-method-dialog.component.ts @@ -53,7 +53,6 @@ type DialogParams = { `, standalone: true, imports: [EnterPaymentMethodComponent, SharedModule], - providers: [SubscriberBillingClient], }) export class ChangePaymentMethodDialogComponent extends SubmitPaymentMethodDialogComponent { protected override subscriber: BitwardenSubscriber; diff --git a/apps/web/src/app/billing/payment/components/display-account-credit.component.ts b/apps/web/src/app/billing/payment/components/display-account-credit.component.ts index b4684f0d739..e851c756f03 100644 --- a/apps/web/src/app/billing/payment/components/display-account-credit.component.ts +++ b/apps/web/src/app/billing/payment/components/display-account-credit.component.ts @@ -1,4 +1,3 @@ -import { CurrencyPipe } from "@angular/common"; import { Component, Input } from "@angular/core"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -16,7 +15,7 @@ import { AddAccountCreditDialogComponent } from "./add-account-credit-dialog.com selector: "app-display-account-credit", template: ` -

{{ "accountCredit" | i18n }}: {{ formattedCredit }}

+

{{ "accountCredit" | i18n }}: {{ credit ?? 0 | currency: "$" }}

{{ "availableCreditAppliedToInvoice" | i18n }}