Files
marketplaces/src/app/components/items-carousel/items-carousel.component.ts

108 lines
3.2 KiB
TypeScript
Raw Normal View History

2026-02-19 01:23:25 +04:00
import { Component, OnInit, signal, ChangeDetectionStrategy } from '@angular/core';
import { DecimalPipe } from '@angular/common';
2026-01-18 18:57:06 +04:00
import { RouterLink } from '@angular/router';
import { CarouselModule } from 'primeng/carousel';
import { ButtonModule } from 'primeng/button';
import { TagModule } from 'primeng/tag';
import { ApiService, CartService } from '../../services';
import { Item } from '../../models';
import { environment } from '../../../environments/environment';
2026-02-19 01:23:25 +04:00
import { getDiscountedPrice, getMainImage } from '../../utils/item.utils';
2026-02-26 22:23:08 +04:00
import { LangRoutePipe } from '../../pipes/lang-route.pipe';
2026-01-18 18:57:06 +04:00
@Component({
selector: 'app-items-carousel',
templateUrl: './items-carousel.component.html',
2026-02-26 22:23:08 +04:00
imports: [DecimalPipe, RouterLink, CarouselModule, ButtonModule, TagModule, LangRoutePipe],
2026-02-19 01:23:25 +04:00
styleUrls: ['./items-carousel.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
2026-01-18 18:57:06 +04:00
})
export class ItemsCarouselComponent implements OnInit {
products = signal<Item[]>([]);
loading = signal(true);
isnovo = environment.theme === 'novo';
2026-02-26 21:54:21 +04:00
responsiveOptions: { breakpoint: string; numVisible: number; numScroll: number }[] | undefined;
2026-01-18 18:57:06 +04:00
constructor(
private apiService: ApiService,
private cartService: CartService
) {}
ngOnInit() {
this.apiService.getRandomItems(10).subscribe({
next: (items) => {
this.products.set(items);
this.loading.set(false);
},
error: () => {
this.loading.set(false);
}
});
this.responsiveOptions = [
{
breakpoint: '1400px',
2026-01-18 19:44:46 +04:00
numVisible: 5,
2026-01-18 18:57:06 +04:00
numScroll: 1
},
{
breakpoint: '1199px',
numVisible: 4,
numScroll: 1
},
2026-01-18 19:44:46 +04:00
{
breakpoint: '991px',
numVisible: 3,
numScroll: 1
},
2026-01-18 18:57:06 +04:00
{
breakpoint: '767px',
numVisible: 2,
numScroll: 1
},
{
breakpoint: '575px',
numVisible: 1,
numScroll: 1
}
];
}
2026-02-26 21:54:21 +04:00
getSeverity(remainings: string): 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast' {
2026-01-18 18:57:06 +04:00
switch (remainings) {
case 'high':
return 'success';
case 'low':
return 'warn';
case 'out':
return 'danger';
default:
return 'success';
}
}
getInventoryStatus(remainings: string): string {
switch (remainings) {
case 'high':
return 'INSTOCK';
case 'low':
return 'LOWSTOCK';
case 'out':
return 'OUTOFSTOCK';
default:
return 'INSTOCK';
}
}
2026-02-19 01:23:25 +04:00
readonly getItemImage = getMainImage;
readonly getDiscountedPrice = getDiscountedPrice;
2026-01-18 18:57:06 +04:00
2026-01-18 19:44:46 +04:00
addToCart(event: Event, item: Item): void {
event.preventDefault();
event.stopPropagation();
2026-01-18 18:57:06 +04:00
this.cartService.addItem(item.itemID, 1);
}
}