2022-02-06 03:31:50 +04:00
|
|
|
import { Component, OnInit, ViewChild } from '@angular/core';
|
2022-02-06 01:20:26 +04:00
|
|
|
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
2022-02-06 03:31:50 +04:00
|
|
|
import { Router } from '@angular/router';
|
|
|
|
import { NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';
|
|
|
|
import { merge, Observable, of, Subject } from 'rxjs';
|
|
|
|
import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';
|
|
|
|
import { AssetExtended } from 'src/app/interfaces/electrs.interface';
|
|
|
|
import { AssetsService } from 'src/app/services/assets.service';
|
|
|
|
import { SeoService } from 'src/app/services/seo.service';
|
|
|
|
import { StateService } from 'src/app/services/state.service';
|
|
|
|
import { RelativeUrlPipe } from 'src/app/shared/pipes/relative-url/relative-url.pipe';
|
|
|
|
import { environment } from 'src/environments/environment';
|
2022-02-06 01:20:26 +04:00
|
|
|
|
|
|
|
@Component({
|
|
|
|
selector: 'app-assets-nav',
|
|
|
|
templateUrl: './assets-nav.component.html',
|
|
|
|
styleUrls: ['./assets-nav.component.scss']
|
|
|
|
})
|
|
|
|
export class AssetsNavComponent implements OnInit {
|
2022-02-06 03:31:50 +04:00
|
|
|
@ViewChild('instance', {static: true}) instance: NgbTypeahead;
|
|
|
|
nativeAssetId = this.stateService.network === 'liquidtestnet' ? environment.nativeTestAssetId : environment.nativeAssetId;
|
2022-02-06 01:20:26 +04:00
|
|
|
searchForm: FormGroup;
|
2022-02-06 03:31:50 +04:00
|
|
|
assetsCache: AssetExtended[];
|
|
|
|
|
|
|
|
typeaheadSearchFn: ((text: Observable<string>) => Observable<readonly any[]>);
|
|
|
|
formatterFn = (asset: AssetExtended) => asset.name + ' (' + asset.ticker + ')';
|
|
|
|
focus$ = new Subject<string>();
|
|
|
|
click$ = new Subject<string>();
|
|
|
|
|
|
|
|
itemsPerPage = 15;
|
2022-02-06 01:20:26 +04:00
|
|
|
|
|
|
|
constructor(
|
|
|
|
private formBuilder: FormBuilder,
|
2022-02-06 03:31:50 +04:00
|
|
|
private seoService: SeoService,
|
|
|
|
private router: Router,
|
|
|
|
private assetsService: AssetsService,
|
|
|
|
private stateService: StateService,
|
|
|
|
private relativeUrlPipe: RelativeUrlPipe,
|
2022-02-06 01:20:26 +04:00
|
|
|
) { }
|
|
|
|
|
|
|
|
ngOnInit(): void {
|
2022-02-06 03:31:50 +04:00
|
|
|
this.typeaheadSearchFn = this.typeaheadSearch;
|
|
|
|
|
2022-02-06 01:20:26 +04:00
|
|
|
this.searchForm = this.formBuilder.group({
|
2022-02-06 03:31:50 +04:00
|
|
|
searchText: [{ value: '', disabled: false }, Validators.required]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
typeaheadSearch = (text$: Observable<string>) => {
|
|
|
|
const debouncedText$ = text$.pipe(
|
|
|
|
distinctUntilChanged()
|
|
|
|
);
|
|
|
|
const clicksWithClosedPopup$ = this.click$.pipe(filter(() => !this.instance.isPopupOpen()));
|
|
|
|
const inputFocus$ = this.focus$;
|
|
|
|
|
|
|
|
return merge(debouncedText$, inputFocus$, clicksWithClosedPopup$)
|
|
|
|
.pipe(
|
|
|
|
switchMap((searchText) => {
|
|
|
|
if (!searchText.length) {
|
|
|
|
return of([]);
|
|
|
|
}
|
|
|
|
return this.assetsService.getAssetsJson$.pipe(
|
|
|
|
map((assets) => {
|
|
|
|
if (searchText.length ) {
|
|
|
|
const filteredAssets = assets.filter((asset) => asset.name.toLowerCase().indexOf(searchText.toLowerCase()) > -1
|
|
|
|
|| (asset.ticker || '').toLowerCase().indexOf(searchText.toLowerCase()) > -1
|
|
|
|
|| (asset.entity && asset.entity.domain || '').toLowerCase().indexOf(searchText.toLowerCase()) > -1);
|
|
|
|
assets = filteredAssets;
|
|
|
|
return filteredAssets.slice(0, this.itemsPerPage);
|
|
|
|
} else {
|
|
|
|
return assets.slice(0, this.itemsPerPage);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
itemSelected() {
|
|
|
|
setTimeout(() => this.search());
|
|
|
|
}
|
|
|
|
|
|
|
|
search() {
|
|
|
|
const searchText = this.searchForm.value.searchText;
|
|
|
|
this.navigate('/assets/asset/', searchText.asset_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
navigate(url: string, searchText: string, extras?: any) {
|
|
|
|
this.router.navigate([this.relativeUrlPipe.transform(url), searchText], extras);
|
|
|
|
this.searchForm.setValue({
|
|
|
|
searchText: '',
|
2022-02-06 01:20:26 +04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|