diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts
index 7a9b53ed0..c7982b75f 100644
--- a/frontend/src/app/app-routing.module.ts
+++ b/frontend/src/app/app-routing.module.ts
@@ -22,6 +22,7 @@ import { AssetsFeaturedComponent } from './components/assets/assets-featured/ass
import { AssetsComponent } from './components/assets/assets.component';
import { AssetComponent } from './components/asset/asset.component';
import { AssetsNavComponent } from './components/assets/assets-nav/assets-nav.component';
+import { CalculatorComponent } from './components/calculator/calculator.component';
const browserWindow = window || {};
// @ts-ignore
@@ -278,6 +279,10 @@ let routes: Routes = [
path: 'rbf',
component: RbfList,
},
+ {
+ path: 'calculator',
+ component: CalculatorComponent
+ },
{
path: 'terms-of-service',
component: TermsOfServiceComponent
diff --git a/frontend/src/app/components/calculator/calculator.component.html b/frontend/src/app/components/calculator/calculator.component.html
new file mode 100644
index 000000000..62026566f
--- /dev/null
+++ b/frontend/src/app/components/calculator/calculator.component.html
@@ -0,0 +1,44 @@
+
+
+
Calculator
+
+
+
+
+
+
+ Waiting for price feed...
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/app/components/calculator/calculator.component.scss b/frontend/src/app/components/calculator/calculator.component.scss
new file mode 100644
index 000000000..bc3ca2665
--- /dev/null
+++ b/frontend/src/app/components/calculator/calculator.component.scss
@@ -0,0 +1,3 @@
+.input-group-text {
+ width: 75px;
+}
diff --git a/frontend/src/app/components/calculator/calculator.component.ts b/frontend/src/app/components/calculator/calculator.component.ts
new file mode 100644
index 000000000..f857bbd8c
--- /dev/null
+++ b/frontend/src/app/components/calculator/calculator.component.ts
@@ -0,0 +1,85 @@
+import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
+import { FormBuilder, FormGroup } from '@angular/forms';
+import { combineLatest, Observable } from 'rxjs';
+import { map, switchMap } from 'rxjs/operators';
+import { Price, PriceService } from '../../services/price.service';
+import { StateService } from '../../services/state.service';
+import { WebsocketService } from '../../services/websocket.service';
+
+@Component({
+ selector: 'app-calculator',
+ templateUrl: './calculator.component.html',
+ styleUrls: ['./calculator.component.scss'],
+ changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class CalculatorComponent implements OnInit {
+ satoshis = 10000;
+ form: FormGroup;
+
+ currency: string;
+ currency$ = this.stateService.fiatCurrency$;
+ mainSubscription$: Observable;
+ price$: Observable;
+
+ constructor(
+ private priceService: PriceService,
+ private stateService: StateService,
+ private formBuilder: FormBuilder,
+ private websocketService: WebsocketService,
+ ) { }
+
+ ngOnInit(): void {
+ this.form = this.formBuilder.group({
+ fiat: [0],
+ bitcoin: [0],
+ satoshis: [0],
+ });
+
+ this.price$ = this.currency$.pipe(
+ switchMap((currency) => {
+ this.currency = currency;
+ return this.stateService.conversions$.asObservable();
+ }),
+ map((conversions) => {
+ return conversions[this.currency];
+ })
+ );
+
+ combineLatest([
+ this.price$,
+ this.form.get('fiat').valueChanges
+ ]).subscribe(([price, value]) => {
+ value = parseFloat(value.replace(',', '.'));
+ value = value || 0;
+ const rate = (value / price).toFixed(8);
+ const satsRate = Math.round(value / price * 100_000_000);
+ this.form.get('bitcoin').setValue(rate, { emitEvent: false });
+ this.form.get('satoshis').setValue(satsRate, { emitEvent: false } );
+ });
+
+ combineLatest([
+ this.price$,
+ this.form.get('bitcoin').valueChanges
+ ]).subscribe(([price, value]) => {
+ value = parseFloat(value.replace(',', '.'));
+ value = value || 0;
+ const rate = parseFloat((value * price).toFixed(8));
+ this.form.get('fiat').setValue(rate, { emitEvent: false } );
+ this.form.get('satoshis').setValue(Math.round(value * 100_000_000), { emitEvent: false } );
+ });
+
+ combineLatest([
+ this.price$,
+ this.form.get('satoshis').valueChanges
+ ]).subscribe(([price, value]) => {
+ value = parseFloat(value.replace(',', '.'));
+ value = value || 0;
+ const rate = parseFloat((value / 100_000_000 * price).toFixed(8));
+ const bitcoinRate = (value / 100_000_000).toFixed(8);
+ this.form.get('fiat').setValue(rate, { emitEvent: false } );
+ this.form.get('bitcoin').setValue(bitcoinRate, { emitEvent: false });
+ });
+
+ }
+
+}
diff --git a/frontend/src/app/components/svg-images/svg-images.component.html b/frontend/src/app/components/svg-images/svg-images.component.html
index c4d5296bd..1c3a8bc2d 100644
--- a/frontend/src/app/components/svg-images/svg-images.component.html
+++ b/frontend/src/app/components/svg-images/svg-images.component.html
@@ -74,6 +74,9 @@
+
+
+
diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts
index 9cf780116..4a114faa7 100644
--- a/frontend/src/app/shared/shared.module.ts
+++ b/frontend/src/app/shared/shared.module.ts
@@ -97,6 +97,7 @@ import { MempoolBlockOverviewComponent } from '../components/mempool-block-overv
import { ClockchainComponent } from '../components/clockchain/clockchain.component';
import { ClockFaceComponent } from '../components/clock-face/clock-face.component';
import { ClockComponent } from '../components/clock/clock.component';
+import { CalculatorComponent } from '../components/calculator/calculator.component';
import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-directives/weight-directives';
@@ -185,12 +186,11 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir
GeolocationComponent,
TestnetAlertComponent,
GlobalFooterComponent,
-
+ CalculatorComponent,
MempoolBlockOverviewComponent,
ClockchainComponent,
ClockComponent,
ClockFaceComponent,
-
OnlyVsizeDirective,
OnlyWeightDirective
],