diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 19647a8b8..3c0a00dfd 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -304,18 +304,18 @@ export class InfoService { return statistics; } - private async getSubscriptions(): Promise { + private async getSubscriptions(): Promise<{ [offer: string]: Subscription }> { if (!this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { return undefined; } - let subscriptions: Subscription[] = []; + let subscriptions: { [offer: string]: Subscription } = {}; const stripeConfig = (await this.prismaService.property.findUnique({ where: { key: PROPERTY_STRIPE_CONFIG } })) ?? { value: '{}' }; - subscriptions = [JSON.parse(stripeConfig.value)]; + subscriptions = JSON.parse(stripeConfig.value); return subscriptions; } diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 71d12627b..5ff98e3fe 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -123,7 +123,9 @@ export class SubscriptionService { } } - public getSubscription(aSubscriptions: Subscription[]) { + public getSubscription( + aSubscriptions: Subscription[] + ): UserWithSettings['subscription'] { if (aSubscriptions.length > 0) { const latestSubscription = aSubscriptions.reduce((a, b) => { return new Date(a.expiresAt) > new Date(b.expiresAt) ? a : b; @@ -131,12 +133,14 @@ export class SubscriptionService { return { expiresAt: latestSubscription.expiresAt, + offer: 'renewal', type: isBefore(new Date(), latestSubscription.expiresAt) ? SubscriptionType.Premium : SubscriptionType.Basic }; } else { return { + offer: 'default', type: SubscriptionType.Basic }; } diff --git a/apps/client/src/app/pages/account/account-page.component.ts b/apps/client/src/app/pages/account/account-page.component.ts index 56e43c755..eacbe4c36 100644 --- a/apps/client/src/app/pages/account/account-page.component.ts +++ b/apps/client/src/app/pages/account/account-page.component.ts @@ -91,8 +91,6 @@ export class AccountPageComponent implements OnDestroy, OnInit { this.dataService.fetchInfo(); this.baseCurrency = baseCurrency; - this.coupon = subscriptions?.[0]?.coupon; - this.couponId = subscriptions?.[0]?.couponId; this.currencies = currencies; this.hasPermissionForSubscription = hasPermission( @@ -105,9 +103,6 @@ export class AccountPageComponent implements OnDestroy, OnInit { permissions.deleteAccess ); - this.price = subscriptions?.[0]?.price; - this.priceId = subscriptions?.[0]?.priceId; - this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { @@ -141,6 +136,12 @@ export class AccountPageComponent implements OnDestroy, OnInit { this.locales.push(this.user.settings.locale); this.locales = uniq(this.locales.sort()); + this.coupon = subscriptions?.[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; + this.changeDetectorRef.markForCheck(); } }); 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 98b365e4a..fb24b99f9 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -34,21 +34,24 @@ export class PricingPageComponent implements OnDestroy, OnInit { private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, private userService: UserService - ) { - const { baseCurrency, subscriptions } = this.dataService.fetchInfo(); + ) {} + public ngOnInit() { + const { baseCurrency, subscriptions } = this.dataService.fetchInfo(); this.baseCurrency = baseCurrency; - this.coupon = subscriptions?.[0]?.coupon; - this.price = subscriptions?.[0]?.price; - } - public ngOnInit() { + this.coupon = subscriptions?.default?.coupon; + this.price = subscriptions?.default?.price; + this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { if (state?.user) { this.user = state.user; + this.coupon = subscriptions?.[this.user?.subscription?.offer]?.coupon; + this.price = subscriptions?.[this.user?.subscription?.offer]?.price; + this.changeDetectorRef.markForCheck(); } }); diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts index bcb28402c..adba845f5 100644 --- a/libs/common/src/lib/interfaces/info-item.interface.ts +++ b/libs/common/src/lib/interfaces/info-item.interface.ts @@ -15,7 +15,7 @@ export interface InfoItem { platforms: { id: string; name: string }[]; statistics: Statistics; stripePublicKey?: string; - subscriptions: Subscription[]; + subscriptions: { [offer: string]: Subscription }; systemMessage?: string; tags: Tag[]; } diff --git a/libs/common/src/lib/interfaces/user-with-settings.ts b/libs/common/src/lib/interfaces/user-with-settings.ts index 80330d80c..fe0311a68 100644 --- a/libs/common/src/lib/interfaces/user-with-settings.ts +++ b/libs/common/src/lib/interfaces/user-with-settings.ts @@ -10,6 +10,7 @@ export type UserWithSettings = User & { Settings: Settings & { settings: UserSettings }; subscription?: { expiresAt?: Date; + offer: 'default' | 'renewal'; // TOOD: Extract type type: SubscriptionType; }; }; diff --git a/libs/common/src/lib/interfaces/user.interface.ts b/libs/common/src/lib/interfaces/user.interface.ts index 6effa3cf6..9f1d9b9e7 100644 --- a/libs/common/src/lib/interfaces/user.interface.ts +++ b/libs/common/src/lib/interfaces/user.interface.ts @@ -2,6 +2,7 @@ import { Account, Tag } from '@prisma/client'; import { UserSettings } from './user-settings.interface'; +// TODO: Compare with UserWithSettings export interface User { access: { alias?: string; @@ -13,6 +14,7 @@ export interface User { settings: UserSettings; subscription: { expiresAt?: Date; + offer: 'default' | 'renewal'; type: 'Basic' | 'Premium'; }; tags: Tag[];