Default frontend network setting
This commit is contained in:
parent
684ad9f0e6
commit
ce46aae8cc
@ -4,6 +4,7 @@
|
|||||||
"SIGNET_ENABLED": false,
|
"SIGNET_ENABLED": false,
|
||||||
"LIQUID_ENABLED": false,
|
"LIQUID_ENABLED": false,
|
||||||
"LIQUID_TESTNET_ENABLED": false,
|
"LIQUID_TESTNET_ENABLED": false,
|
||||||
|
"MAINNET_ENABLED": true,
|
||||||
"ITEMS_PER_PAGE": 10,
|
"ITEMS_PER_PAGE": 10,
|
||||||
"KEEP_BLOCKS_AMOUNT": 8,
|
"KEEP_BLOCKS_AMOUNT": 8,
|
||||||
"NGINX_PROTOCOL": "http",
|
"NGINX_PROTOCOL": "http",
|
||||||
@ -12,6 +13,7 @@
|
|||||||
"BLOCK_WEIGHT_UNITS": 4000000,
|
"BLOCK_WEIGHT_UNITS": 4000000,
|
||||||
"MEMPOOL_BLOCKS_AMOUNT": 8,
|
"MEMPOOL_BLOCKS_AMOUNT": 8,
|
||||||
"BASE_MODULE": "mempool",
|
"BASE_MODULE": "mempool",
|
||||||
|
"DEFAULT_NETWORK": "",
|
||||||
"MEMPOOL_WEBSITE_URL": "https://mempool.space",
|
"MEMPOOL_WEBSITE_URL": "https://mempool.space",
|
||||||
"LIQUID_WEBSITE_URL": "https://liquid.network",
|
"LIQUID_WEBSITE_URL": "https://liquid.network",
|
||||||
"MINING_DASHBOARD": true,
|
"MINING_DASHBOARD": true,
|
||||||
|
@ -67,7 +67,7 @@
|
|||||||
<app-svg-images class="d-flex justify-content-center align-items-center current-network-svg" [name]="network.val === '' ? 'bitcoin' : network.val" width="20" height="20" viewBox="0 0 65 65"></app-svg-images>
|
<app-svg-images class="d-flex justify-content-center align-items-center current-network-svg" [name]="network.val === '' ? 'bitcoin' : network.val" width="20" height="20" viewBox="0 0 65 65"></app-svg-images>
|
||||||
</button>
|
</button>
|
||||||
<div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}">
|
<div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}">
|
||||||
<a ngbDropdownItem class="mainnet" [routerLink]="networkPaths['mainnet'] || '/'"><app-svg-images name="bitcoin" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Mainnet</a>
|
<a ngbDropdownItem *ngIf="env.MAINNET_ENABLED" class="mainnet" [routerLink]="networkPaths['mainnet'] || '/'"><app-svg-images name="bitcoin" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Mainnet</a>
|
||||||
<a ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet" [class.active]="network.val === 'signet'" [routerLink]="networkPaths['signet'] || '/signet'"><app-svg-images name="signet" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Signet</a>
|
<a ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet" [class.active]="network.val === 'signet'" [routerLink]="networkPaths['signet'] || '/signet'"><app-svg-images name="signet" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Signet</a>
|
||||||
<a ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet" [class.active]="network.val === 'testnet'" [routerLink]="networkPaths['testnet'] || '/testnet'"><app-svg-images name="testnet" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Testnet3</a>
|
<a ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet" [class.active]="network.val === 'testnet'" [routerLink]="networkPaths['testnet'] || '/testnet'"><app-svg-images name="testnet" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Testnet3</a>
|
||||||
<a ngbDropdownItem *ngIf="env.TESTNET4_ENABLED" class="testnet4" [class.active]="network.val === 'testnet4'" [routerLink]="networkPaths['testnet4'] || '/testnet4'"><app-svg-images name="testnet4" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Testnet4 <span class="badge badge-pill badge-warning beta-network" i18n="beta">beta</span></a>
|
<a ngbDropdownItem *ngIf="env.TESTNET4_ENABLED" class="testnet4" [class.active]="network.val === 'testnet4'" [routerLink]="networkPaths['testnet4'] || '/testnet4'"><app-svg-images name="testnet4" width="22" height="22" viewBox="0 0 65 65" style="width: 25px; height: 25px;" class="mainnet mr-1"></app-svg-images> Testnet4 <span class="badge badge-pill badge-warning beta-network" i18n="beta">beta</span></a>
|
||||||
|
@ -29,7 +29,7 @@ export class ApiService {
|
|||||||
}
|
}
|
||||||
this.apiBasePath = ''; // assume mainnet by default
|
this.apiBasePath = ''; // assume mainnet by default
|
||||||
this.stateService.networkChanged$.subscribe((network) => {
|
this.stateService.networkChanged$.subscribe((network) => {
|
||||||
this.apiBasePath = network ? '/' + network : '';
|
this.apiBasePath = network && network !== this.stateService.env.DEFAULT_NETWORK ? '/' + network : '';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,32 +1,31 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Router, ActivatedRoute, NavigationEnd, ActivatedRouteSnapshot } from '@angular/router';
|
import { Router, NavigationEnd, ActivatedRouteSnapshot } from '@angular/router';
|
||||||
import { BehaviorSubject } from 'rxjs';
|
import { BehaviorSubject } from 'rxjs';
|
||||||
import { filter, map } from 'rxjs/operators';
|
import { filter, map } from 'rxjs/operators';
|
||||||
import { StateService } from './state.service';
|
import { StateService } from './state.service';
|
||||||
|
|
||||||
const networkModules = {
|
|
||||||
bitcoin: {
|
|
||||||
subnets: [
|
|
||||||
{ name: 'mainnet', path: '' },
|
|
||||||
{ name: 'testnet', path: '/testnet' },
|
|
||||||
{ name: 'testnet4', path: '/testnet4' },
|
|
||||||
{ name: 'signet', path: '/signet' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
liquid: {
|
|
||||||
subnets: [
|
|
||||||
{ name: 'liquid', path: '' },
|
|
||||||
{ name: 'liquidtestnet', path: '/testnet' },
|
|
||||||
],
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const networks = Object.keys(networkModules);
|
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
})
|
})
|
||||||
export class NavigationService {
|
export class NavigationService {
|
||||||
subnetPaths = new BehaviorSubject<Record<string,string>>({});
|
subnetPaths = new BehaviorSubject<Record<string,string>>({});
|
||||||
|
networkModules = {
|
||||||
|
bitcoin: {
|
||||||
|
subnets: [
|
||||||
|
{ name: 'mainnet', path: '' },
|
||||||
|
{ name: 'testnet', path: this.stateService.env.DEFAULT_NETWORK === 'testnet' ? '/' : '/testnet' },
|
||||||
|
{ name: 'testnet4', path: this.stateService.env.DEFAULT_NETWORK === 'testnet4' ? '/' : '/testnet4' },
|
||||||
|
{ name: 'signet', path: this.stateService.env.DEFAULT_NETWORK === 'signet' ? '/' : '/signet' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
liquid: {
|
||||||
|
subnets: [
|
||||||
|
{ name: 'liquid', path: '' },
|
||||||
|
{ name: 'liquidtestnet', path: '/testnet' },
|
||||||
|
],
|
||||||
|
}
|
||||||
|
};
|
||||||
|
networks = Object.keys(this.networkModules);
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private stateService: StateService,
|
private stateService: StateService,
|
||||||
@ -46,11 +45,11 @@ export class NavigationService {
|
|||||||
const networkPaths = {};
|
const networkPaths = {};
|
||||||
let route = root;
|
let route = root;
|
||||||
// traverse the router state tree until all network paths are set, or we reach the end of the tree
|
// traverse the router state tree until all network paths are set, or we reach the end of the tree
|
||||||
while (!networks.reduce((acc, network) => acc && !!networkPaths[network], true) && route) {
|
while (!this.networks.reduce((acc, network) => acc && !!networkPaths[network], true) && route) {
|
||||||
// 'networkSpecific' paths may correspond to valid routes on other networks, but aren't directly compatible
|
// 'networkSpecific' paths may correspond to valid routes on other networks, but aren't directly compatible
|
||||||
// (e.g. we shouldn't link a mainnet transaction page to the same txid on testnet or liquid)
|
// (e.g. we shouldn't link a mainnet transaction page to the same txid on testnet or liquid)
|
||||||
if (route.data?.networkSpecific) {
|
if (route.data?.networkSpecific) {
|
||||||
networks.forEach(network => {
|
this.networks.forEach(network => {
|
||||||
if (networkPaths[network] == null) {
|
if (networkPaths[network] == null) {
|
||||||
networkPaths[network] = path;
|
networkPaths[network] = path;
|
||||||
}
|
}
|
||||||
@ -59,7 +58,7 @@ export class NavigationService {
|
|||||||
// null or empty networks list is shorthand for "compatible with every network"
|
// null or empty networks list is shorthand for "compatible with every network"
|
||||||
if (route.data?.networks?.length) {
|
if (route.data?.networks?.length) {
|
||||||
// if the list is non-empty, only those networks are compatible
|
// if the list is non-empty, only those networks are compatible
|
||||||
networks.forEach(network => {
|
this.networks.forEach(network => {
|
||||||
if (!route.data.networks.includes(network)) {
|
if (!route.data.networks.includes(network)) {
|
||||||
if (networkPaths[network] == null) {
|
if (networkPaths[network] == null) {
|
||||||
networkPaths[network] = path;
|
networkPaths[network] = path;
|
||||||
@ -76,7 +75,7 @@ export class NavigationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const subnetPaths = {};
|
const subnetPaths = {};
|
||||||
Object.entries(networkModules).forEach(([key, network]) => {
|
Object.entries(this.networkModules).forEach(([key, network]) => {
|
||||||
network.subnets.forEach(subnet => {
|
network.subnets.forEach(subnet => {
|
||||||
subnetPaths[subnet.name] = subnet.path + (networkPaths[key] != null ? networkPaths[key] : path);
|
subnetPaths[subnet.name] = subnet.path + (networkPaths[key] != null ? networkPaths[key] : path);
|
||||||
});
|
});
|
||||||
|
@ -43,6 +43,7 @@ export interface Customization {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface Env {
|
export interface Env {
|
||||||
|
MAINNET_ENABLED: boolean;
|
||||||
TESTNET_ENABLED: boolean;
|
TESTNET_ENABLED: boolean;
|
||||||
TESTNET4_ENABLED: boolean;
|
TESTNET4_ENABLED: boolean;
|
||||||
SIGNET_ENABLED: boolean;
|
SIGNET_ENABLED: boolean;
|
||||||
@ -52,6 +53,7 @@ export interface Env {
|
|||||||
KEEP_BLOCKS_AMOUNT: number;
|
KEEP_BLOCKS_AMOUNT: number;
|
||||||
OFFICIAL_MEMPOOL_SPACE: boolean;
|
OFFICIAL_MEMPOOL_SPACE: boolean;
|
||||||
BASE_MODULE: string;
|
BASE_MODULE: string;
|
||||||
|
DEFAULT_NETWORK: string;
|
||||||
NGINX_PROTOCOL?: string;
|
NGINX_PROTOCOL?: string;
|
||||||
NGINX_HOSTNAME?: string;
|
NGINX_HOSTNAME?: string;
|
||||||
NGINX_PORT?: string;
|
NGINX_PORT?: string;
|
||||||
@ -77,12 +79,14 @@ export interface Env {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const defaultEnv: Env = {
|
const defaultEnv: Env = {
|
||||||
|
'MAINNET_ENABLED': true,
|
||||||
'TESTNET_ENABLED': false,
|
'TESTNET_ENABLED': false,
|
||||||
'TESTNET4_ENABLED': false,
|
'TESTNET4_ENABLED': false,
|
||||||
'SIGNET_ENABLED': false,
|
'SIGNET_ENABLED': false,
|
||||||
'LIQUID_ENABLED': false,
|
'LIQUID_ENABLED': false,
|
||||||
'LIQUID_TESTNET_ENABLED': false,
|
'LIQUID_TESTNET_ENABLED': false,
|
||||||
'BASE_MODULE': 'mempool',
|
'BASE_MODULE': 'mempool',
|
||||||
|
'DEFAULT_NETWORK': '',
|
||||||
'ITEMS_PER_PAGE': 10,
|
'ITEMS_PER_PAGE': 10,
|
||||||
'KEEP_BLOCKS_AMOUNT': 8,
|
'KEEP_BLOCKS_AMOUNT': 8,
|
||||||
'OFFICIAL_MEMPOOL_SPACE': false,
|
'OFFICIAL_MEMPOOL_SPACE': false,
|
||||||
@ -202,6 +206,8 @@ export class StateService {
|
|||||||
this.env.MINING_DASHBOARD = false;
|
this.env.MINING_DASHBOARD = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.network = this.env.DEFAULT_NETWORK;
|
||||||
|
|
||||||
if (this.isBrowser) {
|
if (this.isBrowser) {
|
||||||
this.setNetworkBasedonUrl(window.location.pathname);
|
this.setNetworkBasedonUrl(window.location.pathname);
|
||||||
this.setLightningBasedonUrl(window.location.pathname);
|
this.setLightningBasedonUrl(window.location.pathname);
|
||||||
@ -357,8 +363,8 @@ export class StateService {
|
|||||||
this.networkChanged$.next(this.env.BASE_MODULE);
|
this.networkChanged$.next(this.env.BASE_MODULE);
|
||||||
}
|
}
|
||||||
} else if (this.network !== '') {
|
} else if (this.network !== '') {
|
||||||
this.network = '';
|
this.network = this.env.DEFAULT_NETWORK;
|
||||||
this.networkChanged$.next('');
|
this.networkChanged$.next(this.env.DEFAULT_NETWORK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ export class WebsocketService {
|
|||||||
.pipe(take(1))
|
.pipe(take(1))
|
||||||
.subscribe((response) => this.handleResponse(response));
|
.subscribe((response) => this.handleResponse(response));
|
||||||
} else {
|
} else {
|
||||||
this.network = this.stateService.network;
|
this.network = this.stateService.network === this.stateService.env.DEFAULT_NETWORK ? '' : this.stateService.network;
|
||||||
this.websocketSubject = webSocket<WebsocketResponse>(this.webSocketUrl.replace('{network}', this.network ? '/' + this.network : ''));
|
this.websocketSubject = webSocket<WebsocketResponse>(this.webSocketUrl.replace('{network}', this.network ? '/' + this.network : ''));
|
||||||
|
|
||||||
const { response: theInitData } = this.transferState.get<any>(initData, null) || {};
|
const { response: theInitData } = this.transferState.get<any>(initData, null) || {};
|
||||||
@ -75,7 +75,7 @@ export class WebsocketService {
|
|||||||
if (network === this.network) {
|
if (network === this.network) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.network = network;
|
this.network = network === this.stateService.env.DEFAULT_NETWORK ? '' : network;
|
||||||
clearTimeout(this.onlineCheckTimeout);
|
clearTimeout(this.onlineCheckTimeout);
|
||||||
clearTimeout(this.onlineCheckTimeoutTwo);
|
clearTimeout(this.onlineCheckTimeoutTwo);
|
||||||
|
|
||||||
|
@ -12,7 +12,9 @@ export class RelativeUrlPipe implements PipeTransform {
|
|||||||
|
|
||||||
transform(value: string, swapNetwork?: string): string {
|
transform(value: string, swapNetwork?: string): string {
|
||||||
let network = swapNetwork || this.stateService.network;
|
let network = swapNetwork || this.stateService.network;
|
||||||
if (network === 'mainnet') network = '';
|
if (network === 'mainnet' || network === this.stateService.env.DEFAULT_NETWORK) {
|
||||||
|
network = '';
|
||||||
|
}
|
||||||
if (this.stateService.env.BASE_MODULE === 'liquid' && network === 'liquidtestnet') {
|
if (this.stateService.env.BASE_MODULE === 'liquid' && network === 'liquidtestnet') {
|
||||||
network = 'testnet';
|
network = 'testnet';
|
||||||
} else if (this.stateService.env.BASE_MODULE !== 'mempool') {
|
} else if (this.stateService.env.BASE_MODULE !== 'mempool') {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user