import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, OnDestroy, Output } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators'; @Component({ selector: 'header-search', template: ` {{ i }} `, changeDetection: ChangeDetectionStrategy.OnPush }) export class HeaderSearchComponent implements AfterViewInit, OnDestroy { q = ''; qIpt: HTMLInputElement | null = null; options: string[] = []; search$ = new BehaviorSubject(''); loading = false; @HostBinding('class.alain-default__search-focus') focus = false; @HostBinding('class.alain-default__search-toggled') searchToggled = false; @Input() set toggleChange(value: boolean) { if (typeof value === 'undefined') { return; } this.searchToggled = value; this.focus = value; if (value) { setTimeout(() => this.qIpt!.focus()); } } @Output() readonly toggleChangeChange = new EventEmitter(); constructor(private el: ElementRef, private cdr: ChangeDetectorRef) {} ngAfterViewInit(): void { this.qIpt = this.el.nativeElement.querySelector('.ant-input') as HTMLInputElement; this.search$ .pipe( debounceTime(500), distinctUntilChanged(), tap({ complete: () => { this.loading = true; } }) ) .subscribe(value => { this.options = value ? [value, value + value, value + value + value] : []; this.loading = false; this.cdr.detectChanges(); }); } qFocus(): void { this.focus = true; } qBlur(): void { this.focus = false; this.searchToggled = false; this.options.length = 0; this.toggleChangeChange.emit(false); } search(ev: Event): void { this.search$.next((ev.target as HTMLInputElement).value); } ngOnDestroy(): void { this.search$.complete(); this.search$.unsubscribe(); } }