Changelog
diff --git a/apps/client/src/app/pages/about/about-page.scss b/apps/client/src/app/pages/about/about-page.scss
index d1c1565e0..fe52dfce1 100644
--- a/apps/client/src/app/pages/about/about-page.scss
+++ b/apps/client/src/app/pages/about/about-page.scss
@@ -7,10 +7,6 @@
}
.mat-card {
- &.active {
- border-color: rgba(var(--palette-primary-500), 1);
- }
-
&.changelog {
::ng-deep {
markdown {
diff --git a/apps/client/src/app/pages/pricing/pricing-page-routing.module.ts b/apps/client/src/app/pages/pricing/pricing-page-routing.module.ts
new file mode 100644
index 000000000..bc40ef275
--- /dev/null
+++ b/apps/client/src/app/pages/pricing/pricing-page-routing.module.ts
@@ -0,0 +1,12 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { PricingPageComponent } from './pricing-page.component';
+
+const routes: Routes = [{ path: '', component: PricingPageComponent }];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule]
+})
+export class PricingPageRoutingModule {}
diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts
new file mode 100644
index 000000000..ee467b5ef
--- /dev/null
+++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts
@@ -0,0 +1,53 @@
+import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
+import { baseCurrency } from '@ghostfolio/helper';
+import { Subject } from 'rxjs';
+import { User } from '@ghostfolio/api/app/user/interfaces/user.interface';
+import { takeUntil } from 'rxjs/operators';
+import { DataService } from '@ghostfolio/client/services/data.service';
+import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
+
+@Component({
+ selector: 'gf-pricing-page',
+ templateUrl: './pricing-page.html',
+ styleUrls: ['./pricing-page.scss']
+})
+export class PricingPageComponent implements OnInit {
+ public baseCurrency = baseCurrency;
+ public isLoggedIn: boolean;
+ public user: User;
+
+ private unsubscribeSubject = new Subject
();
+
+ /**
+ * @constructor
+ */
+ public constructor(
+ private cd: ChangeDetectorRef,
+ private dataService: DataService,
+ private tokenStorageService: TokenStorageService
+ ) {}
+
+ /**
+ * Initializes the controller
+ */
+ public ngOnInit() {
+ this.isLoggedIn = !!this.tokenStorageService.getToken();
+
+ if (this.isLoggedIn)
+ this.tokenStorageService
+ .onChangeHasToken()
+ .pipe(takeUntil(this.unsubscribeSubject))
+ .subscribe(() => {
+ this.dataService.fetchUser().subscribe((user) => {
+ this.user = user;
+
+ this.cd.markForCheck();
+ });
+ });
+ }
+
+ public ngOnDestroy() {
+ this.unsubscribeSubject.next();
+ this.unsubscribeSubject.complete();
+ }
+}
diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html
new file mode 100644
index 000000000..2e580c61a
--- /dev/null
+++ b/apps/client/src/app/pages/pricing/pricing-page.html
@@ -0,0 +1,102 @@
+
+
+
+
Pricing Plans
+
+
+
+ Open Source
+ Host your Ghostfolio instance by yourself.
+
+ -
+
+ Portfolio Performance
+
+ -
+
+ Portfolio Summary
+
+ -
+
+ Unlimited Transactions
+
+ -
+
+ Advanced Insights
+
+
+
+ Free
+
+
+
+
+
+
+ Diamond
+
+
+
+ Get a fully managed Ghostfolio cloud offering.
+
+
+ -
+
+ Portfolio Performance
+
+ -
+
+ Portfolio Summary
+
+ -
+
+ Unlimited Transactions
+
+ -
+
+ Advanced Insights
+
+
+
+ {{ user?.settings.baseCurrency || baseCurrency }}
+ 2.99
+ 3.99 / Month
+
+
+
+
+
+
+
diff --git a/apps/client/src/app/pages/pricing/pricing-page.module.ts b/apps/client/src/app/pages/pricing/pricing-page.module.ts
new file mode 100644
index 000000000..810d9c0bf
--- /dev/null
+++ b/apps/client/src/app/pages/pricing/pricing-page.module.ts
@@ -0,0 +1,15 @@
+import { CommonModule } from '@angular/common';
+import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
+import { MatCardModule } from '@angular/material/card';
+
+import { PricingPageRoutingModule } from './pricing-page-routing.module';
+import { PricingPageComponent } from './pricing-page.component';
+
+@NgModule({
+ declarations: [PricingPageComponent],
+ exports: [],
+ imports: [CommonModule, MatCardModule, PricingPageRoutingModule],
+ providers: [],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+})
+export class PricingPageModule {}
diff --git a/apps/client/src/app/pages/pricing/pricing-page.scss b/apps/client/src/app/pages/pricing/pricing-page.scss
new file mode 100644
index 000000000..23f5657f2
--- /dev/null
+++ b/apps/client/src/app/pages/pricing/pricing-page.scss
@@ -0,0 +1,14 @@
+:host {
+ color: rgb(var(--dark-primary-text));
+ display: block;
+
+ .mat-card {
+ &.active {
+ border-color: rgba(var(--palette-primary-500), 1);
+ }
+ }
+}
+
+:host-context(.is-dark-theme) {
+ color: rgb(var(--light-primary-text));
+}