File

src/converter/teaser/fs-teaser-product-link-overlay.ts

Description

This class is a factory to create product links from a ProductLinkTemplate.

Implements

FsTeaserOverlayFactoryInterface

Index

Methods

Constructor

constructor(area: ProductLinkTemplate, positionAndDimension, productService: ProductService)
Parameters :
Name Type Optional
area ProductLinkTemplate No
positionAndDimension No
productService ProductService No

Methods

Public create
create()
Returns : OverlayLink
Private createProductLinkOverlay
createProductLinkOverlay(productCode: string, ltTooltipText: CmsInputTextFormData)
Parameters :
Name Type Optional
productCode string No
ltTooltipText CmsInputTextFormData No
Returns : OverlayLink
Private extractProductCode
extractProductCode(productInputComponent: FsIndexFormData)
Parameters :
Name Type Optional
productInputComponent FsIndexFormData No
Returns : string | undefined
Private extractProductIdentifier
extractProductIdentifier(productInputComponent: FsIndexFormData)
Parameters :
Name Type Optional
productInputComponent FsIndexFormData No
Returns : string | undefined
Private getProduct
getProduct(productCode: string | undefined)
Parameters :
Name Type Optional
productCode string | undefined No
Returns : Observable<Product>
Private stripCatalogFromProductIdentifier
stripCatalogFromProductIdentifier(productIdentifier: string)
Parameters :
Name Type Optional
productIdentifier string No
Returns : any
import {
  CmsInputTextFormData,
  FsIndexFormData,
  FsTeaserOverlayFactoryInterface,
  OverlayDimension,
  OverlayLink,
  OverlayPosition,
  ProductLinkTemplate,
} from './fs-teaser.model';
import { nullSafe } from 'fs-spartacus-common';
import { ProductService, Product } from '@spartacus/core';
import { Observable } from 'rxjs';

/**
 * This class is a factory to create product links from a {@link ProductLinkTemplate}.
 *
 * @export
 * @class FsTeaserProductLinkOverlay
 */
export class FsTeaserProductLinkOverlay implements FsTeaserOverlayFactoryInterface<OverlayLink> {
  constructor(
    private area: ProductLinkTemplate,
    private positionAndDimension: OverlayPosition & OverlayDimension,
    private productService: ProductService
  ) {}

  public create(): OverlayLink {
    if (this.area?.link?.formData != null) {
      const { lt_product, lt_tooltip_text } = this.area.link.formData;
      const productCode = this.extractProductCode(lt_product);
      if (productCode) {
        return this.createProductLinkOverlay(productCode, lt_tooltip_text);
      }
    }
  }

  private extractProductCode(productInputComponent: FsIndexFormData): string | undefined {
    const productIdentifier = this.extractProductIdentifier(productInputComponent);
    if (productIdentifier) {
      return this.stripCatalogFromProductIdentifier(productIdentifier);
    }
  }

  private extractProductIdentifier(productInputComponent: FsIndexFormData): string | undefined {
    return (
      productInputComponent &&
      Array.isArray(productInputComponent.value) &&
      productInputComponent.value.length &&
      productInputComponent.value[0].identifier
    );
  }

  private stripCatalogFromProductIdentifier(productIdentifier: string) {
    const identifierParts = productIdentifier.split('/').filter(Boolean);
    if (identifierParts.length === 2) {
      return identifierParts[1];
    }
  }

  private createProductLinkOverlay(productCode: string, ltTooltipText: CmsInputTextFormData): OverlayLink {
    return {
      href: undefined,
      product: this.getProduct(productCode),
      tooltip: nullSafe(ltTooltipText?.value, ''),
      ...this.positionAndDimension,
    };
  }

  private getProduct(productCode: string | undefined): Observable<Product> {
    if (productCode != null && productCode.length > 0) {
      return this.productService.get(productCode);
    }
  }
}

results matching ""

    No results matching ""