mirror of
https://github.com/mempool/mempool.git
synced 2025-03-26 17:51:45 +01:00
Add mining pools to search bar
This commit is contained in:
parent
9186f664da
commit
7761ea53c6
@ -22,6 +22,7 @@ export class SearchFormComponent implements OnInit {
|
||||
env: Env;
|
||||
network = '';
|
||||
assets: object = {};
|
||||
pools: object[] = [];
|
||||
isSearching = false;
|
||||
isTypeaheading$ = new BehaviorSubject<boolean>(false);
|
||||
typeAhead$: Observable<any>;
|
||||
@ -118,7 +119,8 @@ export class SearchFormComponent implements OnInit {
|
||||
if (!text.length) {
|
||||
return of([
|
||||
[],
|
||||
{ nodes: [], channels: [] }
|
||||
{ nodes: [], channels: [] },
|
||||
this.pools
|
||||
]);
|
||||
}
|
||||
this.isTypeaheading$.next(true);
|
||||
@ -126,6 +128,7 @@ export class SearchFormComponent implements OnInit {
|
||||
return zip(
|
||||
this.electrsApiService.getAddressesByPrefix$(text).pipe(catchError(() => of([]))),
|
||||
[{ nodes: [], channels: [] }],
|
||||
this.getMiningPools()
|
||||
);
|
||||
}
|
||||
return zip(
|
||||
@ -134,6 +137,7 @@ export class SearchFormComponent implements OnInit {
|
||||
nodes: [],
|
||||
channels: [],
|
||||
}))),
|
||||
this.getMiningPools()
|
||||
);
|
||||
}),
|
||||
map((result: any[]) => {
|
||||
@ -153,11 +157,14 @@ export class SearchFormComponent implements OnInit {
|
||||
{
|
||||
nodes: [],
|
||||
channels: [],
|
||||
}
|
||||
},
|
||||
this.pools
|
||||
]))
|
||||
]
|
||||
).pipe(
|
||||
map((latestData) => {
|
||||
this.pools = latestData[1][2] || [];
|
||||
|
||||
let searchText = latestData[0];
|
||||
if (!searchText.length) {
|
||||
return {
|
||||
@ -171,6 +178,7 @@ export class SearchFormComponent implements OnInit {
|
||||
nodes: [],
|
||||
channels: [],
|
||||
liquidAsset: [],
|
||||
pools: []
|
||||
};
|
||||
}
|
||||
|
||||
@ -189,6 +197,7 @@ export class SearchFormComponent implements OnInit {
|
||||
const matchesAddress = !matchesTxId && this.regexAddress.test(searchText);
|
||||
const otherNetworks = findOtherNetworks(searchText, this.network as any || 'mainnet', this.env);
|
||||
const liquidAsset = this.assets ? (this.assets[searchText] || []) : [];
|
||||
const pools = this.pools.filter(pool => pool["name"].toLowerCase().startsWith(searchText.toLowerCase())).slice(0, 10);
|
||||
|
||||
if (matchesDateTime && searchText.indexOf('/') !== -1) {
|
||||
searchText = searchText.replace(/\//g, '-');
|
||||
@ -208,6 +217,7 @@ export class SearchFormComponent implements OnInit {
|
||||
nodes: lightningResults.nodes,
|
||||
channels: lightningResults.channels,
|
||||
liquidAsset: liquidAsset,
|
||||
pools: pools
|
||||
};
|
||||
})
|
||||
);
|
||||
@ -239,6 +249,8 @@ export class SearchFormComponent implements OnInit {
|
||||
});
|
||||
this.isSearching = false;
|
||||
}
|
||||
} else if (result.slug) {
|
||||
this.navigate('/mining/pool/', result.slug);
|
||||
}
|
||||
}
|
||||
|
||||
@ -304,4 +316,29 @@ export class SearchFormComponent implements OnInit {
|
||||
this.isSearching = false;
|
||||
}
|
||||
}
|
||||
|
||||
getMiningPools(): Observable<any> {
|
||||
return this.pools.length ? of(this.pools) : combineLatest([
|
||||
this.apiService.listPools$(undefined),
|
||||
this.apiService.listPools$('1y')
|
||||
]).pipe(
|
||||
map(([poolsResponse, activePoolsResponse]) => {
|
||||
const activePoolSlugs = new Set(activePoolsResponse.body.pools.map(pool => pool.slug));
|
||||
|
||||
return poolsResponse.body.map(pool => ({
|
||||
name: pool.name,
|
||||
slug: pool.slug,
|
||||
active: activePoolSlugs.has(pool.slug)
|
||||
}))
|
||||
// Sort: active pools first, then alphabetically
|
||||
.sort((a, b) => {
|
||||
if (a.active && !b.active) return -1;
|
||||
if (!a.active && b.active) return 1;
|
||||
return a.slug < b.slug ? -1 : 1;
|
||||
});
|
||||
|
||||
}),
|
||||
catchError(() => of([]))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
<div class="dropdown-menu show" *ngIf="results" [hidden]="!results.hashQuickMatch && !results.otherNetworks.length && !results.addresses.length && !results.nodes.length && !results.channels.length && !results.liquidAsset.length">
|
||||
<div class="dropdown-menu show" *ngIf="results" [hidden]="!results.hashQuickMatch && !results.otherNetworks.length && !results.addresses.length && !results.nodes.length && !results.channels.length && !results.liquidAsset.length && !results.pools.length">
|
||||
<ng-template [ngIf]="results.blockHeight">
|
||||
<div class="card-title" i18n="search.bitcoin-block-height">{{ networkName }} Block Height</div>
|
||||
<button (click)="clickItem(0)" [class.active]="0 === activeIdx" type="button" role="option" class="dropdown-item">
|
||||
@ -67,6 +67,14 @@
|
||||
</button>
|
||||
</ng-template>
|
||||
</ng-template>
|
||||
<ng-template [ngIf]="results.pools.length">
|
||||
<div class="card-title" i18n="search.mining-pools">Mining Pools</div>
|
||||
<ng-template ngFor [ngForOf]="results.pools" let-pool let-i="index">
|
||||
<button (click)="clickItem(results.hashQuickMatch + results.otherNetworks.length + results.addresses.length + results.nodes.length + results.channels.length + i)" [class.active]="results.hashQuickMatch + results.otherNetworks.length + results.addresses.length + results.nodes.length + results.channels.length + i === activeIdx" [class.inactive]="!pool.active" type="button" role="option" class="dropdown-item">
|
||||
<ngb-highlight [result]="pool.name" [term]="results.searchText"></ngb-highlight>
|
||||
</button>
|
||||
</ng-template>
|
||||
</ng-template>
|
||||
<ng-template [ngIf]="results.liquidAsset.length">
|
||||
<div class="card-title" i18n="search.liquid-asset">Liquid Asset</div>
|
||||
<button (click)="clickItem(0)" [class.active]="0 === activeIdx" type="button" role="option" class="dropdown-item">
|
||||
|
@ -22,3 +22,7 @@
|
||||
.inactive {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
.active {
|
||||
background-color: var(--active-bg);
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ export class SearchResultsComponent implements OnChanges {
|
||||
ngOnChanges() {
|
||||
this.activeIdx = 0;
|
||||
if (this.results) {
|
||||
this.resultsFlattened = [...(this.results.hashQuickMatch ? [this.results.searchText] : []), ...this.results.otherNetworks, ...this.results.addresses, ...this.results.nodes, ...this.results.channels];
|
||||
this.resultsFlattened = [...(this.results.hashQuickMatch ? [this.results.searchText] : []), ...this.results.otherNetworks, ...this.results.addresses, ...this.results.nodes, ...this.results.channels, ...this.results.pools];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -253,7 +253,8 @@ export class ApiService {
|
||||
)
|
||||
.pipe(
|
||||
map((response) => {
|
||||
response.body.pools.forEach((pool) => {
|
||||
const pools = interval !== undefined ? response.body.pools : response.body;
|
||||
pools.forEach((pool) => {
|
||||
if (pool.poolUniqueId === 0) {
|
||||
pool.name = $localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user