From 74b51fe1ddc666a8ee9711152e1bc446a3be9bee Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 15 Jun 2025 09:04:18 +0200 Subject: [PATCH] Feature/refactor public routes: pricing (#4931) * Refactor public routes: pricing --- apps/client/src/app/app-routing.module.ts | 2 +- apps/client/src/app/app.component.ts | 4 ++-- .../components/admin-settings/admin-settings.component.ts | 4 ++-- apps/client/src/app/components/header/header.component.ts | 4 ++-- .../subscription-interstitial-dialog.component.ts | 4 ++-- .../user-account-membership.component.ts | 4 ++-- apps/client/src/app/core/auth.guard.ts | 2 +- apps/client/src/app/core/http-response.interceptor.ts | 4 ++-- .../07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts | 4 ++-- .../07/hello-ghostfolio/hello-ghostfolio-page.component.ts | 4 ++-- .../first-months-in-open-source-page.component.ts | 4 ++-- .../500-stars-on-github-page.component.ts | 4 ++-- .../black-friday-2022/black-friday-2022-page.component.ts | 2 +- .../1000-stars-on-github-page.component.ts | 2 +- .../11/black-week-2023/black-week-2023-page.component.ts | 2 +- .../11/black-weeks-2024/black-weeks-2024-page.component.ts | 2 +- .../app/pages/faq/overview/faq-overview-page.component.ts | 4 ++-- apps/client/src/app/pages/faq/saas/saas-page.component.ts | 2 +- .../pages/faq/self-hosting/self-hosting-page.component.ts | 4 ++-- libs/common/src/lib/routes/routes.ts | 6 +++++- .../ui/src/lib/membership-card/membership-card.component.ts | 4 ++-- .../lib/premium-indicator/premium-indicator.component.ts | 4 ++-- 22 files changed, 40 insertions(+), 36 deletions(-) diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 623ea74d2..c495a685d 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -111,7 +111,7 @@ const routes: Routes = [ ) }, { - path: ghostfolioRoutes.pricing, + path: publicRoutes.pricing.path, loadChildren: () => import('./pages/pricing/pricing-page.module').then( (m) => m.PricingPageModule diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 0200eeb0e..6573d1733 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -83,7 +83,7 @@ export class AppComponent implements OnDestroy, OnInit { public routerLinkFeatures = publicRoutes.features.routerLink; public routerLinkMarkets = ['/' + routes.markets]; public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkResources = ['/' + routes.resources]; public showFooter = false; @@ -216,7 +216,7 @@ export class AppComponent implements OnDestroy, OnInit { this.currentRoute === routes.markets || this.currentRoute === publicRoutes.openStartup.path || this.currentRoute === routes.public || - this.currentRoute === routes.pricing || + this.currentRoute === publicRoutes.pricing.path || this.currentRoute === publicRoutes.register.path || this.currentRoute === routes.start) && this.deviceType !== 'mobile'; diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index 155791d1b..8911fb818 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -10,7 +10,7 @@ import { DataProviderInfo, User } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectionStrategy, @@ -72,7 +72,7 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { const languageCode = this.user.settings.language; - this.pricingUrl = `https://ghostfol.io/${languageCode}/${routes.pricing}`; + this.pricingUrl = `https://ghostfol.io/${languageCode}/${publicRoutes.pricing.path}`; this.changeDetectorRef.markForCheck(); } diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 73e843cc5..71d902139 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -88,7 +88,7 @@ export class HeaderComponent implements OnChanges { public routeAbout = routes.about; public routeFeatures = publicRoutes.features.path; public routeMarkets = routes.markets; - public routePricing = routes.pricing; + public routePricing = publicRoutes.pricing.path; public routeResources = routes.resources; public routerLinkAbout = ['/' + routes.about]; public routerLinkAccount = internalRoutes.account.routerLink; @@ -97,7 +97,7 @@ export class HeaderComponent implements OnChanges { public routerLinkFeatures = publicRoutes.features.routerLink; public routerLinkMarkets = ['/' + routes.markets]; public routerLinkPortfolio = internalRoutes.portfolio.routerLink; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkResources = ['/' + routes.resources]; public routes = routes; diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts index 70d4b9ed7..5d2df3797 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectionStrategy, @@ -28,7 +28,7 @@ export class SubscriptionInterstitialDialog implements OnInit { public remainingSkipButtonDelay = SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; public variantIndex: number; private unsubscribeSubject = new Subject(); 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 a8ca4eead..68c8b649f 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 @@ -5,7 +5,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectionStrategy, @@ -37,7 +37,7 @@ export class UserAccountMembershipComponent implements OnDestroy { public hasPermissionToUpdateUserSettings: boolean; public price: number; public priceId: string; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; public trySubscriptionMail = 'mailto:hi@ghostfol.io?Subject=Ghostfolio Premium Trial&body=Hello%0D%0DI am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?%0D%0DKind regards'; public user: User; diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index a16fa3d75..42a17b6b2 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -26,7 +26,7 @@ export class AuthGuard { `/${publicRoutes.features.path}`, `/${routes.markets}`, `/${publicRoutes.openStartup.path}`, - `/${routes.pricing}`, + `/${publicRoutes.pricing.path}`, `/${routes.public}`, `/${publicRoutes.register.path}`, `/${routes.resources}` diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 97b0ab3a3..8fdc21e0d 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { HTTP_INTERCEPTORS, @@ -75,7 +75,7 @@ export class HttpResponseInterceptor implements HttpInterceptor { }); this.snackBarRef.onAction().subscribe(() => { - this.router.navigate(['/' + routes.pricing]); + this.router.navigate(publicRoutes.pricing.routerLink); }); } } else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) { diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts index 1227f5b01..f783ed66a 100644 --- a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -12,6 +12,6 @@ import { RouterModule } from '@angular/router'; }) export class HalloGhostfolioPageComponent { public routerLinkBlog = ['/' + routes.blog]; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkResources = ['/' + routes.resources]; } diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts index a8b333dd5..1ea285987 100644 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -12,6 +12,6 @@ import { RouterModule } from '@angular/router'; }) export class HelloGhostfolioPageComponent { public routerLinkBlog = ['/' + routes.blog]; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; public routerLinkResources = ['/' + routes.resources]; } diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts index ef6b719f4..c7bbdcbd7 100644 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -12,5 +12,5 @@ import { RouterModule } from '@angular/router'; }) export class FirstMonthsInOpenSourcePageComponent { public routerLinkBlog = ['/' + routes.blog]; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; } diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts index 9d255f791..a2f09583d 100644 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -13,5 +13,5 @@ import { RouterModule } from '@angular/router'; export class FiveHundredStarsOnGitHubPageComponent { public routerLinkBlog = ['/' + routes.blog]; public routerLinkMarkets = ['/' + routes.markets]; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; } diff --git a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts index fa74d22d0..eeac363be 100644 --- a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts @@ -14,5 +14,5 @@ import { RouterModule } from '@angular/router'; export class BlackFriday2022PageComponent { public routerLinkBlog = ['/' + routes.blog]; public routerLinkFeatures = publicRoutes.features.routerLink; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; } diff --git a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts index 6d0b2e3a9..acb4dd349 100644 --- a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts @@ -13,5 +13,5 @@ import { RouterModule } from '@angular/router'; export class ThousandStarsOnGitHubPageComponent { public routerLinkBlog = ['/' + routes.blog]; public routerLinkFeatures = publicRoutes.features.routerLink; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; } diff --git a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts index 6cb557c83..6936b6765 100644 --- a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts @@ -14,5 +14,5 @@ import { RouterModule } from '@angular/router'; export class BlackWeek2023PageComponent { public routerLinkBlog = ['/' + routes.blog]; public routerLinkFeatures = publicRoutes.features.routerLink; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; } diff --git a/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts b/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts index 656a56ca8..02c863fb0 100644 --- a/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts +++ b/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts @@ -14,5 +14,5 @@ import { RouterModule } from '@angular/router'; export class BlackWeeks2024PageComponent { public routerLinkBlog = ['/' + routes.blog]; public routerLinkFeatures = publicRoutes.features.routerLink; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; } diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts index 1b27a29a8..9b7bbf180 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; @@ -13,7 +13,7 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class FaqOverviewPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`; public routerLinkFeatures = publicRoutes.features.routerLink; public user: User; diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts index 00bd45716..20c16ffff 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts @@ -17,7 +17,7 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class SaasPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`; public routerLinkAccount = internalRoutes.account.routerLink; public routerLinkAccountMembership = [ '/' + internalRoutes.account.path, diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts index 27f14f116..3e6e25655 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @@ -11,7 +11,7 @@ import { Subject } from 'rxjs'; standalone: false }) export class SelfHostingPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`; private unsubscribeSubject = new Subject(); diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts index 97682e150..96a66e462 100644 --- a/libs/common/src/lib/routes/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -31,7 +31,6 @@ export const routes = { license: $localize`:kebab-case:license`, markets: $localize`:kebab-case:markets`, openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, - pricing: $localize`:kebab-case:pricing`, privacyPolicy: $localize`:kebab-case:privacy-policy`, resources: $localize`:kebab-case:resources`, selfHosting: $localize`:kebab-case:self-hosting`, @@ -141,6 +140,11 @@ export const publicRoutes = { routerLink: ['/open'], title: 'Open Startup' }, + pricing: { + path: $localize`:kebab-case:pricing`, + routerLink: ['/' + $localize`:kebab-case:pricing`], + title: $localize`Pricing` + }, register: { path: $localize`:kebab-case:register`, routerLink: ['/' + $localize`:kebab-case:register`], diff --git a/libs/ui/src/lib/membership-card/membership-card.component.ts b/libs/ui/src/lib/membership-card/membership-card.component.ts index 695fb18e4..483c19d41 100644 --- a/libs/ui/src/lib/membership-card/membership-card.component.ts +++ b/libs/ui/src/lib/membership-card/membership-card.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { CommonModule } from '@angular/common'; import { @@ -29,7 +29,7 @@ export class GfMembershipCardComponent { @Output() generateApiKeyClicked = new EventEmitter(); - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; public onGenerateApiKey(event: MouseEvent) { event.preventDefault(); diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts index 4434e4fbc..7c97be921 100644 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts +++ b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { CommonModule } from '@angular/common'; import { @@ -20,5 +20,5 @@ import { RouterModule } from '@angular/router'; export class GfPremiumIndicatorComponent { @Input() enableLink = true; - public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkPricing = publicRoutes.pricing.routerLink; }