File

feature-libs/product/variants/components/product-variants-container/product-variants-container.component.ts

Implements

OnInit

Metadata

changeDetection ChangeDetectionStrategy.OnPush
selector cx-product-variants-container
templateUrl ./product-variants-container.component.html

Index

Properties
Methods

Constructor

constructor(currentProductService: CurrentProductService)
Parameters :
Name Type Optional
currentProductService CurrentProductService No

Methods

ngOnInit
ngOnInit()
Returns : void

Properties

product$
Type : Observable<Product | null>
variants
Type : literal type
Default value : {}
variantType
Default value : VariantType
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import {
  BaseOption,
  isNotNullable,
  Product,
  RequiredPick,
  VariantType,
} from '@spartacus/core';
import { CurrentProductService } from '@spartacus/storefront';
import { Observable } from 'rxjs';
import { distinctUntilChanged, filter, tap } from 'rxjs/operators';

@Component({
  selector: 'cx-product-variants-container',
  templateUrl: './product-variants-container.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ProductVariantsContainerComponent implements OnInit {
  constructor(private currentProductService: CurrentProductService) {}

  variants: { [key: string]: BaseOption } = {};
  variantType = VariantType;
  product$: Observable<Product | null>;

  ngOnInit(): void {
    this.product$ = this.currentProductService.getProduct().pipe(
      filter(isNotNullable),
      filter(
        (product): product is RequiredPick<Product, 'baseOptions'> =>
          !!product.baseOptions
      ),
      distinctUntilChanged(),
      tap((product) => {
        product.baseOptions.forEach((option: BaseOption) => {
          if (option?.variantType) {
            this.variants[option.variantType] = option;
          }
        });
      })
    );
  }
}
<ng-container *ngIf="product$ | async as product">
  <div class="variant-section" *ngIf="product.baseOptions?.length">
    <cx-product-variant-style-selector
      *ngIf="variants[variantType.STYLE]"
      [variants]="variants[variantType.STYLE]"
    ></cx-product-variant-style-selector>
    <cx-product-variant-size-selector
      *ngIf="variants[variantType.SIZE]"
      [product]="product"
      [variants]="variants[variantType.SIZE]"
    ></cx-product-variant-size-selector>
    <cx-product-variant-color-selector
      *ngIf="variants[variantType.COLOR]"
      [product]="product"
      [variants]="variants[variantType.COLOR]"
    ></cx-product-variant-color-selector>
  </div>
</ng-container>
Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""