import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; import { QuantitySelectorComponent } from '../quantity-selector/quantity-selector.component'; import { IconButtonComponent } from '../icon-button/icon-button.component'; import { VariantSelectorComponent, VariantSelectorVariant, } from '../variant-selector/variant-selector.component'; export interface CartItemAttribute { label: string; value: string; } @Component({ selector: 'app-cart-item', standalone: true, imports: [QuantitySelectorComponent, IconButtonComponent, VariantSelectorComponent], templateUrl: './cart-item.component.html', styleUrl: './cart-item.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, }) export class CartItemComponent { readonly imageUrl = input(null); readonly product = input(''); readonly originalPrice = input(null); readonly discountedPrice = input(0); readonly discountPercentage = input(null); readonly attributes = input([]); readonly variants = input([]); readonly selectedVariant = input(null); readonly quantity = input(1); readonly readonly = input(false); readonly quantityDisabled = input(false); readonly variantDisabled = input(false); readonly removeDisabled = input(false); readonly allowDelete = input(true); readonly quantityChange = output(); readonly remove = output(); readonly increase = output(); readonly decrease = output(); readonly variantChange = output(); protected readonly hasVariantSelectors = computed(() => this.variants().some((variant) => Object.keys(variant.values).length > 0), ); protected onQuantityChange(newQuantity: number): void { if (this.quantityDisabled()) return; this.quantityChange.emit(newQuantity); } protected onRemove(): void { this.remove.emit(); } protected onIncrease(): void { this.increase.emit(); } protected onDecrease(): void { this.decrease.emit(); } protected onVariantChange(variant: unknown): void { if (!this.variantDisabled() && typeof variant === 'number') { this.variantChange.emit(variant); } } protected readonly formattedOriginalPrice = computed(() => { const price = this.originalPrice(); return price === null ? null : this.formatCurrency(price); }); protected readonly formattedDiscountedPrice = computed(() => this.formatCurrency(this.discountedPrice()), ); private formatCurrency(value: number): string { const rounded = Math.round(value); const parts = rounded.toString().split('.'); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, '.'); return `$ ${parts.join(',')}`; } }