mirror of
https://github.com/bitwarden/browser
synced 2025-12-17 16:53:34 +00:00
* Rename service-factory folder * Move cryptographic service factories * Move crypto models * Move crypto services * Move domain base class * Platform code owners * Move desktop log services * Move log files * Establish component library ownership * Move background listeners * Move background background * Move localization to Platform * Move browser alarms to Platform * Move browser state to Platform * Move CLI state to Platform * Move Desktop native concerns to Platform * Move flag and misc to Platform * Lint fixes * Move electron state to platform * Move web state to Platform * Move lib state to Platform * Fix broken tests * Rename interface to idiomatic TS * `npm run prettier` 🤖 * Resolve review feedback * Set platform as owners of web core and shared * Expand moved services * Fix test types --------- Co-authored-by: Hinton <hinton@users.noreply.github.com>
218 lines
6.4 KiB
TypeScript
218 lines
6.4 KiB
TypeScript
import { Component, OnInit, ViewChild } from "@angular/core";
|
|
import { FormBuilder, FormControl, Validators } from "@angular/forms";
|
|
import { ActivatedRoute, Router } from "@angular/router";
|
|
|
|
import { DialogServiceAbstraction, SimpleDialogType } from "@bitwarden/angular/services/dialog";
|
|
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
|
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
|
|
import { OrganizationResponse } from "@bitwarden/common/admin-console/models/response/organization.response";
|
|
import { PaymentMethodType } from "@bitwarden/common/billing/enums";
|
|
import { BillingPaymentResponse } from "@bitwarden/common/billing/models/response/billing-payment.response";
|
|
import { VerifyBankRequest } from "@bitwarden/common/models/request/verify-bank.request";
|
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
|
|
|
import { TaxInfoComponent } from "./tax-info.component";
|
|
|
|
@Component({
|
|
selector: "app-payment-method",
|
|
templateUrl: "payment-method.component.html",
|
|
})
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
|
export class PaymentMethodComponent implements OnInit {
|
|
@ViewChild(TaxInfoComponent) taxInfo: TaxInfoComponent;
|
|
|
|
loading = false;
|
|
firstLoaded = false;
|
|
showAdjustPayment = false;
|
|
showAddCredit = false;
|
|
billing: BillingPaymentResponse;
|
|
org: OrganizationResponse;
|
|
paymentMethodType = PaymentMethodType;
|
|
organizationId: string;
|
|
|
|
verifyBankPromise: Promise<any>;
|
|
taxFormPromise: Promise<any>;
|
|
|
|
verifyBankForm = this.formBuilder.group({
|
|
amount1: new FormControl<number>(null, [
|
|
Validators.required,
|
|
Validators.max(99),
|
|
Validators.min(0),
|
|
]),
|
|
amount2: new FormControl<number>(null, [
|
|
Validators.required,
|
|
Validators.max(99),
|
|
Validators.min(0),
|
|
]),
|
|
});
|
|
|
|
constructor(
|
|
protected apiService: ApiService,
|
|
protected organizationApiService: OrganizationApiServiceAbstraction,
|
|
protected i18nService: I18nService,
|
|
protected platformUtilsService: PlatformUtilsService,
|
|
private router: Router,
|
|
private logService: LogService,
|
|
private route: ActivatedRoute,
|
|
private formBuilder: FormBuilder,
|
|
private dialogService: DialogServiceAbstraction
|
|
) {}
|
|
|
|
async ngOnInit() {
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
|
|
this.route.params.subscribe(async (params) => {
|
|
if (params.organizationId) {
|
|
this.organizationId = params.organizationId;
|
|
} else if (this.platformUtilsService.isSelfHost()) {
|
|
this.router.navigate(["/settings/subscription"]);
|
|
return;
|
|
}
|
|
|
|
await this.load();
|
|
this.firstLoaded = true;
|
|
});
|
|
}
|
|
|
|
async load() {
|
|
if (this.loading) {
|
|
return;
|
|
}
|
|
this.loading = true;
|
|
|
|
if (this.forOrganization) {
|
|
const billingPromise = this.organizationApiService.getBilling(this.organizationId);
|
|
const orgPromise = this.organizationApiService.get(this.organizationId);
|
|
|
|
[this.billing, this.org] = await Promise.all([billingPromise, orgPromise]);
|
|
} else {
|
|
this.billing = await this.apiService.getUserBillingPayment();
|
|
}
|
|
|
|
this.loading = false;
|
|
}
|
|
|
|
addCredit() {
|
|
if (this.paymentSourceInApp) {
|
|
this.dialogService.openSimpleDialog({
|
|
title: { key: "addCredit" },
|
|
content: { key: "cannotPerformInAppPurchase" },
|
|
acceptButtonText: { key: "ok" },
|
|
cancelButtonText: null,
|
|
type: SimpleDialogType.WARNING,
|
|
});
|
|
|
|
return;
|
|
}
|
|
this.showAddCredit = true;
|
|
}
|
|
|
|
closeAddCredit(load: boolean) {
|
|
this.showAddCredit = false;
|
|
if (load) {
|
|
this.load();
|
|
}
|
|
}
|
|
|
|
changePayment() {
|
|
if (this.paymentSourceInApp) {
|
|
this.dialogService.openSimpleDialog({
|
|
title: { key: "changePaymentMethod" },
|
|
content: { key: "cannotPerformInAppPurchase" },
|
|
acceptButtonText: { key: "ok" },
|
|
cancelButtonText: null,
|
|
type: SimpleDialogType.WARNING,
|
|
});
|
|
|
|
return;
|
|
}
|
|
this.showAdjustPayment = true;
|
|
}
|
|
|
|
closePayment(load: boolean) {
|
|
this.showAdjustPayment = false;
|
|
if (load) {
|
|
this.load();
|
|
}
|
|
}
|
|
|
|
async verifyBank() {
|
|
if (this.loading || !this.forOrganization) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const request = new VerifyBankRequest();
|
|
request.amount1 = this.verifyBankForm.value.amount1;
|
|
request.amount2 = this.verifyBankForm.value.amount2;
|
|
this.verifyBankPromise = this.organizationApiService.verifyBank(this.organizationId, request);
|
|
await this.verifyBankPromise;
|
|
this.platformUtilsService.showToast(
|
|
"success",
|
|
null,
|
|
this.i18nService.t("verifiedBankAccount")
|
|
);
|
|
this.load();
|
|
} catch (e) {
|
|
this.logService.error(e);
|
|
}
|
|
}
|
|
|
|
async submitTaxInfo() {
|
|
this.taxFormPromise = this.taxInfo.submitTaxInfo();
|
|
await this.taxFormPromise;
|
|
this.platformUtilsService.showToast("success", null, this.i18nService.t("taxInfoUpdated"));
|
|
}
|
|
|
|
get isCreditBalance() {
|
|
return this.billing == null || this.billing.balance <= 0;
|
|
}
|
|
|
|
get creditOrBalance() {
|
|
return Math.abs(this.billing != null ? this.billing.balance : 0);
|
|
}
|
|
|
|
get paymentSource() {
|
|
return this.billing != null ? this.billing.paymentSource : null;
|
|
}
|
|
|
|
get forOrganization() {
|
|
return this.organizationId != null;
|
|
}
|
|
|
|
get headerClass() {
|
|
return this.forOrganization ? ["page-header"] : ["tabbed-header"];
|
|
}
|
|
|
|
get paymentSourceClasses() {
|
|
if (this.paymentSource == null) {
|
|
return [];
|
|
}
|
|
switch (this.paymentSource.type) {
|
|
case PaymentMethodType.Card:
|
|
return ["bwi-credit-card"];
|
|
case PaymentMethodType.BankAccount:
|
|
return ["bwi-bank"];
|
|
case PaymentMethodType.Check:
|
|
return ["bwi-money"];
|
|
case PaymentMethodType.AppleInApp:
|
|
return ["bwi-apple text-muted"];
|
|
case PaymentMethodType.GoogleInApp:
|
|
return ["bwi-google text-muted"];
|
|
case PaymentMethodType.PayPal:
|
|
return ["bwi-paypal text-primary"];
|
|
default:
|
|
return [];
|
|
}
|
|
}
|
|
|
|
get paymentSourceInApp() {
|
|
return (
|
|
this.paymentSource != null &&
|
|
(this.paymentSource.type === PaymentMethodType.AppleInApp ||
|
|
this.paymentSource.type === PaymentMethodType.GoogleInApp)
|
|
);
|
|
}
|
|
}
|