From f27fb308975c793aa7b3072d56a064da5e18fae4 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 2 Nov 2024 13:31:22 +0100 Subject: [PATCH] Extend promotion system --- apps/api/src/app/info/info.service.ts | 8 +++---- apps/client/src/app/app.component.ts | 8 +++---- .../user-account-membership.component.ts | 19 +++++++++++---- .../user-account-membership.html | 8 +++++++ .../pages/pricing/pricing-page.component.ts | 23 +++++++++++-------- .../product-page.component.ts | 4 ++-- .../src/lib/interfaces/info-item.interface.ts | 2 +- 7 files changed, 47 insertions(+), 25 deletions(-) diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 5059e7170..f81ddd710 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -101,7 +101,7 @@ export class InfoService { isUserSignupEnabled, platforms, statistics, - subscriptions + subscriptionOffers ] = await Promise.all([ this.benchmarkService.getBenchmarkAssetProfiles(), this.getDemoAuthToken(), @@ -110,7 +110,7 @@ export class InfoService { orderBy: { name: 'asc' } }), this.getStatistics(), - this.getSubscriptions() + this.getSubscriptionOffers() ]); if (isUserSignupEnabled) { @@ -125,7 +125,7 @@ export class InfoService { isReadOnlyMode, platforms, statistics, - subscriptions, + subscriptionOffers, baseCurrency: DEFAULT_CURRENCY, currencies: this.exchangeRateDataService.getCurrencies() }; @@ -314,7 +314,7 @@ export class InfoService { return statistics; } - private async getSubscriptions(): Promise<{ + private async getSubscriptionOffers(): Promise<{ [offer in SubscriptionOfferKey]: SubscriptionOffer; }> { if (!this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 7e0958c23..86d4282a2 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -138,8 +138,8 @@ export class AppComponent implements OnDestroy, OnInit { ); this.hasPromotion = - !!this.info?.subscriptions?.default?.coupon || - !!this.info?.subscriptions?.default?.durationExtension; + !!this.info?.subscriptionOffers?.default?.coupon || + !!this.info?.subscriptionOffers?.default?.durationExtension; this.impersonationStorageService .onChangeHasImpersonation() @@ -237,10 +237,10 @@ export class AppComponent implements OnDestroy, OnInit { this.canCreateAccount || !!this.user?.systemMessage; this.hasPromotion = - !!this.info?.subscriptions?.[ + !!this.info?.subscriptionOffers?.[ this.user?.subscription?.offer ?? 'default' ]?.coupon || - !!this.info?.subscriptions?.[ + !!this.info?.subscriptionOffers?.[ this.user?.subscription?.offer ?? 'default' ]?.durationExtension; diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index 93bbe641c..bde555d8e 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -16,6 +16,7 @@ import { MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar'; +import { StringValue } from 'ms'; import { StripeService } from 'ngx-stripe'; import { EMPTY, Subject } from 'rxjs'; import { catchError, switchMap, takeUntil } from 'rxjs/operators'; @@ -31,6 +32,7 @@ export class UserAccountMembershipComponent implements OnDestroy { public coupon: number; public couponId: string; public defaultDateFormat: string; + public durationExtension: StringValue; public hasPermissionForSubscription: boolean; public hasPermissionToUpdateUserSettings: boolean; public price: number; @@ -51,7 +53,7 @@ export class UserAccountMembershipComponent implements OnDestroy { private stripeService: StripeService, private userService: UserService ) { - const { baseCurrency, globalPermissions, subscriptions } = + const { baseCurrency, globalPermissions, subscriptionOffers } = this.dataService.fetchInfo(); this.baseCurrency = baseCurrency; @@ -76,11 +78,18 @@ export class UserAccountMembershipComponent implements OnDestroy { permissions.updateUserSettings ); - this.coupon = subscriptions?.[this.user.subscription.offer]?.coupon; + this.coupon = + subscriptionOffers?.[this.user.subscription.offer]?.coupon; this.couponId = - subscriptions?.[this.user.subscription.offer]?.couponId; - this.price = subscriptions?.[this.user.subscription.offer]?.price; - this.priceId = subscriptions?.[this.user.subscription.offer]?.priceId; + subscriptionOffers?.[this.user.subscription.offer]?.couponId; + this.durationExtension = + 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(); } diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index d30ce7bdd..9bcf0faa2 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -34,6 +34,14 @@  per year } + @if (durationExtension) { +
+
+ Limited Offer! Get + {{ durationExtension }} extra +
+
+ } }
@if (!user?.subscription?.expiresAt) { diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 3a5e2052d..f86a75904 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -53,12 +53,12 @@ export class PricingPageComponent implements OnDestroy, OnInit { ) {} public ngOnInit() { - const { baseCurrency, subscriptions } = this.dataService.fetchInfo(); + const { baseCurrency, subscriptionOffers } = this.dataService.fetchInfo(); this.baseCurrency = baseCurrency; - this.coupon = subscriptions?.default?.coupon; - this.durationExtension = subscriptions?.default?.durationExtension; - this.price = subscriptions?.default?.price; + this.coupon = subscriptionOffers?.default?.coupon; + this.durationExtension = subscriptionOffers?.default?.durationExtension; + this.price = subscriptionOffers?.default?.price; this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) @@ -71,13 +71,18 @@ export class PricingPageComponent implements OnDestroy, OnInit { permissions.updateUserSettings ); - this.coupon = subscriptions?.[this.user?.subscription?.offer]?.coupon; + this.coupon = + subscriptionOffers?.[this.user?.subscription?.offer]?.coupon; this.couponId = - subscriptions?.[this.user.subscription.offer]?.couponId; + subscriptionOffers?.[this.user.subscription.offer]?.couponId; this.durationExtension = - subscriptions?.[this.user?.subscription?.offer]?.durationExtension; - this.price = subscriptions?.[this.user?.subscription?.offer]?.price; - 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(); } diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts index ea14bbc6b..39dbc4813 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -35,9 +35,9 @@ export class GfProductPageComponent implements OnInit { ) {} public ngOnInit() { - const { subscriptions } = this.dataService.fetchInfo(); + const { subscriptionOffers } = this.dataService.fetchInfo(); - this.price = subscriptions?.default?.price; + this.price = subscriptionOffers?.default?.price; this.product1 = { founded: 2021, diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts index 4c4d33444..bd3eb1f94 100644 --- a/libs/common/src/lib/interfaces/info-item.interface.ts +++ b/libs/common/src/lib/interfaces/info-item.interface.ts @@ -18,5 +18,5 @@ export interface InfoItem { platforms: Platform[]; statistics: Statistics; stripePublicKey?: string; - subscriptions: { [offer in SubscriptionOfferKey]: SubscriptionOffer }; + subscriptionOffers: { [offer in SubscriptionOfferKey]: SubscriptionOffer }; }