1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-11 22:13:32 +00:00

fix(billing): prevents multiple upgrade dialogs from opening

Adds a check to prevent multiple upgrade dialogs from opening simultaneously.

Ensures correct redirection to the organization vault after upgrading to Teams or Enterprise.
This commit is contained in:
Stephon Brown
2026-01-29 12:27:42 -05:00
parent 2eaff7a8fa
commit 0f235e417c
3 changed files with 20 additions and 2 deletions

View File

@@ -31,6 +31,7 @@ import {
BusinessSubscriptionPricingTierId,
PersonalSubscriptionPricingTier,
PersonalSubscriptionPricingTierId,
PersonalSubscriptionPricingTierIds,
} from "@bitwarden/common/billing/types/subscription-pricing-tier";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { UnionOfValues } from "@bitwarden/common/vault/types/union-of-values";
@@ -192,6 +193,14 @@ export class PremiumOrgUpgradePaymentComponent implements OnInit, AfterViewInit
) {}
async ngOnInit(): Promise<void> {
// If the selected plan is Personal Premium, no upgrade is needed
if (this.selectedPlanId() == PersonalSubscriptionPricingTierIds.Premium) {
this.complete.emit({
status: PremiumOrgUpgradePaymentStatus.Closed,
organizationId: null,
});
}
combineLatest([
this.subscriptionPricingService.getPersonalSubscriptionPricingTiers$(),
this.subscriptionPricingService.getBusinessSubscriptionPricingTiers$(),

View File

@@ -85,6 +85,11 @@ export class UnifiedUpgradePromptService {
* @returns A promise that resolves to the dialog result if shown, or null if not shown
*/
async displayUpgradePromptConditionally(): Promise<UnifiedUpgradeDialogResult | null> {
// Prevent opening multiple dialogs if one is already open
if (this.unifiedUpgradeDialogRef) {
return null;
}
const shouldShow = await firstValueFrom(this.shouldShowPrompt$);
if (shouldShow) {

View File

@@ -248,10 +248,14 @@ export class UnifiedUpgradeDialogComponent implements OnInit {
if (
this.params.redirectOnCompletion &&
(status === UnifiedUpgradeDialogStatus.UpgradedToPremium ||
status === UnifiedUpgradeDialogStatus.UpgradedToFamilies)
status === UnifiedUpgradeDialogStatus.UpgradedToFamilies ||
status === UnifiedUpgradeDialogStatus.UpgradedToEnterprise ||
status === UnifiedUpgradeDialogStatus.UpgradedToTeams)
) {
const redirectUrl =
status === UnifiedUpgradeDialogStatus.UpgradedToFamilies
status === UnifiedUpgradeDialogStatus.UpgradedToFamilies ||
status === UnifiedUpgradeDialogStatus.UpgradedToEnterprise ||
status === UnifiedUpgradeDialogStatus.UpgradedToTeams
? `/organizations/${result.organizationId}/vault`
: "/settings/subscription/user-subscription";
await this.router.navigate([redirectUrl]);