104 lines
4.1 KiB
TypeScript
104 lines
4.1 KiB
TypeScript
import { HttpClient } from '@angular/common/http';
|
|
import { Component } from '@angular/core';
|
|
import { ActivatedRoute, Router } from '@angular/router';
|
|
import { StripeService } from 'ngx-stripe';
|
|
import { switchMap } from 'rxjs';
|
|
import { User } from '../../../../../bizmatch-server/src/models/db.model';
|
|
import { Checkout, KeycloakUser } from '../../../../../bizmatch-server/src/models/main.model';
|
|
import { environment } from '../../../environments/environment';
|
|
import { AuditService } from '../../services/audit.service';
|
|
import { AuthService } from '../../services/auth.service';
|
|
import { UserService } from '../../services/user.service';
|
|
import { SharedModule } from '../../shared/shared/shared.module';
|
|
import { map2User } from '../../utils/utils';
|
|
|
|
@Component({
|
|
selector: 'app-pricing',
|
|
standalone: true,
|
|
imports: [SharedModule],
|
|
templateUrl: './pricing.component.html',
|
|
styleUrl: './pricing.component.scss',
|
|
})
|
|
export class PricingComponent {
|
|
private apiBaseUrl = environment.apiBaseUrl;
|
|
private id: string | undefined = this.activatedRoute.snapshot.params['id'] as string | undefined;
|
|
pricingOverview: boolean | undefined = this.activatedRoute.snapshot.data['pricingOverview'] as boolean | undefined;
|
|
keycloakUser: KeycloakUser;
|
|
user: User;
|
|
constructor(
|
|
private http: HttpClient,
|
|
private stripeService: StripeService,
|
|
private activatedRoute: ActivatedRoute,
|
|
private userService: UserService,
|
|
private router: Router,
|
|
private auditService: AuditService,
|
|
private authService: AuthService,
|
|
) {}
|
|
|
|
async ngOnInit() {
|
|
const token = await this.authService.getToken();
|
|
this.keycloakUser = map2User(token);
|
|
if (this.keycloakUser) {
|
|
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
|
const originalKeycloakUser = await this.userService.getKeycloakUser(this.keycloakUser.id);
|
|
const priceId = originalKeycloakUser.attributes && originalKeycloakUser.attributes['priceID'] ? originalKeycloakUser.attributes['priceID'][0] : null;
|
|
if (priceId) {
|
|
originalKeycloakUser.attributes['priceID'] = null;
|
|
await this.userService.updateKeycloakUser(originalKeycloakUser);
|
|
}
|
|
if (!this.user.subscriptionPlan) {
|
|
if (this.id === 'free' || priceId === 'free') {
|
|
this.user.subscriptionPlan = 'free';
|
|
await this.userService.saveGuaranteed(this.user);
|
|
this.router.navigate([`/account`]);
|
|
} else if (this.id || priceId) {
|
|
const base64PriceId = this.id ? this.id : priceId;
|
|
this.checkout({ priceId: atob(base64PriceId), email: this.keycloakUser.email, name: `${this.keycloakUser.firstName} ${this.keycloakUser.lastName}` });
|
|
}
|
|
}
|
|
} else {
|
|
this.pricingOverview = false;
|
|
}
|
|
}
|
|
|
|
async register(priceId?: string) {
|
|
if (this.keycloakUser) {
|
|
if (!priceId) {
|
|
this.user = await this.userService.getByMail(this.keycloakUser.email);
|
|
this.user.subscriptionPlan = 'free';
|
|
await this.userService.saveGuaranteed(this.user);
|
|
this.router.navigate([`/account`]);
|
|
} else {
|
|
this.checkout({ priceId: priceId, email: this.keycloakUser.email, name: `${this.keycloakUser.firstName} ${this.keycloakUser.lastName}` });
|
|
}
|
|
} else {
|
|
// if (priceId) {
|
|
// this.keycloakService.register({
|
|
// redirectUri: `${window.location.origin}/pricing/${btoa(priceId)}`,
|
|
// });
|
|
// } else {
|
|
// this.keycloakService.register({ redirectUri: `${window.location.origin}/pricing/free` });
|
|
// }
|
|
}
|
|
}
|
|
|
|
checkout(checkout: Checkout) {
|
|
// Check the server.js tab to see an example implementation
|
|
this.http
|
|
.post(`${this.apiBaseUrl}/bizmatch/payment/create-checkout-session`, checkout)
|
|
.pipe(
|
|
switchMap((session: any) => {
|
|
return this.stripeService.redirectToCheckout({ sessionId: session.id });
|
|
}),
|
|
)
|
|
.subscribe(result => {
|
|
// If `redirectToCheckout` fails due to a browser or network
|
|
// error, you should display the localized error message to your
|
|
// customer using `error.message`.
|
|
if (result.error) {
|
|
alert(result.error.message);
|
|
}
|
|
});
|
|
}
|
|
}
|