File

src/converter/link-factory/fs-product-link.ts

Description

This class represents a link and allows the creation of product links.

Implements

FsLinkFactoryInterface

Index

Methods

Constructor

constructor(link: FsProductLinkTemplate, productService: ProductService)
Parameters :
Name Type Optional
link FsProductLinkTemplate No
productService ProductService No

Methods

Public create
create()
Returns : LinkData
Private createProductLink
createProductLink(productCode: string, ltTooltipText: CmsInputTextFormData)
Parameters :
Name Type Optional
productCode string No
ltTooltipText CmsInputTextFormData No
Returns : LinkData
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 { Product, ProductService } from '@spartacus/core';
import { nullSafe } from 'fs-spartacus-common';
import { Observable } from 'rxjs';
import { CmsInputTextFormData, FsIndexFormData, LinkData } from '../teaser/fs-teaser.model';
import { FsLinkFactoryInterface, FsProductLinkTemplate } from './fs-link.model';

/**
 * This class represents a link and allows the creation of product links.
 *
 * @export
 * @class FsProductLink
 */
export class FsProductLink implements FsLinkFactoryInterface<LinkData> {
  constructor(private link: FsProductLinkTemplate, private productService: ProductService) {}

  public create(): LinkData {
    if (this.link?.formData != null) {
      const { lt_product, lt_tooltip_text } = this.link.formData;
      const productCode = this.extractProductCode(lt_product);
      if (productCode) {
        return this.createProductLink(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 createProductLink(productCode: string, ltTooltipText: CmsInputTextFormData): LinkData {
    return {
      href: undefined,
      product: this.getProduct(productCode),
      tooltip: nullSafe(ltTooltipText?.value, ''),
    };
  }

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

results matching ""

    No results matching ""