Merge branch 'master' into hunicus/about-video
This commit is contained in:
commit
b1e7bbcc3e
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
<video style="width: 638px; height: 360px;" src="/resources/mempool-promo.mp4" poster="/resources/mempool-promo.jpg" controls loop playsinline [autoplay]="true" [muted]="true"></video>
|
<video style="width: 638px; height: 360px;" src="/resources/mempool-promo.mp4" poster="/resources/mempool-promo.jpg" controls loop playsinline [autoplay]="true" [muted]="true"></video>
|
||||||
|
|
||||||
<div class="enterprise-sponsor">
|
<div class="enterprise-sponsor" id="enterprise-sponsors">
|
||||||
<h3 i18n="about.sponsors.enterprise.withRocket">Enterprise Sponsors 🚀</h3>
|
<h3 i18n="about.sponsors.enterprise.withRocket">Enterprise Sponsors 🚀</h3>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<a href="https://spiral.xyz/" target="_blank" title="Spiral">
|
<a href="https://spiral.xyz/" target="_blank" title="Spiral">
|
||||||
@ -163,7 +163,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="community-sponsor">
|
<div class="community-sponsor" id="community-sponsors">
|
||||||
<h3 i18n="about.sponsors.withHeart">Community Sponsors ❤️</h3>
|
<h3 i18n="about.sponsors.withHeart">Community Sponsors ❤️</h3>
|
||||||
|
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
@ -177,7 +177,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="community-integrations-sponsor">
|
<div class="community-integrations-sponsor" id="community-integrations">
|
||||||
<h3 i18n="about.community-integrations">Community Integrations</h3>
|
<h3 i18n="about.community-integrations">Community Integrations</h3>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<a href="https://github.com/getumbrel/umbrel" target="_blank" title="Umbrel">
|
<a href="https://github.com/getumbrel/umbrel" target="_blank" title="Umbrel">
|
||||||
@ -271,7 +271,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="alliances">
|
<div class="alliances" id="community-alliances">
|
||||||
<h3 i18n="about.alliances">Community Alliances</h3>
|
<h3 i18n="about.alliances">Community Alliances</h3>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<a href="https://liquid.net/" title="Liquid Network">
|
<a href="https://liquid.net/" title="Liquid Network">
|
||||||
@ -287,7 +287,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ng-container *ngIf="translators$ | async | keyvalue as translators else loadingSponsors">
|
<ng-container *ngIf="translators$ | async | keyvalue as translators else loadingSponsors">
|
||||||
<div class="project-translators">
|
<div class="project-translators" id="project-translators">
|
||||||
<h3 i18n="about.translators">Project Translators</h3>
|
<h3 i18n="about.translators">Project Translators</h3>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<ng-template ngFor let-translator [ngForOf]="translators">
|
<ng-template ngFor let-translator [ngForOf]="translators">
|
||||||
@ -301,7 +301,7 @@
|
|||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container *ngIf="allContributors$ | async as contributors else loadingSponsors">
|
<ng-container *ngIf="allContributors$ | async as contributors else loadingSponsors">
|
||||||
<div class="contributors">
|
<div class="contributors" id="project-contributors">
|
||||||
<h3 i18n="about.contributors">Project Contributors</h3>
|
<h3 i18n="about.contributors">Project Contributors</h3>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<ng-template ngFor let-contributor [ngForOf]="contributors.regular">
|
<ng-template ngFor let-contributor [ngForOf]="contributors.regular">
|
||||||
@ -313,7 +313,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="maintainers" *ngIf="contributors.core.length">
|
<div class="maintainers" *ngIf="contributors.core.length" id="project-members">
|
||||||
<h3 i18n="about.project_members">Project Members</h3>
|
<h3 i18n="about.project_members">Project Members</h3>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<ng-template ngFor let-contributor [ngForOf]="contributors.core">
|
<ng-template ngFor let-contributor [ngForOf]="contributors.core">
|
||||||
@ -326,7 +326,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<div class="maintainers">
|
<div class="maintainers" id="project-maintainers">
|
||||||
<h3 i18n="about.maintainers">Project Maintainers</h3>
|
<h3 i18n="about.maintainers">Project Maintainers</h3>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<a href="https://twitter.com/softsimon_" target="_blank" title="softsimon">
|
<a href="https://twitter.com/softsimon_" target="_blank" title="softsimon">
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
.maintainers {
|
.maintainers {
|
||||||
margin-top: 68px;
|
margin-top: 68px;
|
||||||
margin-bottom: 68px;
|
margin-bottom: 68px;
|
||||||
|
scroll-margin: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.maintainers {
|
.maintainers {
|
||||||
@ -121,6 +122,7 @@
|
|||||||
.project-translators,
|
.project-translators,
|
||||||
.community-integrations-sponsor,
|
.community-integrations-sponsor,
|
||||||
.maintainers {
|
.maintainers {
|
||||||
|
scroll-margin: 30px;
|
||||||
.wrapper {
|
.wrapper {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
a {
|
a {
|
||||||
|
@ -5,9 +5,10 @@ import { StateService } from '../../services/state.service';
|
|||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
import { ApiService } from '../../services/api.service';
|
import { ApiService } from '../../services/api.service';
|
||||||
import { IBackendInfo } from '../../interfaces/websocket.interface';
|
import { IBackendInfo } from '../../interfaces/websocket.interface';
|
||||||
import { Router } from '@angular/router';
|
import { Router, ActivatedRoute } from '@angular/router';
|
||||||
import { map } from 'rxjs/operators';
|
import { map, tap } from 'rxjs/operators';
|
||||||
import { ITranslators } from '../../interfaces/node-api.interface';
|
import { ITranslators } from '../../interfaces/node-api.interface';
|
||||||
|
import { DOCUMENT } from '@angular/common';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-about',
|
selector: 'app-about',
|
||||||
@ -31,7 +32,9 @@ export class AboutComponent implements OnInit {
|
|||||||
public stateService: StateService,
|
public stateService: StateService,
|
||||||
private apiService: ApiService,
|
private apiService: ApiService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
|
private route: ActivatedRoute,
|
||||||
@Inject(LOCALE_ID) public locale: string,
|
@Inject(LOCALE_ID) public locale: string,
|
||||||
|
@Inject(DOCUMENT) private document: Document,
|
||||||
) { }
|
) { }
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@ -39,17 +42,21 @@ export class AboutComponent implements OnInit {
|
|||||||
this.seoService.setTitle($localize`:@@004b222ff9ef9dd4771b777950ca1d0e4cd4348a:About`);
|
this.seoService.setTitle($localize`:@@004b222ff9ef9dd4771b777950ca1d0e4cd4348a:About`);
|
||||||
this.websocketService.want(['blocks']);
|
this.websocketService.want(['blocks']);
|
||||||
|
|
||||||
this.sponsors$ = this.apiService.getDonation$();
|
this.sponsors$ = this.apiService.getDonation$()
|
||||||
|
.pipe(
|
||||||
|
tap(() => this.goToAnchor())
|
||||||
|
);
|
||||||
this.translators$ = this.apiService.getTranslators$()
|
this.translators$ = this.apiService.getTranslators$()
|
||||||
.pipe(
|
.pipe(
|
||||||
map((translators) => {
|
map((translators) => {
|
||||||
for (const t in translators) {
|
for (const t in translators) {
|
||||||
if (translators[t] === '') {
|
if (translators[t] === '') {
|
||||||
delete translators[t]
|
delete translators[t];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return translators;
|
return translators;
|
||||||
})
|
}),
|
||||||
|
tap(() => this.goToAnchor())
|
||||||
);
|
);
|
||||||
this.allContributors$ = this.apiService.getContributor$().pipe(
|
this.allContributors$ = this.apiService.getContributor$().pipe(
|
||||||
map((contributors) => {
|
map((contributors) => {
|
||||||
@ -57,9 +64,24 @@ export class AboutComponent implements OnInit {
|
|||||||
regular: contributors.filter((user) => !user.core_constributor),
|
regular: contributors.filter((user) => !user.core_constributor),
|
||||||
core: contributors.filter((user) => user.core_constributor),
|
core: contributors.filter((user) => user.core_constributor),
|
||||||
};
|
};
|
||||||
})
|
}),
|
||||||
|
tap(() => this.goToAnchor())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngAfterViewInit() {
|
||||||
|
this.goToAnchor();
|
||||||
|
}
|
||||||
|
|
||||||
|
goToAnchor() {
|
||||||
|
setTimeout(() => {
|
||||||
|
if (this.route.snapshot.fragment) {
|
||||||
|
if (this.document.getElementById(this.route.snapshot.fragment)) {
|
||||||
|
this.document.getElementById(this.route.snapshot.fragment).scrollIntoView({behavior: 'smooth'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
|
||||||
sponsor(): void {
|
sponsor(): void {
|
||||||
if (this.officialMempoolSpace && this.stateService.env.BASE_MODULE === 'mempool') {
|
if (this.officialMempoolSpace && this.stateService.env.BASE_MODULE === 'mempool') {
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
<div class="doc-content">
|
<div class="doc-content">
|
||||||
|
|
||||||
<p class="doc-welcome-note">Below is a reference for the {{ network.val === '' ? 'Bitcoin' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} <ng-container i18n="api-docs.title">REST API service</ng-container>.</p>
|
<p class="doc-welcome-note">Below is a reference for the {{ network.val === '' ? 'Bitcoin' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} <ng-container i18n="api-docs.title">REST API service</ng-container>.</p>
|
||||||
<p class="doc-welcome-note api-note" *ngIf="officialMempoolInstance">Note that we enforce rate limits. If you exceed these limits, you will get a polite error encouraging you to run your own Mempool instance. If you repeatedly exceed the limits, you may be banned from accessing the service altogether.</p>
|
<p class="doc-welcome-note api-note" *ngIf="officialMempoolInstance">Note that we enforce rate limits. If you exceed these limits, you will get an HTTP 429 error. If you repeatedly exceed the limits, you may be banned from accessing the service altogether. Consider an <a [routerLink]="['/enterprise']">enterprise sponsorship</a> if you need higher API limits.</p>
|
||||||
|
|
||||||
<div class="doc-item-container" *ngFor="let item of restDocs">
|
<div class="doc-item-container" *ngFor="let item of restDocs">
|
||||||
<h3 *ngIf="( item.type === 'category' ) && ( item.showConditions.indexOf(network.val) > -1 )">{{ item.title }}</h3>
|
<h3 *ngIf="( item.type === 'category' ) && ( item.showConditions.indexOf(network.val) > -1 )">{{ item.title }}</h3>
|
||||||
|
@ -161,28 +161,7 @@ export class NodesNetworksChartComponent implements OnInit {
|
|||||||
{
|
{
|
||||||
zlevel: 1,
|
zlevel: 1,
|
||||||
yAxisIndex: 0,
|
yAxisIndex: 0,
|
||||||
name: $localize`Reachable on Clearnet Only`,
|
name: $localize`Clearnet and Darknet`,
|
||||||
showSymbol: false,
|
|
||||||
symbol: 'none',
|
|
||||||
data: data.clearnet_nodes,
|
|
||||||
type: 'line',
|
|
||||||
lineStyle: {
|
|
||||||
width: 2,
|
|
||||||
},
|
|
||||||
areaStyle: {
|
|
||||||
opacity: 0.5,
|
|
||||||
},
|
|
||||||
stack: 'Total',
|
|
||||||
color: new graphic.LinearGradient(0, 0.75, 0, 1, [
|
|
||||||
{ offset: 0, color: '#FFB300' },
|
|
||||||
{ offset: 1, color: '#FFB300AA' },
|
|
||||||
]),
|
|
||||||
smooth: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
zlevel: 1,
|
|
||||||
yAxisIndex: 0,
|
|
||||||
name: $localize`Reachable on Clearnet and Darknet`,
|
|
||||||
showSymbol: false,
|
showSymbol: false,
|
||||||
symbol: 'none',
|
symbol: 'none',
|
||||||
data: data.clearnet_tor_nodes,
|
data: data.clearnet_tor_nodes,
|
||||||
@ -203,7 +182,28 @@ export class NodesNetworksChartComponent implements OnInit {
|
|||||||
{
|
{
|
||||||
zlevel: 1,
|
zlevel: 1,
|
||||||
yAxisIndex: 0,
|
yAxisIndex: 0,
|
||||||
name: $localize`Reachable on Darknet Only`,
|
name: $localize`Clearnet (IPv4, IPv6)`,
|
||||||
|
showSymbol: false,
|
||||||
|
symbol: 'none',
|
||||||
|
data: data.clearnet_nodes,
|
||||||
|
type: 'line',
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
},
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.5,
|
||||||
|
},
|
||||||
|
stack: 'Total',
|
||||||
|
color: new graphic.LinearGradient(0, 0.75, 0, 1, [
|
||||||
|
{ offset: 0, color: '#FFB300' },
|
||||||
|
{ offset: 1, color: '#FFB300AA' },
|
||||||
|
]),
|
||||||
|
smooth: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
zlevel: 1,
|
||||||
|
yAxisIndex: 0,
|
||||||
|
name: $localize`Darknet Only (Tor, I2P, cjdns)`,
|
||||||
showSymbol: false,
|
showSymbol: false,
|
||||||
symbol: 'none',
|
symbol: 'none',
|
||||||
data: data.tor_nodes,
|
data: data.tor_nodes,
|
||||||
@ -284,7 +284,7 @@ export class NodesNetworksChartComponent implements OnInit {
|
|||||||
padding: 10,
|
padding: 10,
|
||||||
data: [
|
data: [
|
||||||
{
|
{
|
||||||
name: $localize`Reachable on Darknet Only`,
|
name: $localize`Darknet Only (Tor, I2P, cjdns)`,
|
||||||
inactiveColor: 'rgb(110, 112, 121)',
|
inactiveColor: 'rgb(110, 112, 121)',
|
||||||
textStyle: {
|
textStyle: {
|
||||||
color: 'white',
|
color: 'white',
|
||||||
@ -292,7 +292,7 @@ export class NodesNetworksChartComponent implements OnInit {
|
|||||||
icon: 'roundRect',
|
icon: 'roundRect',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: $localize`Reachable on Clearnet and Darknet`,
|
name: $localize`Clearnet (IPv4, IPv6)`,
|
||||||
inactiveColor: 'rgb(110, 112, 121)',
|
inactiveColor: 'rgb(110, 112, 121)',
|
||||||
textStyle: {
|
textStyle: {
|
||||||
color: 'white',
|
color: 'white',
|
||||||
@ -300,7 +300,7 @@ export class NodesNetworksChartComponent implements OnInit {
|
|||||||
icon: 'roundRect',
|
icon: 'roundRect',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: $localize`Reachable on Clearnet Only`,
|
name: $localize`Clearnet and Darknet`,
|
||||||
inactiveColor: 'rgb(110, 112, 121)',
|
inactiveColor: 'rgb(110, 112, 121)',
|
||||||
textStyle: {
|
textStyle: {
|
||||||
color: 'white',
|
color: 'white',
|
||||||
@ -317,9 +317,9 @@ export class NodesNetworksChartComponent implements OnInit {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
selected: this.widget ? undefined : JSON.parse(this.storageService.getValue('nodes_networks_legend')) ?? {
|
selected: this.widget ? undefined : JSON.parse(this.storageService.getValue('nodes_networks_legend')) ?? {
|
||||||
'$localize`Reachable on Darknet Only`': true,
|
'$localize`Darknet Only (Tor, I2P, cjdns)`': true,
|
||||||
'$localize`Reachable on Clearnet Only`': true,
|
'$localize`Clearnet (IPv4, IPv6)`': true,
|
||||||
'$localize`Reachable on Clearnet and Darknet`': true,
|
'$localize`Clearnet and Darknet`': true,
|
||||||
'$localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`': true,
|
'$localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`': true,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user