autowp/autowp-frontend

View on GitHub
src/app/catalogue/mixed/gallery/gallery.component.ts

Summary

Maintainability
A
0 mins
Test Coverage
import {AsyncPipe} from '@angular/common';
import {ChangeDetectionStrategy, Component, inject} from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router';
import {APIItem, ItemFields, ItemListOptions, ItemsRequest, Picture} from '@grpc/spec.pb';
import {ItemsClient} from '@grpc/spec.pbsc';
import {LanguageService} from '@services/language';
import {PageEnvService} from '@services/page-env.service';
import {EMPTY, Observable, of} from 'rxjs';
import {debounceTime, distinctUntilChanged, map, switchMap} from 'rxjs/operators';
 
import {GalleryComponent} from '../../../gallery/gallery.component';
import {BrandPerspectivePageData} from '../../catalogue.module';
 
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [GalleryComponent, AsyncPipe],
selector: 'app-catalogue-mixed-gallery',
templateUrl: './gallery.component.html',
})
export class CatalogueMixedGalleryComponent {
readonly #pageEnv = inject(PageEnvService);
readonly #route = inject(ActivatedRoute);
readonly #router = inject(Router);
readonly #itemsClient = inject(ItemsClient);
readonly #languageService = inject(LanguageService);
 
protected readonly identity$: Observable<string> = this.#route.paramMap.pipe(
map((route) => route.get('identity') || ''),
distinctUntilChanged(),
debounceTime(10),
switchMap((identity) => {
if (!identity) {
this.#router.navigate(['/error-404'], {
skipLocationChange: true,
});
return EMPTY;
}
 
return of(identity);
}),
);
 
protected readonly brand$: Observable<APIItem> = this.#route.paramMap.pipe(
map((params) => params.get('brand')),
distinctUntilChanged(),
debounceTime(10),
switchMap((catname) => {
if (!catname) {
return EMPTY;
}
return this.#itemsClient.list(
new ItemsRequest({
fields: new ItemFields({
nameHtml: true,
nameText: true,
}),
language: this.#languageService.language,
limit: 1,
options: new ItemListOptions({
catname,
}),
}),
);
}),
map((response) => (response.items?.length ? response.items[0] : null)),
switchMap((brand) => {
if (!brand) {
this.#router.navigate(['/error-404'], {
skipLocationChange: true,
});
return EMPTY;
}
return of(brand);
}),
);
 
protected readonly data$ = this.#route.data as Observable<BrandPerspectivePageData>;
 
protected pictureSelected(data: BrandPerspectivePageData, item: null | Picture) {
if (item) {
setTimeout(() => {
this.#pageEnv.set({
layout: {isGalleryPage: true},
pageId: data.picture_page.id,
title: item.nameText,
});
}, 0);
}
}
}