Browse Source

Extend promotion system

pull/4008/head
Thomas Kaul 10 months ago
parent
commit
f27fb30897
  1. 8
      apps/api/src/app/info/info.service.ts
  2. 8
      apps/client/src/app/app.component.ts
  3. 19
      apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
  4. 8
      apps/client/src/app/components/user-account-membership/user-account-membership.html
  5. 23
      apps/client/src/app/pages/pricing/pricing-page.component.ts
  6. 4
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
  7. 2
      libs/common/src/lib/interfaces/info-item.interface.ts

8
apps/api/src/app/info/info.service.ts

@ -101,7 +101,7 @@ export class InfoService {
isUserSignupEnabled, isUserSignupEnabled,
platforms, platforms,
statistics, statistics,
subscriptions subscriptionOffers
] = await Promise.all([ ] = await Promise.all([
this.benchmarkService.getBenchmarkAssetProfiles(), this.benchmarkService.getBenchmarkAssetProfiles(),
this.getDemoAuthToken(), this.getDemoAuthToken(),
@ -110,7 +110,7 @@ export class InfoService {
orderBy: { name: 'asc' } orderBy: { name: 'asc' }
}), }),
this.getStatistics(), this.getStatistics(),
this.getSubscriptions() this.getSubscriptionOffers()
]); ]);
if (isUserSignupEnabled) { if (isUserSignupEnabled) {
@ -125,7 +125,7 @@ export class InfoService {
isReadOnlyMode, isReadOnlyMode,
platforms, platforms,
statistics, statistics,
subscriptions, subscriptionOffers,
baseCurrency: DEFAULT_CURRENCY, baseCurrency: DEFAULT_CURRENCY,
currencies: this.exchangeRateDataService.getCurrencies() currencies: this.exchangeRateDataService.getCurrencies()
}; };
@ -314,7 +314,7 @@ export class InfoService {
return statistics; return statistics;
} }
private async getSubscriptions(): Promise<{ private async getSubscriptionOffers(): Promise<{
[offer in SubscriptionOfferKey]: SubscriptionOffer; [offer in SubscriptionOfferKey]: SubscriptionOffer;
}> { }> {
if (!this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { if (!this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {

8
apps/client/src/app/app.component.ts

@ -138,8 +138,8 @@ export class AppComponent implements OnDestroy, OnInit {
); );
this.hasPromotion = this.hasPromotion =
!!this.info?.subscriptions?.default?.coupon || !!this.info?.subscriptionOffers?.default?.coupon ||
!!this.info?.subscriptions?.default?.durationExtension; !!this.info?.subscriptionOffers?.default?.durationExtension;
this.impersonationStorageService this.impersonationStorageService
.onChangeHasImpersonation() .onChangeHasImpersonation()
@ -237,10 +237,10 @@ export class AppComponent implements OnDestroy, OnInit {
this.canCreateAccount || !!this.user?.systemMessage; this.canCreateAccount || !!this.user?.systemMessage;
this.hasPromotion = this.hasPromotion =
!!this.info?.subscriptions?.[ !!this.info?.subscriptionOffers?.[
this.user?.subscription?.offer ?? 'default' this.user?.subscription?.offer ?? 'default'
]?.coupon || ]?.coupon ||
!!this.info?.subscriptions?.[ !!this.info?.subscriptionOffers?.[
this.user?.subscription?.offer ?? 'default' this.user?.subscription?.offer ?? 'default'
]?.durationExtension; ]?.durationExtension;

19
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts

@ -16,6 +16,7 @@ import {
MatSnackBarRef, MatSnackBarRef,
TextOnlySnackBar TextOnlySnackBar
} from '@angular/material/snack-bar'; } from '@angular/material/snack-bar';
import { StringValue } from 'ms';
import { StripeService } from 'ngx-stripe'; import { StripeService } from 'ngx-stripe';
import { EMPTY, Subject } from 'rxjs'; import { EMPTY, Subject } from 'rxjs';
import { catchError, switchMap, takeUntil } from 'rxjs/operators'; import { catchError, switchMap, takeUntil } from 'rxjs/operators';
@ -31,6 +32,7 @@ export class UserAccountMembershipComponent implements OnDestroy {
public coupon: number; public coupon: number;
public couponId: string; public couponId: string;
public defaultDateFormat: string; public defaultDateFormat: string;
public durationExtension: StringValue;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public hasPermissionToUpdateUserSettings: boolean; public hasPermissionToUpdateUserSettings: boolean;
public price: number; public price: number;
@ -51,7 +53,7 @@ export class UserAccountMembershipComponent implements OnDestroy {
private stripeService: StripeService, private stripeService: StripeService,
private userService: UserService private userService: UserService
) { ) {
const { baseCurrency, globalPermissions, subscriptions } = const { baseCurrency, globalPermissions, subscriptionOffers } =
this.dataService.fetchInfo(); this.dataService.fetchInfo();
this.baseCurrency = baseCurrency; this.baseCurrency = baseCurrency;
@ -76,11 +78,18 @@ export class UserAccountMembershipComponent implements OnDestroy {
permissions.updateUserSettings permissions.updateUserSettings
); );
this.coupon = subscriptions?.[this.user.subscription.offer]?.coupon; this.coupon =
subscriptionOffers?.[this.user.subscription.offer]?.coupon;
this.couponId = this.couponId =
subscriptions?.[this.user.subscription.offer]?.couponId; subscriptionOffers?.[this.user.subscription.offer]?.couponId;
this.price = subscriptions?.[this.user.subscription.offer]?.price; this.durationExtension =
this.priceId = subscriptions?.[this.user.subscription.offer]?.priceId; subscriptionOffers?.[
this.user.subscription.offer
]?.durationExtension;
this.price =
subscriptionOffers?.[this.user.subscription.offer]?.price;
this.priceId =
subscriptionOffers?.[this.user.subscription.offer]?.priceId;
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
} }

8
apps/client/src/app/components/user-account-membership/user-account-membership.html

@ -34,6 +34,14 @@
&nbsp;<span i18n>per year</span> &nbsp;<span i18n>per year</span>
</div> </div>
} }
@if (durationExtension) {
<div class="mt-1 text-center">
<div class="badge badge-pill badge-warning px-2">
<strong>Limited Offer!</strong> Get
{{ durationExtension }} extra
</div>
</div>
}
} }
<div class="align-items-center d-flex justify-content-center mt-4"> <div class="align-items-center d-flex justify-content-center mt-4">
@if (!user?.subscription?.expiresAt) { @if (!user?.subscription?.expiresAt) {

23
apps/client/src/app/pages/pricing/pricing-page.component.ts

@ -53,12 +53,12 @@ export class PricingPageComponent implements OnDestroy, OnInit {
) {} ) {}
public ngOnInit() { public ngOnInit() {
const { baseCurrency, subscriptions } = this.dataService.fetchInfo(); const { baseCurrency, subscriptionOffers } = this.dataService.fetchInfo();
this.baseCurrency = baseCurrency; this.baseCurrency = baseCurrency;
this.coupon = subscriptions?.default?.coupon; this.coupon = subscriptionOffers?.default?.coupon;
this.durationExtension = subscriptions?.default?.durationExtension; this.durationExtension = subscriptionOffers?.default?.durationExtension;
this.price = subscriptions?.default?.price; this.price = subscriptionOffers?.default?.price;
this.userService.stateChanged this.userService.stateChanged
.pipe(takeUntil(this.unsubscribeSubject)) .pipe(takeUntil(this.unsubscribeSubject))
@ -71,13 +71,18 @@ export class PricingPageComponent implements OnDestroy, OnInit {
permissions.updateUserSettings permissions.updateUserSettings
); );
this.coupon = subscriptions?.[this.user?.subscription?.offer]?.coupon; this.coupon =
subscriptionOffers?.[this.user?.subscription?.offer]?.coupon;
this.couponId = this.couponId =
subscriptions?.[this.user.subscription.offer]?.couponId; subscriptionOffers?.[this.user.subscription.offer]?.couponId;
this.durationExtension = this.durationExtension =
subscriptions?.[this.user?.subscription?.offer]?.durationExtension; subscriptionOffers?.[
this.price = subscriptions?.[this.user?.subscription?.offer]?.price; this.user?.subscription?.offer
this.priceId = subscriptions?.[this.user.subscription.offer]?.priceId; ]?.durationExtension;
this.price =
subscriptionOffers?.[this.user?.subscription?.offer]?.price;
this.priceId =
subscriptionOffers?.[this.user.subscription.offer]?.priceId;
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
} }

4
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts

@ -35,9 +35,9 @@ export class GfProductPageComponent implements OnInit {
) {} ) {}
public ngOnInit() { public ngOnInit() {
const { subscriptions } = this.dataService.fetchInfo(); const { subscriptionOffers } = this.dataService.fetchInfo();
this.price = subscriptions?.default?.price; this.price = subscriptionOffers?.default?.price;
this.product1 = { this.product1 = {
founded: 2021, founded: 2021,

2
libs/common/src/lib/interfaces/info-item.interface.ts

@ -18,5 +18,5 @@ export interface InfoItem {
platforms: Platform[]; platforms: Platform[];
statistics: Statistics; statistics: Statistics;
stripePublicKey?: string; stripePublicKey?: string;
subscriptions: { [offer in SubscriptionOfferKey]: SubscriptionOffer }; subscriptionOffers: { [offer in SubscriptionOfferKey]: SubscriptionOffer };
} }

Loading…
Cancel
Save